๋ถ๋ฅ:ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
Verilog์์ ๋์ด์ด
ํ๋์จ์ด ๊ธฐ์ ์ธ์ด(HDL) | |
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์ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ ํด๋ญ์ ์๋ฎฌ๋ ์ด์ ์์ ๋ง๋ค ์ ์๋ค.
8๋นํธ ๋ค์ด ์นด์ดํฐ ์
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]
์ดํ 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'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] ์ด๊ฒ๋ ์ด์ฌ์์ ๊ฒฝ์ฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๊ฐ์น๋ ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.