์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
Verilog์—์„œ ๋„˜์–ด์˜ด
ํ•˜๋“œ์›จ์–ด ๊ธฐ์ˆ  ์–ธ์–ด(HDL)




1. ๊ฐœ์š”2. ์—ญ์‚ฌ3. ์˜ˆ์ œ
3.1. ์กฐํ•ฉ ๋…ผ๋ฆฌ(Combinational Logic)3.2. ์ˆœ์ฐจ ๋…ผ๋ฆฌ(Sequential Logic)
4. ๋ฌธ๋ฒ•
4.1. ์ƒ์ˆ˜4.2. ์—ฐ์‚ฐ์ž4.3. ์‹œ์Šคํ…œ ํƒœ์Šคํฌ(System tasks)4.4. ๋ฐ˜๋ณต๋ฌธ

1. ๊ฐœ์š”[ํŽธ์ง‘]

๋ฒ ๋ฆด๋กœ๊ทธ(Verilog)๋Š” ์ „์ž ํšŒ๋กœ ๋ฐ ์‹œ์Šคํ…œ์— ์“ฐ์ด๋Š” ํ•˜๋“œ์›จ์–ด ๊ธฐ์ˆ  ์–ธ์–ด(HDL, Hardware Description Language)๋‹ค. ๋ฒ ๋ฆด๋กœ๊ทธ HDL์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์œผ๋‚˜, ์ด ๊ฒฝ์šฐ VHDL๊ณผ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ ๋ฆด๋กœ๊ทธ๋ผ๊ณ ๋งŒ ๋ถ€๋ฅธ๋‹ค. ํšŒ๋กœ ์„ค๊ณ„, ๊ฒ€์ฆ, ๊ตฌํ˜„ ๋“ฑ ์—ฌ๋Ÿฌ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค. VHDL์€ ๊ณผ๊ฑฐ์—๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ ์ง€๊ธˆ์€ ๋Œ€๋ถ€๋ถ„ ๋ฒ ๋ฆด๋กœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋””์ž์ธ ํ•œ๋‹ค. ํ†ต๊ณ„์ ์œผ๋กœ๋Š” ์œ ๋Ÿฝ์„ ์ œ์™ธํ•˜๋ฉด ๋ฒ ๋ฆด๋กœ๊ทธ์˜ ์ ์œ ์œจ์ด VHDL์„ ์••๋„ํ•˜์˜€๋‹ค.

Ada๊ธฐ๋ฐ˜์ธ VHDL๊ณผ ๋‹ฌ๋ฆฌ C์–ธ์–ด์™€ ๋น„์Šทํ•œ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง„ ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค. 'if'๋‚˜ 'for', 'while' ๊ฐ™์€ ์ œ์–ด ๊ตฌ์กฐ๋„ ๋™์ผํ•˜๋ฉฐ, ์ถœ๋ ฅ ๋ฃจํ‹ด ๋ฐ ์—ฐ์‚ฐ์ž๋“ค๋„ ๊ฑฐ์˜ ๋น„์Šทํ•œ ๊ฒƒ ๋“ฑ ์‚ฌ์šฉ์ž๋“ค์ด ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, case๋ฌธ์˜ ํ˜•ํƒœ์™€ ๋ธ”๋ก์˜ ์‹œ์ž‘๊ณผ ๋์„ ์ค‘๊ด„ํ˜ธ ๋Œ€์‹  Begin๊ณผ End๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํŒŒ์Šค์นผ(Pascal)์–ธ์–ด์™€ ์œ ์‚ฌํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„์™€ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์—๋Š” ๋ณธ์งˆ์ ์ธ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋ฒ•์ด ๋น„์Šทํ•˜๋‹ค๊ณ  C์–ธ์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋“ฏ์ด ๋ฒ ๋ฆด๋กœ๊ทธ๋ฅผ ์งœ๊ฒŒ ๋˜๋ฉด ์—‰ํ„ฐ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. HDL์— ์ž…๋ฌธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ด ๊ณ ์ƒํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ, ๋””์ง€ํ„ธ ํšŒ๋กœ์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ์ง€์‹์„ ๊ฐ–๊ณ , ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ํ•˜๋“œ์›จ์–ด๋กœ ์–ด๋–ป๊ฒŒ ํ•ฉ์„ฑ๋ ์ง€์— ๋Œ€ํ•œ ๊ฐ์„ ํ‚ค์›Œ๋‚˜๊ฐ€์•ผ ํ•œ๋‹ค.

HDL์ด ์ผ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ํฌ๊ฒŒ ๋‹ค๋ฅธ ์ ์€ ์‹œ๊ฐ„, ํด๋Ÿญ์œผ๋กœ ๋Œ€ํ‘œ๋˜๋Š” ์ด๋ฒคํŠธ, ์•„์ฃผ ์ž‘์€ ํ”„๋กœ์„ธ์Šค ๊ฐœ๋…์ด๋ฉฐ, ๊ฐ๊ฐ #, @, fork/join ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋กœ ์ง€์›ํ•œ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด 10์˜ ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋Š” ํด๋Ÿญ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

initial clk = 0;
always #5 clk = ~clk;


8๋น„ํŠธ ๋‹ค์šด ์นด์šดํ„ฐ ์˜ˆ

module counter (clk, load, Q);
   parameter WIDTH = 8;
   input    clk;
   input    load;
   output   [WIDTH-1:0]   Q;
   reg      [WIDTH-1:0]   cnt;

   always @(posedge clk) begin
      if (load)
         cnt <= {WIDTH{1โ€™b1}};
      else
         cnt <= cnt - 1โ€™b1;
   end

   assign Q = cnt;

endmodule

2. ์—ญ์‚ฌ[ํŽธ์ง‘]

๋ณธ๋ž˜๋Š” Phil Moorby๊ฐ€ ๋ชจ์˜์‹œํ—˜์šฉ ์–ธ์–ด๋กœ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค. ์ดํ›„ Cadence Systems์— ์ธ์ˆ˜๋˜์–ด ์—…๊ณ„ํ‘œ์ค€ HDL๋กœ ์ž๋ฆฌ๋ฅผ ์žก์•˜๋‹ค.
์ดํ›„ 95๋…„ IEEEํ‘œ์ค€์ด ๋งŒ๋“ค์–ด์กŒ๊ณ , 2001๋…„ ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ๋‹ค(Verilog-2001). ๊ทธ๋Ÿฌ๋‚˜ ๋””์ง€ํ„ธ ์‹œ์Šคํ…œ์˜ ์„ค๊ณ„์—์„œ ๊ฒ€์ฆ์˜ ํ•„์š”์„ฑ์ด ์ปค์ง์— ๋”ฐ๋ผ ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋Œ€์ ์ธ ํ™•์žฅ์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด 2005๋…„ SystemVerilog๊ฐ€ IEEE ํ‘œ์ค€์œผ๋กœ ๋งŒ๋“ค์–ด ์กŒ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ SystemVerilog๋Š” ๊ฒ€์ฆ์šฉ ํ…Œ์ŠคํŠธ๋ฒค์น˜ ์ž‘์„ฑ์‹œ ์™ธ์—” ์‹ค์ œ ์—…๊ณ„์—์„œ๋Š” ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋ฐ, C์—์„œ ์“ฐ์ด๋Š” enum, class, struct, union๋“ฑ์˜ data type์€ ์‹ค์ œ ํ•˜๋“œ์›จ์–ด ํ•ฉ์„ฑ์‹œ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋‚˜์˜ค๊ฒŒ ๋  netlist[1]๋ฅผ ์ง๊ด€์ ์œผ๋กœ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ํ•˜๊ณ  ํˆด ๊ฐ„์— ๋ฌธ๋ฒ• ํ•ด์„ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ netlist ๊ธฐ๋ฐ˜์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ† ๋Œ€๋กœ RTL[2] ๋””๋ฒ„๊น…์„ ํ•˜๊ธฐ ์ƒ๋‹นํžˆ ๊นŒ๋‹ค๋กœ์›Œ์ง„๋‹ค. ๋ฌผ๋ก  ๋ฒ ๋ฆด๋กœ๊ทธ์˜ wire, reg data type๋„ ์†Œ์Šค์ฝ”๋“œ์— ์„ ์–ธ๋œ ๊ทธ๋Œ€๋กœ wire์™€ register๋กœ ํ•ฉ์„ฑ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ SystemVerilog์˜ ์ถ”์ƒํ™”์— ๋น„ํ•˜๋ฉด ์‚ฌ์‹ค์ƒ ํ•˜๋“œ์›จ์–ด์— ๋งค์šฐ ๊ฐ€๊นŒ์šด ํŽธ์ด๋ผ ์†Œ์Šค์ฝ”๋“œ์— ์กด์žฌํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ์ฐพ๋”๋ผ๋„ netlist๋ฅผ ์ง์ ‘ ๊ณ ์น˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ •๋„. ๋˜ํ•œ SystemVerilog๋Š” ํˆด์ฒด์ธ์—์„œ ์ง€์›์„ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”๋”์šฑ ์‚ฌ์šฉ๋„๊ฐ€ ๋–จ์–ด์ง„๋‹ค.[3]

3. ์˜ˆ์ œ[ํŽธ์ง‘]

3.1. ์กฐํ•ฉ ๋…ผ๋ฆฌ(Combinational Logic)[ํŽธ์ง‘]

3.2. ์ˆœ์ฐจ ๋…ผ๋ฆฌ(Sequential Logic)[ํŽธ์ง‘]


   module flip_flop(input clk, input d, output reg q);

   always @(posedge clk) begin
      q <= d;
   end
   
   endmodule


non-blockinig assignment์ธ <=๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

4. ๋ฌธ๋ฒ•[ํŽธ์ง‘]

4.1. ์ƒ์ˆ˜[ํŽธ์ง‘]

[bit ์ˆ˜]'[์ง„์ˆ˜][์ˆซ์ž]

4'b0110 - 4 bit ์ด์ง„์ˆ˜ 0110
32'd2020 - 32 bit ์‹ญ์ง„์ˆ˜ 2020
8'ha12 - 8 bit 16์ง„์ˆ˜ a12
16'o20 - 16 bit 8์ง„์ˆ˜ 20

4.2. ์—ฐ์‚ฐ์ž[ํŽธ์ง‘]


4.3. ์‹œ์Šคํ…œ ํƒœ์Šคํฌ(System tasks)[ํŽธ์ง‘]

๊ฐ„๋‹จํ•œ I/O ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜๋“ค๋กœ ์ฃผ๋กœ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ณผ์ •์—์„œ ํ™œ์šฉํ•œ๋‹ค. ๋‹ค๋ฅธ ํ•จ์ˆ˜์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์‹œ์Šคํ…œ ํƒœ์Šคํฌ๋Š” $๋ฅผ ์ ‘๋‘์‚ฌ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • $display
    ๋ฌธ์ž์—ด๊ณผ ์ง€์ •ํ•œ ์‹ ํ˜ธ์˜ ๊ฐ’์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค. ์ž๋™์œผ๋กœ ๊ฐœํ–‰๋œ๋‹ค.
    
        $display("Hello World!");
     
    
        $display("%b, %d", a, b);
     
  • $write
    ๊ธฐ๋Šฅ์€ $display์™€ ๋™์ผํ•˜๋‚˜ ๊ฐœํ–‰ ์—†์ด ์ถœ๋ ฅํ•œ๋‹ค.
  • $monitor
    ์ง€์ •ํ•œ ์‹ ํ˜ธ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.
  • $stop
    ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ค‘๋‹จํ•œ๋‹ค.
    $finish์™€ ๋‹ฌ๋ฆฌ control์ด ์—ฌ์ „ํžˆ simulator์— ์žˆ์œผ๋ฉฐ simulator๊ฐ€ Interative Mode๊ฐ€ ๋œ๋‹ค.
  • $finish
    ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ข…๋ฃŒํ•œ๋‹ค.
    $stop๊ณผ ๋‹ฌ๋ฆฌ control์ด OS๋กœ ๋Œ์•„์˜จ๋‹ค.
  • $time
    ํ˜„์žฌ์˜ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„
    
         $display($time);
     
  • $random
    ๋žœ๋ค๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    
         $display($random);
     

4.4. ๋ฐ˜๋ณต๋ฌธ[ํŽธ์ง‘]

๋ฒ ๋ฆด๋กœ๊ทธ์—์„œ๋Š” for, while์˜ ๋ฃจํ”„๋ฌธ์„ ์ง€์›ํ•˜์ง€๋งŒ ์ดˆ์‹ฌ์ž์˜ ๊ฒฝ์šฐ ํ…Œ์ŠคํŠธ๋ฒค์น˜ ์ž‘์„ฑ์„ ์œ„ํ•œ ๊ฒฝ์šฐ ๋ง๊ณ ๋Š” ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ฒ ๋ฆด๋กœ๊ทธ๋Š” ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•˜๋“œ์›จ์–ด ์ˆ˜์ค€์˜ ๊ตฌ์กฐ๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํ”„๋ฌธ์˜ ๋ฌด๋ถ„๋ณ„ํ•œ ์˜ค์šฉ์€ ํ•˜๋“œ์›จ์–ด์˜ ํ•ฉ์„ฑ ๊ณผ์ •์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๋ณด์ˆ˜์ ์ธ ์—”์ง€๋‹ˆ์–ด์˜ ๊ฒฝ์šฐ for๋ฌธ์˜ ์‚ฌ์šฉ ์ž์ฒด๋ฅผ ๊ธˆ๊ธฐ์‹œ ํ•˜๊ธฐ๋„ ํ•  ์ •๋„์ด๋‹ค. ๋”ฐ๋ผ์„œ ์„ค๊ณ„ํ•  ๋ฃจํ”„๋ฌธ์ด ํ•˜๋“œ์›จ์–ด๋กœ ํ•ฉ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ธ์ง€ ์ž˜ ๋”ฐ์ ธ๊ฐ€๋ฉด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค. ๋ฐ˜๋ณต๋ฌธ์ด ๋‹ค์ด๋‚˜๋ฏนํ•˜๋‹ค๋ฉด ๋‹น์—ฐํžˆ ํ•ฉ์„ฑ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ , ์ƒ๊ฐํ•˜๊ธฐ ํž˜๋“  ๋‹ค์–‘ํ•œ ํ•จ์ •๋“ค์ด ์กด์žฌํ•˜๋ฏ€๋กœ ๋‹จ์ˆœํ•œ ๊ทœ์น™์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ์ˆ˜์ค€์ด ์•„๋‹Œ[4], ๋ฃจํ”„ ๋ผ๋ฆฌ ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ์ด ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ธฐ๊ต๋ฅผ ๋ถ€๋ ค์„œ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
[1] ์‰ฝ๊ฒŒ ๋งํ•ด์„œ gate-level
[2] ๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ SystemVerilog ์†Œ์Šค์ฝ”๋“œ์— ํ•ด๋‹น
[3] ์นฉ์„ ์ œ๋Œ€๋กœ ํ•˜๋‚˜ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด, ๋‹จ์ˆœ ์„ค๊ณ„๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ์ข… ํ•ฉ์„ฑ๋ถ€ํ„ฐ ํ•ด์„œ backend์ž‘์—…๊นŒ์ง€ Pass๋ฅผ ์‹œ์ผœ์•ผ ๋˜๋Š”๋ฐ, ์ด backend ์ž‘์—…๋“ค ์ค‘์—์„œ SystemVerilog๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ถ”๊ฐ€ ๋ผ์ด์„ผ์Šค๋น„์šฉ์„ ๋‚ด๊ฒŒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
[4] ์ด๊ฒƒ๋„ ์ดˆ์‹ฌ์ž์˜ ๊ฒฝ์šฐ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ƒ๊ฐ์น˜๋„ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.