ย
๊ตฌ์กฐํ๋ ์ ์ฐจ
- Verilog์๋ ๋ ๊ฐ์ง ๊ตฌ์กฐํ๋ ์ ์ฐจ ๋ฌธ์ด ์์
always
์initial
์ ํ๋ ๋ชจ๋ธ๋ง์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ- ๋ค๋ฅธ ๋ชจ๋ ํ๋ ๋ฌธ์ ์ด๋ฌํ ๋ฌธ ์์์๋ง ๋ํ๋ ์ ์์
- C์ ๋ฌ๋ฆฌ Verilog๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์
- Verilog์์ ํ๋ ํ๋ฆ์ ์์ฐจ์ ์ด๊ธฐ๋ณด๋ค๋ ๋ณ๋ ฌ๋ก ์คํ๋จ
- ๊ฐ๊ฐ์ always์ initial ๋ฌธ์ Verilog์์ ๋ณ๊ฐ์ ํ๋์ ๋ํ๋
- ๊ฐ ํ๋ ํ๋ฆ์ ์๋ฎฌ๋ ์ด์ ์๊ฐ 0์์ ์์ํจ
- always์ initial ๋ฌธ์ ์ค์ฒฉ๋ ์ ์์
ย
initial ๋ฌธ
- initial ๋ธ๋ก์ ์๊ฐ 0์์ ์์ํ์ฌ ์๋ฎฌ๋ ์ด์ ์ค ํ ๋ฒ๋ง ์คํ๋๊ณ ๋ค์ ์คํ๋์ง ์์
- ์ฌ๋ฌ initial ๋ธ๋ก์ด ์๋ ๊ฒฝ์ฐ, ๊ฐ ๋ธ๋ก์ ์๊ฐ 0์์ ๋์์ ์คํ์ ์์ํจ
- ๊ฐ ๋ธ๋ก์ ๋ค๋ฅธ ๋ธ๋ก๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ์ ์๋ฃํจ
module stimulus; reg x, y, a, b, mi initial m = 1'b0; // ๋จ์ผ ๋ฌธ์ฅ; ๊ทธ๋ฃนํํ ํ์๊ฐ ์์ initial begin #5 a = 1'b1; // ์ฌ๋ฌ ๋ฌธ์ฅ๋ค์ ๊ทธ๋ฃนํ๋์ด์ผ ํจ #25 b = 1'b0; end initial begin #10 x = 1'b0; #25 y = 1'b1; end initial #50 $finish; // 50๋๋ ธ์ด ํ ์๋ฎฌ๋ ์ด์ ์ข ๋ฃ endmodule
- ๋ณ์ ์ ์ธ๊ณผ ์ด๊ธฐํ ๊ฒฐํฉ
// clock ๋ณ์๊ฐ ๋จผ์ ์ ์๋จ reg clock; // clock์ ๊ฐ์ด 0์ผ๋ก ์ค์ ๋จ initial clock = 0; // ์์ ๋ฐฉ๋ฒ ๋์ , clock ๋ณ์๋ ์ ์ธ ์ ์ด๊ธฐํ๋ ์ ์์ // ์ด๊ฒ์ ๋ชจ๋ ๋ ๋ฒจ์์ ์ ์ธ๋ ๋ณ์์๋ง ํ์ฉ๋จ reg clock = 0;
- ํฌํธ/๋ฐ์ดํฐ ์ ์ธ ๋ฐ ์ด๊ธฐํ ๊ฒฐํฉ
module adder (sum, co, a, b, ci); output reg [7:0] sum = 0; // 8๋นํธ ์ถ๋ ฅ ํฉ๊ณ ์ด๊ธฐํ output reg co = 0; // 1๋นํธ ์ถ๋ ฅ co ์ด๊ธฐํ input [7:0] a, b; // 8๋นํธ ์ ๋ ฅ a, b input ci; // ์ ๋ ฅ ci // ... endmodule
- ANSI C ์คํ์ผ ํฌํธ ์ ์ธ ๋ฐ ์ด๊ธฐํ ๊ฒฐํฉ
module adder ( output reg [7:0] sum = 0, // 8๋นํธ ์ถ๋ ฅ sum ์ด๊ธฐํ output reg co = 0, // 1๋นํธ ์ถ๋ ฅ co ์ด๊ธฐํ input [7:0] a, b, // 8๋นํธ ์ ๋ ฅ a, b input ci // ์ ๋ ฅ ci ); // ... (์ดํ ์ฝ๋ ์๋ต) endmodule
ย
always ๋ฌธ
- always ๋ฌธ์ ์๊ฐ 0์์ ์์ํ์ฌ always ๋ธ๋ก ๋ด์ ๋ฌธ์ ๊ณ์ํด์ ๋ฃจํ ํํ๋ก ์คํํจ
- ์ด ๋ฌธ์ ๋์งํธ ํ๋ก์์ ๋ฐ๋ณต์ ์ผ๋ก ์ํ๋๋ ํ๋ ๋ธ๋ก์ ๋ชจ๋ธ๋งํ๋ ๋ฐ ์ฌ์ฉ๋จ
- ์: ํด๋ญ ์์ฑ๊ธฐ
- ์๊ฐ 0์์ ์์ํ์ฌ ๋งค 10 ์๊ฐ ๋จ์๋ง๋ค โclock = ~clockโ์ ์คํํจ
- ์ด๊ธฐํ์ ์๋ฎฌ๋ ์ด์ ์ข ๋ฃ๋ initial ๋ฌธ ์์ ์์ด์ผ ํจ
module clock_gen (output reg clock); // ์๊ฐ 0์์ ํด๋ก ์ด๊ธฐํ initial clock = 1'b0; // ๋งค ๋ฐ ์ฃผ๊ธฐ๋ง๋ค ํด๋ก ํ ๊ธ (์๊ฐ ์ฃผ๊ธฐ = 20) always #10 clock = ~clock; initial #1000 $finish; // 1000ns ํ ์๋ฎฌ๋ ์ด์ ์ข ๋ฃ endmodule
- C ํ๋ก๊ทธ๋๋จธ๋ค์ always ๋ธ๋ก๊ณผ ๋ฌดํ ๋ฃจํ ์ฌ์ด์ ์ ์ฌ์ฑ์ ์ฐพ์ ์ ์์
ย
์ ์ฐจ์ ํ ๋น
- ์ ์ฐจ์ ํ ๋น์ reg, integer, real ๋๋ time ๋ณ์์ ๊ฐ์ ์ ๋ฐ์ดํธํจ
- ๋ณ์์ ๋ฐฐ์น๋ ๊ฐ์ ๋ค๋ฅธ ์ ์ฐจ์ ํ ๋น์ด ๋ณ์์ ๋ค๋ฅธ ๊ฐ์ ์ ๋ฐ์ดํธํ ๋๊น์ง ๋ณ๊ฒฝ๋์ง ์์
assignment ::= variable_lvalue = [ delay_or_event_control ] expression
- ์ ์ฐจ์ ํ ๋น์ ์ข๋ณ <lvalue>์ ๋ค์์ด ๋ ์ ์์
- reg, integer, real, ๋๋ time ๋ฑ๋ก ๋ณ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์
- ์ด๋ฌํ ๋ณ์๋ค์ ๋นํธ(์: addr[0])
- ์ด๋ฌํ ๋ณ์๋ค์ ๋ถ๋ถ ์ ํ(์: addr[31:16])
- ์์ ๊ฒ๋ค์ ์ฐ๊ฒฐ
- ๋ท(NET, ์ฆ, ์์ด์ด)์ ์ ๋จ!!! โ always/initial ์ธ๋ถ์์
assign
๋ฌธ์ ์ฌ์ฉํด์ผ ํจ
- ์ฐ๋ณ์ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ ์ด๋ค ํํ์๋ ๋ ์ ์์
- ์ ์ฐจ์ ํ ๋น ๋ฌธ์๋ ๋ ๊ฐ์ง ์ ํ์ด ์์: ๋ธ๋กํน๊ณผ ๋ ผ๋ธ๋กํน
ย
๋ธ๋กํน ํ ๋น
- ๋ธ๋กํน ํ ๋น ๋ฌธ์ ์์ฐจ ๋ธ๋ก์์ ์ง์ ๋ ์์๋๋ก ์คํ๋จ (โ=โ ์ฐ์ฐ์)
- ํน์ ๋ธ๋ก ๋ด์ ํ๋์ begin-end ๋ธ๋ก์์ ๋ธ๋กํน ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์์ฐจ์ ์. ์๋ํ๋ฉด ๊ทธ๋ค์ ์์ฐจ์ ์ผ๋ก๋ง ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์
reg x, y, z; reg [15:0] reg_a, reg_b; integer count; // ๋ชจ๋ ํ๋์ ๋ช ๋ น๋ฌธ์ initial ๋๋ always ๋ธ๋ก ์์ ์์ด์ผ ํจ initial begin x = 0; y = 1; z = 1; // ์ค์นผ๋ผ ๋ณ์์ ๋ํ ํ ๋น count = 0; // ์ ์ ๋ณ์์ ๋ํ ํ ๋น reg_a = 16'b0; reg_b = reg_a; // ๋ฒกํฐ ์ด๊ธฐํ #15 reg_a[2] = 1'b1; // ์ง์ฐ์ด ์๋ ๋นํธ ์ ํ ํ ๋น #10 reg_b[15:13] = {x, y, z}; // ์ฐ๊ฒฐ ๊ฒฐ๊ณผ ํ ๋น to // ๋ฒกํฐ์ ์ผ๋ถ ์ ํ count = count + 1; // ์ ์์ ๋ํ ํ ๋น (์ฆ๊ฐ) end
ย
๋ ผ๋ธ๋กํน ํ ๋น
- ๋ ผ๋ธ๋กํน ํ ๋น์ ํ ๋น์ ์ค์ผ์ค๋งํ ์ ์๊ฒ ํด์ฃผ๋ฉด์ ์์ฐจ ๋ธ๋ก ๋ด์์ ํ์ ๋ฌธ์ ์คํ์ ์ฐจ๋จํ์ง ์์
<=
์ฐ์ฐ์๋ ๋ ผ๋ธ๋กํน ํ ๋น์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋จ
reg x, y, z; reg [15:0] reg_a, reg_b; integer count; // ๋ชจ๋ ํ๋์ ๋ช ๋ น๋ฌธ์ initial ๋๋ always ๋ธ๋ก ์์ ์์ด์ผ ํจ initial begin x = 0; y = 1; z = 1; // ์ค์นผ๋ผ ํ ๋น count = 0; // ์ ์ ๋ณ์์ ๋ํ ํ ๋น reg_a = 16'b0; reg_b = reg_a; // ๋ฒกํฐ ์ด๊ธฐํ reg_a[2] <= #15 1'b1; // ์ง์ฐ์ ๊ฐ์ง ๋นํธ ์ ํ ํ ๋น reg_b[15:13] <= #10 {x, y, z}; // ์ฐ๊ฒฐ ๊ฒฐ๊ณผ ํ ๋น // ๋ฒกํฐ์ ๋ถ๋ถ ์ ํ count <= count + 1; // ์ ์์ ๋ํ ํ ๋น (์ฆ๊ฐ) end
- ๊ฐ์ always ๋ธ๋ก ๋ด์์ ๋ธ๋กํน ๋ฐ ๋ ผ๋ธ๋กํน ํ ๋น์ ํผํฉํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅ๋์ง ์์
- ๋ ผ๋ธ๋กํน ํ ๋น์ ์์ฉ
- ๊ณตํต ์ด๋ฒคํธ ์ดํ ๋ฐ์ํ๋ ์ฌ๋ฌ ๋์ ๋ฐ์ดํฐ ์ ์ก์ ๋ชจ๋ธ๋งํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋จ
- ๊ฐ ํด๋ญ์ positive edge์์,
always @ (posedge clock) begin reg1 <= #1 in1; reg2 <= @(negedge clock) in2 ^ in3; reg3 <= #1 reg1; // reg1์ ์ด์ ๊ฐ end
- ๋ธ๋กํน ํ ๋น์ ์ฌ์ฉํ์ฌ ๋ ผ๋ธ๋กํน ํ ๋น ๊ตฌํ
// ์์ 1: ๋ธ๋กํน ๋ฌธ์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ ๋์์ always ๋ธ๋ก always @ (posedge clock) a = b; always @ (posedge clock) b = a;
// ์์ 2: ๋ ผ๋ธ๋กํน ๋ฌธ์ ์ฌ์ฉํ๋ ๋ ๊ฐ์ ๋์์ always ๋ธ๋ก always @ (posedge clock) a <= b; always @ (posedge clock) b <= a;
read
๋๋ฉฐ RHS ํํ์์ด ํ๊ฐ๋์ด ์์ ๋ณ์์ ์ ์ฅ๋จย
- ๋ธ๋กํน ํ ๋น์ ์ฌ์ฉํ ๋ ผ๋ธ๋กํน ํ ๋น ๊ตฌํ
// ์์ ๋ณ์์ ๋ธ๋กํน ํ ๋น์ ์ฌ์ฉํ์ฌ ๋ ผ๋ธ๋กํน ํ ๋น์ ๋์์ ์๋ฎฌ๋ ์ดํธํจ always @ (posedge clock) begin // ์ฝ๊ธฐ ์์ - ์์ ๋ณ์์ ์ฐ๋ณ ํํ์์ ๊ฐ์ ์ ์ฅํจ temp_a = a; temp_b = b; // ์ฐ๊ธฐ ์์ - ์์ ๋ณ์์ ๊ฐ์ ์ข๋ณ ๋ณ์์ ํ ๋นํจ a = temp_b; b = temp_a; end
- ๋์งํธ ๋์์ธ์ ์์ด, ๊ณตํต ์ด๋ฒคํธ ์ดํ ๋์ ๋ฐ์ดํฐ ์ ์ก์๋ ๋ ผ๋ธ๋กํน ํ ๋น์ด ๋งค์ฐ ๊ถ์ฅ๋จ
- ๋ธ๋กํน ํ ๋น์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ ํ ๋น ํ๊ฐ ์์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ ์ผ๋ก ๊ฒฝ์ ์ํ๋ฅผ ์ผ์ผํฌ ์ ์์
- ๋ ผ๋ธ๋กํน ํ ๋น์ ์ต์ข ๊ฒฐ๊ณผ๊ฐ ์์์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ ๋ฐ์ดํฐ ์ ์ก์ ํจ๊ณผ์ ์ผ๋ก ๋ชจ๋ธ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์
always @(posedge clock) โ ๋
ผ๋ธ๋กํน ํ ๋น ์ฌ์ฉ
always @(*) โ ๋ธ๋กํน ํ ๋น ์ฌ์ฉ
ย
ย
ย
์ง์ฐ ๊ธฐ๋ฐ ํ์ด๋ฐ ์ ์ด
- ํ์ด๋ฐ ์ ์ด๋ ์ ์ฐจ์ ๋ฌธ์ด ์คํ๋ ์๋ฎฌ๋ ์ด์ ์๊ฐ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ
- ์ง์ฐ ๊ธฐ๋ฐ ํ์ด๋ฐ ์ ์ด๋ ๋ฌธ์ด ๋ฐ๊ฒฌ๋๊ณ ์คํ๋ ๋๊น์ง์ ์๊ฐ ๊ฐ๊ฒฉ์ ์ง์ ํจ
- ์ง์ฐ์ '#' ๊ธฐํธ๋ก ์ง์ ๋จ
delay3 ::= # delay_value | # ( delay_value [ , delay_value [ , delay_value ] ] ) delay2 ::= # delay_value | # ( delay_value [ , delay_value ] ) delay_value ::= unsigned_number | parameter_identifier | specparam_identifier | mintypmax_expression
- ์ผ๋ฐ ์ง์ฐ ์ ์ด
- ์ ์ฐจ์ ํ ๋น์ ์ผ์ชฝ์ non-zero ์ง์ฐ์ด ์ง์ ๋จ
// ๋งค๊ฐ๋ณ์ ์ ์ parameter latency = 20; parameter delta = 2; // ๋ ์ง์คํฐ ๋ณ์ ์ ์ reg x, y, z, p, g; initial begin x = 0; // ์ง์ฐ ์ ์ด ์์ #10 y = 1; // ์ซ์๋ก ์ง์ฐ ์ ์ด. y=1์ ์คํ์ 10 ์๊ฐ ๋จ์๋งํผ ์ง์ฐ #latency z = 0; // ์๋ณ์๋ก ์ง์ฐ ์ ์ด. 20์ ์ง์ฐ #(latency + delta) p = 1; // ํํ์์ผ๋ก ์ง์ฐ ์ ์ด #y x = x + 1; // ์๋ณ์๋ก ์ง์ฐ ์ ์ด. y์ ๊ฐ ์ทจํ๊ธฐ #(4:5:6) g = 0; // ์ต์, ์ผ๋ฐ, ์ต๋ ์ง์ฐ ๊ฐ. ๊ฒ์ดํธ ๋ ๋ฒจ ๋ชจ๋ธ๋ง ์ฅ์์ ๋ ผ์๋จ. end
- ํ ๋น ๋ด ์ง์ฐ ์ ์ด
- ํ ๋น ์ฐ์ฐ์์ ์ค๋ฅธ์ชฝ์ ์ง์ฐ์ ํ ๋นํจ
// ๋ ์ง์คํฐ ๋ณ์ ์ ์ reg x, y, z; // ๋ด๋ถ ํ ๋น ์ง์ฐ initial begin x = 0; z = 0; y = #5 x + z; // time=0์ x์ z์ ๊ฐ์ ์ทจํ๊ณ , x + z๋ฅผ ๊ณ์ฐํ ํ, 5 ์๊ฐ ๋จ์๋ฅผ ๊ธฐ๋ค๋ฆฐ ํ ๊ทธ ๊ฐ์ y์ ํ ๋นํจ end // ์์ ๋ณ์์ ์ผ๋ฐ์ ์ธ ์ง์ฐ ์ ์ด๋ฅผ ์ฌ์ฉํ ๋๋ฑํ ๋ฐฉ๋ฒ initial begin x = 0; z = 0; temp_xz = x + z; #5 y = temp_xz; // ํ์ฌ ์๊ฐ์ x + z์ ๊ฐ์ ์ทจํ๊ณ ์์ ๋ณ์์ ์ ์ฅํจ. 0๊ณผ 5 ์ฌ์ด์ x ๋ฐ z๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋, ์๊ฐ 5์ y์ ํ ๋น๋ ๊ฐ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ end
- ์ ๋ก ์ง์ฐ ์ ์ด
- ๋ฌธ์ด ํด๋น ์๋ฎฌ๋ ์ด์ ์๊ฐ์ ๋ค๋ฅธ ๋ชจ๋ ๋ฌธ๋ค ์ดํ์ ๋ง์ง๋ง์ผ๋ก ์คํ๋๋๋ก ํ๋ ๋ฐฉ๋ฒ์
- ๊ฒฝ์ ์ํฉ์ ์ ๊ฑฐํ๋ ๋ฐ ์ฌ์ฉ๋จ
initial begin x = 0; y = 0; end initial begin #0 x = 1; //์ ๋ก ์ง์ฐ ์ ์ด #0 y = 1; end
- #0 ์ฌ์ฉ์ ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ๋ฒ์
ย
์ด๋ฒคํธ ๊ธฐ๋ฐ ํ์ด๋ฐ ์ ์ด
- ์ด๋ฒคํธ๋ ๋ฌธ์ด๋ ๋ฌธ์ ๋ธ๋ก ์คํ์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ผ๋ฐ ์ด๋ฒคํธ ์ ์ด ('@' ๊ธฐํธ)
- ์ ํธ ๊ฐ์ ๋ณ๊ฒฝ์ด๋ ์ ํธ ๊ฐ์ ์์ ๋๋ ์์ ์ ํ์ ๋ฌธ์ ์คํํ ์ ์์
@(clock) q = d; // clock ์ ํธ๊ฐ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์คํ๋จ @(posedge clock) q = d; // clock ์ ํธ๊ฐ ๊ธ์ ์ ์ธ ๋ณํ(0์์ 1, x ๋๋ z์์ 1๋ก)๋ฅผ ํ ๋ ์คํ๋จ @(negedge clock) q = d; // clock ์ ํธ๊ฐ ๋ถ์ ์ ์ธ ๋ณํ(1์์ 0, x ๋๋ z์์ 0์ผ๋ก)๋ฅผ ํ ๋ ์คํ๋จ q <= @(posedge clock) d; // d๋ ์ฆ์ ํ๊ฐ๋๊ณ clock์ ๊ธ์ ์ ์ธ ์์ง์์ q์ ํ ๋น๋จ
- ๋ช ๋ช ๋ ์ด๋ฒคํธ ์ ์ด
- Verilog๋ ์ด๋ฒคํธ๋ฅผ ์ ์ธํ๊ณ ๊ทธ ์ด๋ฒคํธ์ ๋ฐ์์ ํธ๋ฆฌ๊ฑฐํ๊ณ ์ธ์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ
- ๋ช
๋ช
๋ ์ด๋ฒคํธ๋
event
ํค์๋๋ก ์ ์ธ๋จ - ์ด๋ฒคํธ๋
->
๊ธฐํธ๋ก ํธ๋ฆฌ๊ฑฐ๋๊ณ , ์ด๋ฒคํธ์ ํธ๋ฆฌ๊ฑฐ๋@
๊ธฐํธ๋ก ์ธ์๋จ
// ์ด๊ฒ์ ๋ง์ง๋ง ๋ฐ์ดํฐ ํจํท์ด ๋์ฐฉํ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ ๋ฒํผ์ ์์ event received_data; // received_data๋ผ๋ ์ด๋ฒคํธ ์ ์ always @(posedge clock) // ๊ฐ ๊ธ์ ์ ์ธ ํด๋ญ ์ฃ์ง์์ ํ์ธ begin if(last_data_packet) // ์ด๊ฒ์ด ๋ง์ง๋ง ๋ฐ์ดํฐ ํจํท์ธ ๊ฒฝ์ฐ ->received_data; // received_data ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐ end always @(received_data) // received_data ์ด๋ฒคํธ์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ธฐ๋ค๋ฆผ // ์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ฉด, ๋ฐ์ ๋ฐ์ดํฐ์ ๋ค ํจํท์ ๋ฐ์ดํฐ ๋ฒํผ์ ์ ์ฅ // ์ฐ๊ฒฐ ์ฐ์ฐ์ { } ์ฌ์ฉ data_buf = {data_pkt[0], data_pkt[1], data_pkt[2], data_pkt[3]};
- ์ด๋ฒคํธ OR ์ ์ด
- ์ฌ๋ฌ ์ ํธ ๋๋ ์ด๋ฒคํธ ์ค ํ๋์ ์ ํ์ผ๋ก ๋ฌธ์ด๋ ๋ฌธ์ ๋ธ๋ก ์คํ์ ํธ๋ฆฌ๊ฑฐํ ์ ์์
- OR๋ก ํํ๋ ์ด๋ฒคํธ ๋๋ ์ ํธ ๋ชฉ๋ก์ ๊ฐ๋ ๋ชฉ๋ก์ผ๋ก๋ ์๋ ค์ ธ ์์
// ๋น๋๊ธฐ ์ฌ์ค์ ์ด ์๋ ๋ ๋ฒจ ๊ฐ์ง ๋์น always @(reset, clock, d) // reset, clock ๋๋ d๊ฐ ๋ณ๊ฒฝ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ change begin if (reset) q = 1'b0; // reset ์ ํธ๊ฐ ๋์ ๊ฒฝ์ฐ, q๋ฅผ 0์ผ๋ก ์ค์ else if (clock) q = d; // clock์ด ๋์ ๊ฒฝ์ฐ, ์ ๋ ฅ์ ๋์น end
ย
๋ ๋ฒจ ๊ฐ์ง ํ์ด๋ฐ ์ ์ด
- Verilog๋ ๋ ๋ฒจ ๊ฐ์ง ํ์ด๋ฐ ์ ์ด๋ฅผ ํ์ฉํจ
- ํน์ ์กฐ๊ฑด์ด ์ฐธ์ด ๋ ๋๊น์ง ๋ฌธ์ด๋ ๋ฌธ์ ๋ธ๋ก ์คํ์ ๊ธฐ๋ค๋ฆฌ๋ ๊ธฐ๋ฅ์
wait
ํค์๋๋ ๋ ๋ฒจ ๊ฐ์ง ๊ตฌ์กฐ์ ์ฌ์ฉ๋จ
always wait (count_enable) #20 count = count + 1;
- count_enable์ ๊ฐ์ด ๊ณ์ ๋ชจ๋ํฐ๋ง๋จ
- count_enable์ด 0์ด๋ฉด ๋ฌธ์ ์คํ๋์ง ์์
- ๋ ผ๋ฆฌ 1์ด๋ฉด, 20 ์๊ฐ ๋จ์ ํ์ count = count+1์ด ์คํ๋จ
- count_enable์ด 1๋ก ์ ์ง๋๋ฉด, count๋ ๋งค 20 ์๊ฐ ๋จ์๋ง๋ค ์ฆ๊ฐํจ
ย
์กฐ๊ฑด๋ฌธ
- ์กฐ๊ฑด๋ฌธ์ ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ์ฌ์ฉ๋จ (if-else)
- ๋ฌธ์ด ์คํ๋ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋จ
ย
case๋ฌธ
case, endcase ๋ฐ default ํค์๋๋ case ๋ฌธ์์ ์ฌ์ฉ๋จ
- statement1, 2, โฆ, default_statement ๊ฐ๊ฐ์ ๋จ์ผ ๋๋ ๋ธ๋ก์ผ ์ ์์
case (expression) alternative1: statement1; alternative2: statement2; alternative3: statement3; ... default: default_statement; endcase
- ๋ง์ ์์ ๋ฉํฐํ๋ ์์
// ALU ์ ์ด ์ ํธ์ ๋ฐ๋ผ ๋ช ๋ น๋ฌธ์ ์คํํจ reg [1:0] alu_control; ... ... case (alu_control) 2'd0 : y = x + z; // alu_control์ด '00'์ผ ๋, y๋ x์ z์ ํฉ์ 2'd1 : y = x - z; // alu_control์ด '01'์ผ ๋, y๋ x์์ z๋ฅผ ๋บ ๊ฐ์ 2'd2 : y = x * z; // alu_control์ด '10'์ผ ๋, y๋ x์ z์ ๊ณฑ์ default : $display("Invalid ALU control signal"); // ๊ทธ ์ธ์ ๊ฒฝ์ฐ, ์๋ชป๋ ALU ์ ์ด ์ ํธ๋ฅผ ์ถ๋ ฅํจ endcase module mux4_to_1 (out, i0, i1, i2, i3, s1, s0); // I/O ๋ค์ด์ด๊ทธ๋จ์์์ ํฌํธ ์ ์ธ output out; input i0, i1, i2, i3; input s1, s0; reg out; always @(s1 or s0 or i0 or i1 or i2 or i3) case ({s1, s0}) // ์ ์ด ์ ํธ์ ์ฐ๊ฒฐ์ ๊ธฐ๋ฐํ์ฌ ์ ํํจ 2'd0 : out = i0; // ์ ์ด ์ ํธ๊ฐ '00'์ด๋ฉด, ์ถ๋ ฅ์ i0์ 2'd1 : out = i1; // ์ ์ด ์ ํธ๊ฐ '01'์ด๋ฉด, ์ถ๋ ฅ์ i1์ 2'd2 : out = i2; // ์ ์ด ์ ํธ๊ฐ '10'์ด๋ฉด, ์ถ๋ ฅ์ i2์ 2'd3 : out = i3; // ์ ์ด ์ ํธ๊ฐ '11'์ด๋ฉด, ์ถ๋ ฅ์ i3์ default: $display ("Invalid control signals"); // ๊ทธ ์ธ์ ๊ฒฝ์ฐ, ์๋ชป๋ ์ ์ด ์ ํธ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํจ endcase endmodule
- case๋ ํํ์์์ 0, 1, x ๋ฐ z ๊ฐ์ ๋น๊ตํจ
module demultiplexer1_to_4 (out0, out1, out2, out3, in, s1, s0); // I/O ๋ค์ด์ด๊ทธ๋จ์์์ ํฌํธ ์ ์ธ output out0, out1, out2, out3; reg out0, out1, out2, out3; // ์ถ๋ ฅ์ ์ํ ๋ ์ง์คํฐ input in; // ์ ๋ ฅ ์ ํธ input s1, s0; // ์ ์ด ์ ํธ always @(s1 or s0 or in) case ({s1, s0}) // ์ ์ด ์ ํธ์ ๋ฐ๋ผ ๋ถ๊ธฐ 2'b00 : begin out0 = in; out1 = 1'bz; out2 = 1'bz; out3 = 1'bz; // '00'์ผ ๋ ์ฒซ ๋ฒ์งธ ์ถ๋ ฅ ํ์ฑํ end 2'b01 : begin out0 = 1'bz; out1 = in; out2 = 1'bz; out3 = 1'bz; // '01'์ผ ๋ ๋ ๋ฒ์งธ ์ถ๋ ฅ ํ์ฑํ end 2'b10 : begin out0 = 1'bz; out1 = 1'bz; out2 = in; out3 = 1'bz; // '10'์ผ ๋ ์ธ ๋ฒ์งธ ์ถ๋ ฅ ํ์ฑํ end 2'b11 : begin out0 = 1'bz; out1 = 1'bz; out2 = 1'bz; out3 = in; // '11'์ผ ๋ ๋ค ๋ฒ์งธ ์ถ๋ ฅ ํ์ฑํ end // ์ ์ ์๋ ์ ํธ์ ๋ํ ์ฒ๋ฆฌ. ์ ํ ์ ํธ๊ฐ x์ด๋ฉด ์ถ๋ ฅ์ x, z์ด๋ฉด ์ถ๋ ฅ์ z์ ๋๋ค. // ํ๋๊ฐ x์ด๊ณ ๋ค๋ฅธ ํ๋๊ฐ z์ด๋ฉด, x๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ต๋๋ค. 2'bx0, 2'bx1, 2'bxz, 2'bxx, 2'b0x, 2'b1x, 2'bzx : begin out0 = 1'bx; out1 = 1'bx; out2 = 1'bx; out3 = 1'bx; // ์ ์ ์๋ ์ํ๋ฅผ ์ถ๋ ฅ end 2'bz0, 2'bz1, 2'bzz, 2'b0z, 2'b1z : begin out0 = 1'bz; out1 = 1'bz; out2 = 1'bz; out3 = 1'bz; // ๊ณ ๋ฆฝ ์ํ๋ฅผ ์ถ๋ ฅ end default: $display("Unspecified control signals"); // ๊ทธ ์ธ์ ๊ฒฝ์ฐ, ๋ช ์๋์ง ์์ ์ ์ด ์ ํธ์ ๋ํ ๋ฉ์์ง ์ถ๋ ฅ endcase endmodule
ย
ย
casex, casez ํค์๋
- casez๋ ๋ชจ๋ z ๊ฐ์ donโt care๋ก ์ฒ๋ฆฌํจ
- z๊ฐ ์๋ ๋ชจ๋ ๋นํธ ์์น๋ ํด๋น ์์น์์ '?'๋ก๋ ํํ๋ ์ ์์
- casex๋ ๋ชจ๋ x ๋ฐ z ๊ฐ์ ๊ด์ฌ ์์์ผ๋ก ์ฒ๋ฆฌํจ
- case ํํ์๊ณผ case ๋์์์ non-x ๋๋ -z ์์น๋ง ๋น๊ตํ ์ ์๋๋ก ํจ
reg [3:0] encoding; // 4๋นํธ ์ธ์ฝ๋ฉ ๊ฐ์ ์ ์ฅํ๋ ๋ ์ง์คํฐ integer next_state; // ๋ค์ ์ํ ๊ฐ์ ์ ์ฅํ ์ ์ํ ๋ณ์ casex (encoding) // ๋ก์ง ๊ฐ x๋ ๋์ผ์ด ๋นํธ๋ฅผ ๋ํ๋ 4'b1xxx : next_state = 3; // ์ฒซ ๋ฒ์งธ ๋นํธ๊ฐ 1์ด๋ฉด next_state๋ฅผ 3์ผ๋ก ์ค์ 4'bx1xx : next_state = 2; // ๋ ๋ฒ์งธ ๋นํธ๊ฐ 1์ด๋ฉด next_state๋ฅผ 2๋ก ์ค์ 4'bxx1x : next_state = 1; // ์ธ ๋ฒ์งธ ๋นํธ๊ฐ 1์ด๋ฉด next_state๋ฅผ 1๋ก ์ค์ 4'bxxx1 : next_state = 0; // ๋ค ๋ฒ์งธ ๋นํธ๊ฐ 1์ด๋ฉด next_state๋ฅผ 0์ผ๋ก ์ค์ default : next_state = 0; // ์ ์กฐ๊ฑด์ ๋ง์ง ์๋ ๊ฒฝ์ฐ next_state๋ฅผ 0์ผ๋ก ์ค์ endcase
ย
While ๋ฃจํ
- ๋ค ๊ฐ์ง ์ ํ์ ๋ฐ๋ณต๋ฌธ: while, for, repeat, forever
- while ๋ฃจํ๋ while ํํ์์ด ์ฐธ์ด ์๋ ๋๊น์ง ์คํ๋จ
- while ํํ์์ด ์ฐธ์ด ์๋ ๋ ๋ฃจํ๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฃจํ๊ฐ ์ ํ ์คํ๋์ง ์์
// ์์ 1: ์นด์ดํธ๋ฅผ 0๋ถํฐ 127๊น์ง ์ฆ๊ฐ. ์นด์ดํธ๊ฐ 128์ด ๋๋ฉด ์ข ๋ฃ // ์นด์ดํธ ๋ณ์๋ฅผ ํ์ integer count; // ์ ์ํ ๋ณ์ count ์ ์ธ initial begin // ์ด๊ธฐ ๋ธ๋ก ์์ count = 0; // count๋ฅผ 0์ผ๋ก ์ด๊ธฐํ while (count < 128) // count๊ฐ 127์ผ ๋๊น์ง ๋ฐ๋ณต๋ฌธ ์คํ // ์นด์ดํธ๊ฐ 128์ด ๋๋ฉด ๋ฐ๋ณต๋ฌธ ํ์ถ begin $display ("Count = %d", count); // ํ์ฌ ์นด์ดํธ ๊ฐ์ ์ถ๋ ฅ count = count + 1; // count๋ฅผ 1 ์ฆ๊ฐ end end
ย
For ๋ฃจํ
- for ๋ฃจํ์๋ ์ธ ๋ถ๋ถ์ด ์์
- ์ด๊ธฐ ์กฐ๊ฑด
- ์ข ๋ฃ ์กฐ๊ฑด์ด ์ฐธ์ธ์ง ํ์ธ
- ์ ์ด ๋ณ์์ ๊ฐ ๋ณ๊ฒฝ์ ์ํ ์ ์ฐจ์ ํ ๋น
integer count; initial for (count = 0; count < 128; count = count + 1) $display("Count = %d", count); // for ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ 0๋ถํฐ 127๊น์ง ์นด์ดํธํ๋ฉฐ ๊ฐ ๋จ๊ณ์์ ์นด์ดํธ ๊ฐ์ ์ถ๋ ฅํจ // ๋ฐฐ์ด ์์ ์ด๊ธฐํ `define MAX_STATES 32 integer state[0: `MAX_STATES - 1]; // 0๋ถํฐ 31๊น์ง์ ์์๋ฅผ ๊ฐ์ง ์ ์ ๋ฐฐ์ด state ์ ์ธ integer i; initial begin for (i = 0; i < 32; i = i + 2) // ๋ชจ๋ ์ง์ ์ธ๋ฑ์ค๋ฅผ 0์ผ๋ก ์ด๊ธฐํํจ state[i] = 0; for (i = 1; i < 32; i = i + 2) // ๋ชจ๋ ํ์ ์ธ๋ฑ์ค๋ฅผ 1๋ก ์ด๊ธฐํํจ state[i] = 1; end
ย
Repeat ๋ฃจํ
- repeat ๊ตฌ์กฐ๋ ๋ฃจํ๋ฅผ ๊ณ ์ ๋ ํ์๋ก ์คํํจ
- repeat ๊ตฌ์กฐ๋ ์ผ๋ฐ ๋ ผ๋ฆฌ ํํ์์ ๋ํ ๋ฃจํ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- repeat์๋ ์ซ์, ๋ณ์ ๋๋ ์ ํธ ๊ฐ์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค.
integer count; initial begin count = 0; repeat (128) // 128๋ฒ ๋ฐ๋ณตํจ begin $display("Count = %d", count); // ํ์ฌ ์นด์ดํธ ๊ฐ์ ์ถ๋ ฅํจ count = count + 1; // ์นด์ดํธ๋ฅผ 1 ์ฆ๊ฐ์ํด end end module data_buffer(data_start, data, clock); parameter cycles = 8; // ๋ฐ๋ณตํ ์ฌ์ดํด ์๋ฅผ ์ ์ํจ input data_start; // ๋ฐ์ดํฐ ์์ ์ ํธ ์ ๋ ฅ input [15:0] data; // 16๋นํธ ๋ฐ์ดํฐ ์ ๋ ฅ input clock; // ํด๋ก ์ ํธ ์ ๋ ฅ reg [15:0] buffer[0:7]; // 8๊ฐ์ 16๋นํธ ๋ ์ง์คํฐ๋ก ๊ตฌ์ฑ๋ ๋ฒํผ integer i; always @(posedge clock) // ํด๋ก์ positive edge์์ ํญ์ ์คํ begin if (data_start) // ๋ฐ์ดํฐ ์์ ์ ํธ๊ฐ ์ฐธ(true)์ผ ๋ begin i = 0; repeat (cycles) // ๋ค์ 8๊ฐ ํด๋ก ์ฌ์ดํด์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํจ begin @(posedge clock) // ๋ค์ ํด๋ก์ positive edge๊น์ง ๋๊ธฐ buffer[i] = data; // positive edge์์ ๋ฐ์ดํฐ ๋์น i = i + 1; // ์ธ๋ฑ์ค๋ฅผ 1 ์ฆ๊ฐ์ํด end end end endmodule
ย
Forever ๋ฃจํ
forever ๋ฃจํ๋ ์ด๋ค ํํ์๋ ํฌํจํ์ง ์๊ณ $finish ์์
์ด ๋ฐ๊ฒฌ๋ ๋๊น์ง ์์ํ ์คํ๋จ (์ฆ, while(1))
- forever ๋ฃจํ๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ด๋ฐ ์ ์ด ๊ตฌ์กฐ์ ํจ๊ป ์ฌ์ฉ๋จ
// ์์ 1: ํด๋ก ์์ฑ // always ๋ธ๋ก ๋์ ์์ํ ๋ฐ๋ณตํ๋ ๋ฃจํ ์ฌ์ฉ reg clock; // ํด๋ก ์ ํธ๋ฅผ ์ํ ๋ ์ง์คํฐ ์ ์ initial begin clock = 1'b0; // ํด๋ก์ 0์ผ๋ก ์ด๊ธฐํ forever #10 clock = ~clock; // 20 ์๊ฐ ๋จ์์ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ํด๋ก (10 ์๊ฐ ๋จ์๋ง๋ค ํด๋ก ๊ฐ์ ๋ฐ์ ) end // ์์ 2: ํด๋ก์ positive edge์์ ๋ ๋ ์ง์คํฐ ๊ฐ์ ๋๊ธฐํ reg clock; // ํด๋ก ์ ํธ๋ฅผ ์ํ ๋ ์ง์คํฐ reg x, y; // ๋๊ธฐํํ ๋ ๊ฐ์ ๋ ์ง์คํฐ x์ y initial forever @(posedge clock) x = y; // ํด๋ก์ positive edge๋ง๋ค x์ y ๊ฐ์ ํ ๋น
ย
๋ธ๋ก ์ ํ
- ๋ธ๋ก์๋ ์์ฐจ ๋ธ๋ก๊ณผ ๋ณ๋ ฌ ๋ธ๋ก ๋ ๊ฐ์ง ์ ํ์ด ์์
- ์์ฐจ ๋ธ๋ก (begin-end)
- ์์ฐจ ๋ธ๋ก์ ๋ฌธ์ ์ง์ ๋ ์์๋๋ก ์ฒ๋ฆฌ๋จ
- ์ง์ฐ์ด๋ ์ด๋ฒคํธ ์ ์ด๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ, ์ด๋ ๋ธ๋ก ๋ด ์ด์ ๋ฌธ์ด ์คํ์ ์๋ฃํ ์๋ฎฌ๋ ์ด์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ํจ
// ์์ 1: ์ง์ฐ ์๋ ์์ฐจ ๋ธ๋ก reg x, y; reg [1:0] Z, w; initial begin x = 1'b0; // x๋ฅผ 0์ผ๋ก ์ด๊ธฐํ y = 1'b1; // y๋ฅผ 1๋ก ์ด๊ธฐํ z = {x, y}; // z์ x์ y์ ์ฐ๊ฒฐ(concatenation) ๊ฐ์ ํ ๋น w = {y, x}; // w์ y์ x์ ์ฐ๊ฒฐ ๊ฐ์ ํ ๋น end // ์์ 2: ์ง์ฐ์ด ์๋ ์์ฐจ ๋ธ๋ก reg x, y; reg [1:0] Z, w; initial begin x = 1'b0; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 0์ ์๋ฃ #5 y = 1'b1; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 5์ ์๋ฃ #10 z = {x, y}; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 15์ ์๋ฃ (5 + 10์ ์ง์ฐ์ผ๋ก ์ธํด) #20 w = {y, x}; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 35์ ์๋ฃ (15 + 20์ ์ง์ฐ์ผ๋ก ์ธํด) end
- ๋ณ๋ ฌ ๋ธ๋ก (fork-join)
- ๋ณ๋ ฌ ๋ธ๋ก์ ๋ฌธ์ ๋์์ ์คํ๋จ
- ๋ฌธ์ ์์๋ ๊ฐ ๋ฌธ์ ํ ๋น๋ ์ง์ฐ ๋๋ ์ด๋ฒคํธ ์ ์ด์ ์ํด ์ ์ด๋จ
- ์ง์ฐ์ด๋ ์ด๋ฒคํธ ์ ์ด๊ฐ ์ง์ ๋๋ฉด, ์ด๋ ๋ธ๋ก์ด ์์๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ํจ
// ์์ 1: ์ง์ฐ์ด ์๋ ๋ณ๋ ฌ ๋ธ๋ก reg x, y; reg [1:0] z, w; initial fork x = 1'b0; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 0์ ์๋ฃ #5 y = 1'b1; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 5์ ์๋ฃ #10 z = {x, y}; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 10์ ์๋ฃ #20 w = {y, x}; // ์๋ฎฌ๋ ์ด์ ์๊ฐ 20์ ์๋ฃ join // ๋ณ๋ ฌ ๋ธ๋ก์์ ์๋์ ์ผ๋ก ๋ง๋ ๊ฒฝ์ ์ํ reg x, y; reg [1:0] z, w; initial fork x = 1'b0; y = 1'b1; z = {x, y}; // x์ y์ ํ์ฌ ๊ฐ์ ๋ฐ๋ผ z ๊ฒฐ์ w = {y, x}; // y์ x์ ํ์ฌ ๊ฐ์ ๋ฐ๋ผ w ๊ฒฐ์ join // ๊ฒฝ์ ์ํ ๋ฐ์!
ย
๋ธ๋ก์ ํน๋ณํ ๊ธฐ๋ฅ๋ค
- ์ค์ฒฉ๋ ๋ธ๋ก
- ๋ธ๋ก์ ์ค์ฒฉ๋ ์ ์์ผ๋ฉฐ ์์ฐจ ๋ธ๋ก๊ณผ ๋ณ๋ ฌ ๋ธ๋ก์ด ํผํฉ๋ ์ ์์
- ๋ช ๋ช ๋ ๋ธ๋ก
- ๋ก์ปฌ ๋ณ์๋ ๋ช ๋ช ๋ ๋ธ๋ก์ ๋ํด ์ ์ธ๋ ์ ์์
- ๋ช ๋ช ๋ ๋ธ๋ก์ ๋์์ธ ๊ณ์ธต์ ์ผ๋ถ (๊ณ์ธต์ ์ด๋ฆ ์ฐธ์กฐ)
- ๋ช ๋ช ๋ ๋ธ๋ก์ ๋นํ์ฑํ๋ ์ ์์
// ๋ช ๋ช ๋ ๋ธ๋ก ์์ module top; initial begin: block1 // 'block1'์ด๋ผ๋ ์ด๋ฆ์ ์์ฐจ ๋ธ๋ก integer i; // 'i'๋ ์ ์ ์ด๋ฉฐ 'block1'์ ๋ก์ปฌํ ์ ์์ // 'i'๋ ๊ณ์ธต์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์์. ์: top.block1.i ... end initial fork: block2 // 'block2'๋ผ๋ ์ด๋ฆ์ ๋ณ๋ ฌ ๋ธ๋ก reg i; // 'i'๋ ์ ์ ์ด๋ฉฐ 'block2'์ ๋ก์ปฌํ ๋ ์ง์คํฐ์ // 'i'๋ ๊ณ์ธต์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์์. ์: top.block2.i ... ... join
- ๋ช ๋ช ๋ ๋ธ๋ก ๋นํ์ฑํ
disable
ํค์๋๋ ๋ช ๋ช ๋ ๋ธ๋ก์ ์คํ์ ์ข ๋ฃํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ- ๋ธ๋ก์ ๋นํ์ฑํํ๋ฉด ์คํ ์ ์ด๊ฐ ๋ธ๋ก ๋ฐ๋ก ๋ค์์ ๋ฌธ์ฅ์ผ๋ก ์ ๋ฌ๋จ
disable
์ C์break
๋ฌธ๊ณผ ๋งค์ฐ ์ ์ฌํจ
// ์์: 'flag' (๋ฒกํฐ ๋ณ์)์์ ๊ฐ์ด 1์ธ ์ฒซ ๋ฒ์งธ ๋นํธ ์ฐพ๊ธฐ reg [15:0] flag; integer i; // ์นด์ดํธ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์ ์ initial begin flag = 16'b 0010_0000_0000_0000; i = 0; begin: block1 // while ๋ด์ ์ฃผ์ ๋ธ๋ก์ 'block1'์ด๋ผ ๋ช ๋ช ๋จ while(i < 16) begin if (flag[i]) begin $display ("๊ฐ์ด TRUE์ธ ๋นํธ๋ฅผ ์์ ๋ฒํธ %d์์ ๋ฐ๊ฒฌํ์ต๋๋ค", i); disable block1; // 'block1'์ ๋นํ์ฑํํจ. ์ฐธ์ธ ๊ฐ์ ์ฐพ์๊ธฐ ๋๋ฌธ end i = i + 1; end end end
ย
์ ๋๋ ์ดํธ ๋ธ๋ก
- ์ ๋๋ ์ดํธ ๋ฌธ์ Verilog ์ฝ๋๋ฅผ ์๋ฎฌ๋ ์ด์ ์์ ์ ์ ๋์ ์ผ๋ก ์์ฑํ ์ ์๊ฒ ํจ
- ์ด๊ฒ์ ๋งค๊ฐ๋ณ์ํ๋ ๋ชจ๋ธ์ ์์ฑ์ ์ด์งํจ
- ๋ชจ๋ ์์ฑ ์ธ์คํด์ค๋ ๋ชจ๋ ๋ฒ์๋ก ์ฝ๋ฉ๋์ด
generate-endgenerate
ํค์๋๊ฐ ํ์ํจ
- ์์ฑ๋ ์ธ์คํด์ค๋ ๋ค์ ์ค ํ๋ ์ด์์ผ ์ ์์
- ๋ชจ๋
- ์ฌ์ฉ์ ์ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ, Verilog ๊ฒ์ดํธ ํ๋ฆฌ๋ฏธํฐ๋ธ
- ์ง์์ ์ธ ํ ๋น
- ์ด๊ธฐ ๋ฐ ํญ์ ๋ธ๋ก
- ์ ๋๋ ์ดํธ ๋ฌธ์ ๋ค์ Verilog ๋ฐ์ดํฐ ์ ํ์ ์์ฑ ๋ฒ์ ๋ด์ ์ ์ธํ ์ ์์ต๋๋ค:
- net, reg, integer, real, time, realtime, event
- ์์ฑ๋ ๋ฐ์ดํฐ ์ ํ์๋ ๊ณ ์ ์๋ณ์ ์ด๋ฆ์ด ์์ผ๋ฉฐ ๊ณ์ธต์ ์ผ๋ก ์ฐธ์กฐ๋ ์ ์์
- ํ์คํฌ์ ํจ์ ์ ์ธ์ ์์ฑ ๋ฒ์ ๋ด์์ ํ์ฉ๋์ง๋ง ์์ฑ ๋ฃจํ ๋ด์์๋ ํ์ฉ๋์ง ์์
- ์ผ๋ถ ๋ชจ๋ ์ ์ธ ๋ฐ ๋ชจ๋ ํญ๋ชฉ์ ์์ฑ ๋ฌธ์์ ํ์ฉ๋์ง ์์
- ๋งค๊ฐ๋ณ์, ๋ก์ปฌ ๋งค๊ฐ๋ณ์
- ์ ๋ ฅ, ์ถ๋ ฅ, inout ์ ์ธ
- ์ง์ ๋ธ๋ก
- ์ ๋๋ ์ดํธ ๋ฌธ์ ๋ง๋๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ
- ์ ๋๋ ์ดํธ ๋ฃจํ
- ์ ๋๋ ์ดํธ ์กฐ๊ฑด๋ถ
- ์ ๋๋ ์ดํธ ์ผ์ด์ค
ย
์ ๋๋ ์ดํธ ๋ฃจํ
- ์ ๋๋ ์ดํธ ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ ์ค ํ๋ ์ด์์ ์ฌ๋ฌ ๋ฒ ์ธ์คํด์คํํ ์ ์์ต๋๋ค:
- ๋ณ์ ์ ์ธ
- ๋ชจ๋
- ์ฌ์ฉ์ ์ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ
- ๊ฒ์ดํธ ํ๋ฆฌ๋ฏธํฐ๋ธ
- ์ง์์ ์ธ ํ ๋น
- ์ด๊ธฐ ๋ฐ ํญ์ ๋ธ๋ก
// ์ด ๋ชจ๋์ ๋ ๊ฐ์ N๋นํธ ๋ฒ์ค ๊ฐ์ ๋นํธ๋ณ XOR์ ์์ฑํจ module bitwise_xor; // ํ๋ผ๋ฏธํฐ ์ ์ธ. ์ด๊ฒ์ ์ฌ์ ์๋ ์ ์์ parameter N = 32; // ๊ธฐ๋ณธ์ ์ผ๋ก 32๋นํธ ๋ฒ์ค // ํฌํธ ์ ์ธ output [N-1:0] out; input [N-1:0] i0, i1; // ์์ ๋ฃจํ ๋ณ์ ์ ์ธ. ์ด ๋ณ์๋ generate ๋ธ๋ก์ ํ๊ฐ์๋ง ์ฌ์ฉ๋จ // ์ด ๋ณ์๋ Verilog ๋์์ธ์ ์๋ฎฌ๋ ์ด์ ์ค์๋ ์กด์ฌํ์ง ์์ genvar j; // ๋จ์ผ ๋ฃจํ๋ก ๋นํธ ๋จ์์ XOR ์์ฑ generate for (j=0; j<N; j=j+1) begin: xor_loop xor g1 (out[j], i0[j], i1[j]); end // generate ๋ธ๋ก ๋ด์ for ๋ฃจํ์ ๋ endgenerate // generate ๋ธ๋ก์ ๋ // ๋์ฒด ์คํ์ผ๋ก์, // xor ๊ฒ์ดํธ๋ always ๋ธ๋ก์ผ๋ก ๋์ฒด๋ ์ ์์ // reg [N-1:0] out; // generate // for (j=0; j<N; j=j+1) // begin: bit_xor // always @(i0[j] or i1[j]) // out[j] = i0[j] ^ i1[j]; // end // endgenerate endmodule
genvar
์ ์ ๋๋ ์ดํธ ๋ธ๋ก์์ํ ํค์๋์xor_loop[0].g1
, xor_loop[31].g1
๊ณผ ๊ฐ์ด ์ก์ธ์ค๋จย
์ ๋๋ ์ดํธ ์กฐ๊ฑด๋ฌธ
- ์ ๋๋ ์ดํธ ์กฐ๊ฑด๋ฌธ์ if-else ์ ๋๋ ์ดํธ ๊ตฌ์กฐ์ ๊ฐ์์ ๋ค์๊ณผ ๊ฐ์ Verilog ๊ตฌ์กฐ๋ฅผ ํ์ฉํจ
- ๋ชจ๋
- ์ฌ์ฉ์ ์ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ
- ๊ฒ์ดํธ ํ๋ฆฌ๋ฏธํฐ๋ธ
- ์ง์์ ์ธ ํ ๋น
- ์ด๊ธฐ ๋ฐ ํญ์ ๋ธ๋ก
module multiplier (product, a0, a1); // ํ๋ผ๋ฏธํฐ ์ ์ธ. ์ด๊ฒ์ ์ฌ์ ์๋ ์ ์์ parameter a0_width = 8; // ๊ธฐ๋ณธ์ ์ผ๋ก 8๋นํธ ๋ฒ์ค parameter a1_width = 8; // ๊ธฐ๋ณธ์ ์ผ๋ก 8๋นํธ ๋ฒ์ค // ๋ก์ปฌ ํ๋ผ๋ฏธํฐ ์ ์ธ. // ์ด ํ๋ผ๋ฏธํฐ๋ defparam ๋๋ ๋ชจ๋ ์ธ์คํด์ค # ๋ฌธ์ผ๋ก ์์ ํ ์ ์์ localparam product_width = a0_width + a1_width; // ํฌํธ ์ ์ธ output [product_width-1:0] product; input [a0_width-1:0] a0; input [a1_width-1:0] a1; // ์กฐ๊ฑด๋ถ๋ก ๊ณฑ์ ๊ธฐ์ ์ ํ์ ์ธ์คํด์คํํจ // ์ธ์คํด์คํ ์์ ์ a0_width ๋ฐ a1_width ํ๋ผ๋ฏธํฐ ๊ฐ์ ๋ฐ๋ผ ์ ์ ํ ๊ณฑ์ ๊ธฐ๊ฐ ์ธ์คํด์คํ๋จ generate if (a0_width < 8) || (a1_width < 8) // ๋ง์ฝ a0์ ๋๋น๋ a1์ ๋๋น๊ฐ 8 ๋ฏธ๋ง์ด๋ฉด, cla ๊ณฑ์ ๊ธฐ๋ฅผ ์ฌ์ฉํจ cla_multiplier #(a0_width, a1_width) mul_instance (product, a0, a1); else // ๊ทธ๋ ์ง ์์ผ๋ฉด, ํธ๋ฆฌ ๊ณฑ์ ๊ธฐ๋ฅผ ์ฌ์ฉํจ tree_multiplier #(a0_width, a1_width) mul_instance (product, a0, a1); endgenerate // generate ๋ธ๋ก์ ๋ endmodule
ย
์ ๋๋ ์ดํธ case๋ฌธ
- ์ ๋๋ ์ดํธ ์ผ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ Verilog ๊ตฌ์กฐ๊ฐ ์กฐ๊ฑด๋ถ๋ก ์ธ์คํด์คํ๋๋๋ก ํ์ฉํฉ๋๋ค:
- ๋ชจ๋
- ์ฌ์ฉ์ ์ ์ ํ๋ฆฌ๋ฏธํฐ๋ธ
- ๊ฒ์ดํธ ํ๋ฆฌ๋ฏธํฐ๋ธ
- ์ง์์ ์ธ ํ ๋น
- ์ด๊ธฐ ๋ฐ ํญ์ ๋ธ๋ก
module adder (co, sum, a0, a1, ci); // ํ๋ผ๋ฏธํฐ ์ ์ธ. ์ด๊ฒ์ ์ฌ์ ์๋ ์ ์์ parameter N=4; // ๊ธฐ๋ณธ์ ์ผ๋ก 4๋นํธ ๋ฒ์ค // ํฌํธ ์ ์ธ output [N-1:0] sum; output co; input [N-1:0] a0, a1; input ci; // ๋ฒ์ค์ ๋๋น์ ๋ฐ๋ผ ์ ์ ํ ๊ฐ์ฐ๊ธฐ๋ฅผ ์ธ์คํด์คํํจ // ์ด๋ ์ธ์คํด์คํ ์์ ์ ์ฌ์ ์๋ ์ ์๋ ํ๋ผ๋ฏธํฐ N์ ๊ธฐ๋ฐํจ generate case (N) // 1๋นํธ์ 2๋นํธ ๊ฐ์ฐ๊ธฐ๋ฅผ ์ํ ํน๋ณํ ๊ฒฝ์ฐ๋ค 1: adder_1bit adder1(co, sum, a0, a1, ci); //1๋นํธ ๊ตฌํ์ฒด 2: adder_2bit adder2(co, sum, a0, a1, ci); //2๋นํธ ๊ตฌํ์ฒด // ๊ธฐ๋ณธ๊ฐ์ N๋นํธ ์ฉ๋ ์ ํ ๊ฐ์ฐ๊ธฐ์ default: adder_cla #(N) adder3(co, sum, a0, a1, ci); endcase endgenerate // generate ๋ธ๋ก์ ๋ endmodule
ย
์์ #1
- 4๋1 ๋ฉํฐํ๋ ์
// 4๋1 ๋ฉํฐํ๋ ์. ํฌํธ ๋ชฉ๋ก์ I/O ๋ค์ด์ด๊ทธ๋จ์์ ์ ํํ๊ฒ ๊ฐ์ ธ์์ module mux4_to_1 (out, i0, i1, i2, i3, s1, s0); // I/O ๋ค์ด์ด๊ทธ๋จ์์์ ํฌํธ ์ ์ธ output out; input i0, i1, i2, i3; input s1, s0; // ์ถ๋ ฅ์ ๋ ์ง์คํฐ๋ก ์ ์ธ reg out; // ์ ๋ ฅ ์ ํธ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์ถ๋ ฅ ์ ํธ out์ ๋ค์ ๊ณ์ฐํจ // out์ ๋ค์ ๊ณ์ฐํ๊ฒ ๋ง๋๋ ๋ชจ๋ ์ ๋ ฅ ์ ํธ๋ always @(...) ๋ฏผ๊ฐ๋ ๋ชฉ๋ก์ ๋ค์ด๊ฐ์ผ ํจ always @(s1 or s0 or i0 or i1 or i2 or i3) begin case ({s1, s0}) // s1๊ณผ s0์ ์กฐํฉ์ ๋ฐ๋ผ ๋ถ๊ธฐ 2'b00: out = i0; // s1s0์ด 00์ด๋ฉด out์ i0 2'b01: out = i1; // s1s0์ด 01์ด๋ฉด out์ i1 2'b10: out = i2; // s1s0์ด 10์ด๋ฉด out์ i2 2'b11: out = i3; // s1s0์ด 11์ด๋ฉด out์ i3 default: out = 1'bx; // ๊ทธ ์ธ์ ๊ฒฝ์ฐ, out์ ์ ์๋์ง ์์ ์ํ(x) endcase end endmodule
ย
์์ #2
- 4๋นํธ ์นด์ดํฐ
- ๋ฐ์ดํฐ ํ๋ก์ฐ ๋๋ ๊ฒ์ดํธ ๋ ๋ฒจ ๋์์ธ์ ๋ฆฌํ ์บ๋ฆฌ, ๋๊ธฐ์ ์นด์ดํฐ, ํ๋ฆฝํ๋กญ, ์ธ๋ฒํฐ ๋ฑ์ ๊ณ ๋ คํด์ผ ํจ
- ํ๋ ์์ค์ ๋์์ธ์ ๋งค์ฐ ๋์ ์์ค์ ์ถ์ํ๋ง์ ์๊ตฌํจ
// 4๋นํธ ์ด์ง ์นด์ดํฐ module counter (Q, clock, clear); // ์ /์ถ๋ ฅ ํฌํธ output [3:0] Q; input clock, clear; // ์ถ๋ ฅ์ ๋ ์ง์คํฐ๋ก ์ ์ reg [3:0] Q; // clear์ ๊ธ์ ์์ง ๋๋ clock์ ๋ถ์ ์์ง์์ ๋์ always @(posedge clear or negedge clock) begin if (clear) Q = 4'd0; // clear ์ ํธ๊ฐ ํ์ฑํ๋๋ฉด Q๋ฅผ 0์ผ๋ก ๋ฆฌ์ // ๋น๋ธ๋กํน ํ ๋น์ ํ๋ฆฝํ๋กญ๊ณผ ๊ฐ์ ์์ฐจ ๋ ผ๋ฆฌ ์์ฑ์ ๊ถ์ฅ๋ฉ๋๋ค else Q = Q + 1; // Q์ ๊ฐ์ 1 ์ฆ๊ฐ. 4๋นํธ ๊ฐ์ด๋ฏ๋ก ๋ชจ๋๋ก 16 ์ฐ์ฐ์ ํ์ํ์ง ์์ผ๋ฉฐ ์๋์ผ๋ก ์ค๋ฒํ๋ก์ฐ๋จ. end endmodule
ย