07 Behavioral Modeling
๐Ÿ”ฎ

07 Behavioral Modeling

Description
Date
Oct 16, 2023
URL
์ƒํƒœ
Done
Tags
Digital Design
ย 

๊ตฌ์กฐํ™”๋œ ์ ˆ์ฐจ

  • 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
    • initial ๋ธ”๋ก์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ๊ธฐํ™”, ๋ชจ๋‹ˆํ„ฐ๋ง, ํŒŒํ˜• ๋ฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ „์ฒด ๊ธฐ๊ฐ„ ๋™์•ˆ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์‚ฌ์šฉ๋จ
  • ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™” ๊ฒฐํ•ฉ
    • // 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
        1. `assignment` : ์ด๊ฒƒ์€ ํ• ๋‹น๋ฌธ ์ „์ฒด๋ฅผ ๋‚˜ํƒ€๋ƒ„. ์ฝ”๋“œ์—์„œ ํŠน์ • ๊ฐ’์„ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ ์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•จ 2. `variable_lvalue` : 'lvalue'๋Š” ํ• ๋‹น์˜ ์™ผ์ชฝ์— ์˜ค๋Š” ๊ฐ’์„ ์˜๋ฏธํ•จ. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ’์„ ํ• ๋‹น๋ฐ›๋Š” ๋ณ€์ˆ˜(์ฆ‰, ๋ณ€๊ฒฝ๋  ๋Œ€์ƒ)๋ฅผ ๋‚˜ํƒ€๋ƒ„ 3. `[ delay_or_event_control ]` : ์ด๊ฒƒ์€ ์„ ํƒ์  ์š”์†Œ๋กœ, ํ• ๋‹น์— ์ง€์—ฐ(delay)์ด๋‚˜ ์ด๋ฒคํŠธ ์ œ์–ด(event control)๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ„. ์ง€์—ฐ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ ํ˜ธ์— ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธฐ๊ธฐ ์ „ ํŠน์ • ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ , ์ด๋ฒคํŠธ ์ œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์ด๋ฒคํŠธ(์˜ˆ: ๋‹ค๋ฅธ ์‹ ํ˜ธ์˜ ๋ณ€ํ™”)๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ 4. `expression` : ์ด๊ฒƒ์€ 'rvalue' ์ฆ‰, ํ• ๋‹น๋ฌธ ์˜ค๋ฅธ์ชฝ์— ์˜ค๋Š” ๊ฐ’์„ ์˜๋ฏธํ•จ. ๋ณ€์ˆ˜์— ํ• ๋‹น๋  ์‹ค์ œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ํ‘œํ˜„์‹์ด ์—ฌ๊ธฐ์— ํ•ด๋‹น
  • ์ ˆ์ฐจ์  ํ• ๋‹น์˜ ์ขŒ๋ณ€ <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
        1. "๋ชจ๋“  ํ–‰๋™์  ๋ช…๋ น๋ฌธ์€ initial ๋˜๋Š” always ๋ธ”๋ก ์•ˆ์— ์žˆ์–ด์•ผ ํ•จ" - ์ด ์ฃผ์„์€ Verilog ์ฝ”๋“œ์˜ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น๋ฌธ์ด `initial` ๋˜๋Š” `always` ๋ธ”๋ก ๋‚ด์— ์œ„์น˜ํ•ด์•ผ ํ•จ์„ ์ง€์‹œํ•จ. ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋™์•ˆ์˜ ํ–‰๋™์„ ์ •์˜ํ•จ 2. "์Šค์นผ๋ผ ํ• ๋‹น" - ์ด๋Š” ๋‹จ์ผ ๊ฐ’์„ ๊ฐ–๋Š” ์ผ๋ฐ˜ ๋ณ€์ˆ˜(์Šค์นผ๋ผ)์— ๊ฐ’์ด ํ• ๋‹น๋จ์„ ๋‚˜ํƒ€๋ƒ„ 3. "์ •์ˆ˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ํ• ๋‹น" - ์ด๋Š” ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜ `count`์— ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์ž„ 4. "๋ฒกํ„ฐ ์ดˆ๊ธฐํ™”" - ์ด ์ฃผ์„์€ ๋‘ ๋ฒกํ„ฐํ˜• ๋ณ€์ˆ˜ `reg_a`์™€ `reg_b`๋ฅผ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•จ. ์—ฌ๊ธฐ์„œ `reg_a`๋Š” 0์œผ๋กœ ์„ค์ •๋˜๊ณ , `reg_b`๋Š” `reg_a`์˜ ํ˜„์žฌ ๊ฐ’์œผ๋กœ ์„ค์ •๋จ 5. "์ง€์—ฐ์„ ๊ฐ€์ง„ ๋น„ํŠธ ์„ ํƒ ํ• ๋‹น" - ์ด๋Š” ํŠน์ • ๋น„ํŠธ์— ๋Œ€ํ•ด ์ง€์—ฐ๋œ ํ• ๋‹น์„ ์ˆ˜ํ–‰ํ•จ์„ ๋‚˜ํƒ€๋ƒ„. ์ง€์ •๋œ ์‹œ๊ฐ„ ์ง€์—ฐ ํ›„์— `reg_a`์˜ ํŠน์ • ๋น„ํŠธ๊ฐ€ ์„ค์ •๋จ 6. "์—ฐ๊ฒฐ ๊ฒฐ๊ณผ ํ• ๋‹น" - ์ด๋Š” ๋ณ€์ˆ˜ `x`, `y`, `z`์˜ ๊ฐ’๋“ค์„ ์—ฐ๊ฒฐํ•˜์—ฌ(`{x, y, z}`) `reg_b`์˜ ํŠน์ • ๋น„ํŠธ ๋ฒ”์œ„์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„ 7. "์ •์ˆ˜์— ๋Œ€ํ•œ ํ• ๋‹น (์ฆ๊ฐ€)" - ์ด๋Š” `count` ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„. ์ด ์—ฐ์‚ฐ์— ์˜ํ•ด `count`๋Š” ์ด์ „ ๊ฐ’์—์„œ 1์ด ์ฆ๊ฐ€ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •๋จ
  • ๊ฐ™์€ always ๋ธ”๋ก ๋‚ด์—์„œ ๋ธ”๋กœํ‚น ๋ฐ ๋…ผ๋ธ”๋กœํ‚น ํ• ๋‹น์„ ํ˜ผํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Œ
  • ๋…ผ๋ธ”๋กœํ‚น ํ• ๋‹น์˜ ์‘์šฉ
    • ๊ณตํ†ต ์ด๋ฒคํŠธ ์ดํ›„ ๋ฐœ์ƒํ•˜๋Š” ์—ฌ๋Ÿฌ ๋™์‹œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋จ
  • ๊ฐ ํด๋Ÿญ์˜ positive edge์—์„œ,
    • always @ (posedge clock) begin reg1 <= #1 in1; reg2 <= @(negedge clock) in2 ^ in3; reg3 <= #1 reg1; // reg1์˜ ์ด์ „ ๊ฐ’ end
      "reg1์˜ ์ด์ „ ๊ฐ’" - ์ด ์ฃผ์„์€ `reg3`์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์ด `reg1`์˜ ์ด์ „ ๊ฐ’, ์ฆ‰ ํ˜„์žฌ ํด๋Ÿญ ์‚ฌ์ดํด์—์„œ์˜ `reg1`์˜ ๊ฐ’์ž„์„ ๋‚˜ํƒ€๋ƒ„. `#1` ์ง€์—ฐ์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ „ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด `reg3`์— ํ• ๋‹น๋จ ์ด ์ฝ”๋“œ ๋ธ”๋ก์€ ์–‘์ˆ˜ ์—์ง€ ํŠธ๋ฆฌ๊ฑฐ(clock์˜ ์ƒ์Šน ์—์ง€)์—์„œ ๋™์ž‘ํ•˜๋Š” ์ˆœ์ฐจ ๋กœ์ง์„ ์„ค๋ช…ํ•จ. `reg1`, `reg2`, `reg3`์€ ํด๋Ÿญ์˜ ์ƒ์Šน ์—์ง€์—์„œ ์—…๋ฐ์ดํŠธ๋˜๋ฉฐ, ํŠนํžˆ `reg2`์˜ ๊ฒฝ์šฐ๋Š” ํด๋Ÿญ์˜ ์Œ์ˆ˜ ์—์ง€(ํ•˜๊ฐ• ์—์ง€)์— ๋ฐ˜์‘ํ•˜์—ฌ `in2`์™€ `in3`์˜ XOR ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์€ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ œ์–ด์™€ ํƒ€์ด๋ฐ์„ ์ •ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ 1. ๊ฐ ์šฐ๋ณ€ ๋ณ€์ˆ˜, in1, in2, in3, ๋ฐ reg1์— ์ฝ๊ธฐ ์ž‘์—…์ด ์ˆ˜ํ–‰๋จ 2. ์ขŒ๋ณ€ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์“ฐ๊ธฐ ์ž‘์—…์ด ๋‚ด๋ถ€ ํ• ๋‹น ์ง€์—ฐ์— ์˜ํ•ด ์ง€์ •๋œ ์‹œ๊ฐ„์— ์‹คํ–‰๋˜๋„๋ก ์˜ˆ์•ฝ๋จ 3. ์“ฐ๊ธฐ ์ž‘์—…์€ ์˜ˆ์•ฝ๋œ ์‹œ๊ฐ„ ๋‹จ๊ณ„์—์„œ ์‹คํ–‰๋จ
    • ๋”ฐ๋ผ์„œ reg1, reg2, ๋ฐ reg3์˜ ์ตœ์ข… ๊ฐ’์€ ํ• ๋‹น์ด ์ฒ˜๋ฆฌ๋˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€ ์•Š์Œ
  • ๋ธ”๋กœํ‚น ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ผ๋ธ”๋กœํ‚น ํ• ๋‹น ๊ตฌํ˜„
    • // ์˜ˆ์‹œ 1: ๋ธ”๋กœํ‚น ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋™์‹œ์  always ๋ธ”๋ก always @ (posedge clock) a = b; always @ (posedge clock) b = a;
      ๋‘ ๊ฐœ์˜ ๋™์‹œ์  ์‹คํ–‰์„ ๊ฐ€์ง€๋Š” always ๋ธ”๋ก์„ ์„ค๋ช…ํ•จ. ๋ธ”๋กœํ‚น ๋Œ€์ž…์ด ์‚ฌ์šฉ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํ•œ ๋ฌธ์žฅ์ด ์™„๋ฃŒ๋˜์–ด์•ผ ๋‹ค์Œ ๋ฌธ์žฅ์ด ์‹คํ–‰๋จ์„ ์˜๋ฏธํ•จ. ์—ฌ๊ธฐ์„œ๋Š” ํด๋ก์˜ ์ƒ์Šน ์—์ง€์—์„œ a์™€ b๊ฐ’์ด ์„œ๋กœ ๋ฐ”๋€Œ๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋ธ”๋กœํ‚น ๋Œ€์ž… ๋•Œ๋ฌธ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฒฝ์Ÿ ์ƒํƒœ(race condition)๋กœ ์•Œ๋ ค์ ธ ์žˆ์Œ
    • a = b๋Š” b = a ์ด์ „์— ์‹คํ–‰๋˜๊ฑฐ๋‚˜, ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฆ„
    • ๋”ฐ๋ผ์„œ, ๋ ˆ์ง€์Šคํ„ฐ a์™€ b์˜ ๊ฐ’์€ ๋ฐ”๋€Œ์ง€ ์•Š์ง€๋งŒ ๋™์ผํ•ด์ง
      • // ์˜ˆ์‹œ 2: ๋…ผ๋ธ”๋กœํ‚น ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋™์‹œ์  always ๋ธ”๋ก always @ (posedge clock) a <= b; always @ (posedge clock) b <= a;
        ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๋‘ ๊ฐœ์˜ always ๋ธ”๋ก์ด ๋…ผ๋ธ”๋กœํ‚น ๋Œ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ์˜ ๊ฐ’์„ ๊ตํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์„ค๋ช…ํ•จ. ๋…ผ๋ธ”๋กœํ‚น ๋Œ€์ž…์€ ๋™์‹œ์— ํ‰๊ฐ€๋˜๋ฉฐ, ๋ชจ๋“  ๋Œ€์ž…์˜ ์šฐ๋ณ€์ด ํ‰๊ฐ€๋œ ํ›„ ์ขŒ๋ณ€์— ๋Œ€์ž…๋จ. ์ด๋Š” ์‹ค์ œ ํ•˜๋“œ์›จ์–ด์˜ ๋ณ‘๋ ฌ ์ž‘๋™์„ ๋ชจ๋ฐฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, a์™€ b์˜ ๊ฐ’์ด ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตํ™˜๋˜๋„๋ก ํ•จ. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋””์ง€ํ„ธ ํšŒ๋กœ์—์„œ ํ”Œ๋ฆฝํ”Œ๋กญ์ด๋‚˜ ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋™์ž‘์„ ์ •ํ™•ํžˆ ๋ชจ๋ธ๋งํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•จ
    • ํด๋Ÿญ์˜ positive edge์—์„œ, ๋ชจ๋“  RHS์˜ ๊ฐ’์ด read๋˜๋ฉฐ RHS ํ‘œํ˜„์‹์ด ํ‰๊ฐ€๋˜์–ด ์ž„์‹œ ๋ณ€์ˆ˜์— ์ €์žฅ๋จ
    • ์“ฐ๊ธฐ ์ž‘์—… ์ค‘, ์ž„์‹œ ๋ณ€์ˆ˜์˜ ๊ฐ’์ด LHS์— ํ• ๋‹น๋จ
    • ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ, ๋ ˆ์ง€์Šคํ„ฐ a์™€ b์˜ ๊ฐ’์ด ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋จ
ย 
  • ๋ธ”๋กœํ‚น ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ ๋…ผ๋ธ”๋กœํ‚น ํ• ๋‹น ๊ตฌํ˜„
    • // ์ž„์‹œ ๋ณ€์ˆ˜์™€ ๋ธ”๋กœํ‚น ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ผ๋ธ”๋กœํ‚น ํ• ๋‹น์˜ ๋™์ž‘์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•จ 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
        delay3์€ ์„ธ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ์ง€์—ฐ ๊ฐ’์„ ์ •์˜ํ•จ. ์ด๋Š” ๋‹จ์ผ ์ง€์—ฐ ๊ฐ’(# delay_value)์ด๊ฑฐ๋‚˜, ๊ด„ํ˜ธ ์•ˆ์— ์„ธ ๊ฐœ์˜ ์ง€์—ฐ ๊ฐ’์ด ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ(# (delay_value, delay_value, delay_value))๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ์˜ ์ง€์—ฐ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ(์˜ˆ: ์ตœ์†Œ, ์ผ๋ฐ˜, ์ตœ๋Œ€ ์ง€์—ฐ). delay2๋Š” ๋‘ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ์ง€์—ฐ ๊ฐ’์„ ์ •์˜ํ•จ. ๋‹จ์ผ ์ง€์—ฐ ๊ฐ’(# delay_value) ๋˜๋Š” ๊ด„ํ˜ธ ์•ˆ์— ๋‘ ๊ฐœ์˜ ์ง€์—ฐ ๊ฐ’์ด ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ(# (delay_value, delay_value))์ž„. ์ด ๊ตฌ์กฐ๋„ ๋‹ค์–‘ํ•œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ƒํ™ฉ์—์„œ์˜ ์ง€์—ฐ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž„ delay_value๋Š” ์ง€์—ฐ ๊ฐ’์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์‹ค์ œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ„. ์ด ๊ฐ’์€ ๋ถ€ํ˜ธ ์—†๋Š” ์ˆซ์ž(unsigned_number)์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒŒ๋ผ๋ฏธํ„ฐ ์‹๋ณ„์ž(parameter_identifier), ํŠน์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์‹๋ณ„์ž(specparam_identifier), ๋˜๋Š” min-typ-max ํ‘œํ˜„์‹(mintypmax_expression)์ด ๋  ์ˆ˜ ์žˆ์Œ. ์ด๋Ÿฌํ•œ ๋‹ค์–‘ํ•œ ์œ ํ˜•์€ ์ง€์—ฐ ๊ฐ’์„ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ค๊ณ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ํŠน์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ตœ์†Œ/์ผ๋ฐ˜/์ตœ๋Œ€ ์ง€์—ฐ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
    • ์ˆซ์ž, ์‹๋ณ„์ž ๋˜๋Š” 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
        ์ฒ˜์Œ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•จ. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์€ ๋‚˜์ค‘์— ์ฝ”๋“œ์—์„œ ์ง€์—ฐ์„ ์ œ์–ดํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ ๋ ˆ์ง€์Šคํ„ฐ ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•จ. ์ด ๋ณ€์ˆ˜๋“ค์€ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์—์„œ ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๊ฐ’์ด ํ• ๋‹น๋จ x = 0;์€ ์ง€์—ฐ ์ œ์–ด๊ฐ€ ์—†์ด ์ฆ‰์‹œ ์‹คํ–‰๋จ #10 y = 1;์€ y = 1์ด๋ผ๋Š” ๋ช…๋ น์˜ ์‹คํ–‰์„ 10 ์‹œ๊ฐ„ ๋‹จ์œ„๋งŒํผ ์ง€์—ฐ์‹œํ‚ด #latency z = 0;์€ latency ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ฐ์„ ์ œ์–ดํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ 20 ์‹œ๊ฐ„ ๋‹จ์œ„์˜ ์ง€์—ฐ์ด ์ ์šฉ๋จ #(latency + delta) p = 1;์€ latency์™€ delta ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ํ‘œํ˜„์‹์œผ๋กœ ์ง€์—ฐ์„ ๊ณ„์‚ฐํ•จ. ๊ณ„์‚ฐ๋œ ์‹œ๊ฐ„๋งŒํผ p = 1 ๋ช…๋ น์˜ ์‹คํ–‰์ด ์ง€์—ฐ๋จ #y x = x + 1;์€ y ๊ฐ’(๋ณ€์ˆ˜ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜)์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ง€์—ฐ์„ ์ œ์–ดํ•จ. ์‹ค์ œ ์ง€์—ฐ ์‹œ๊ฐ„์€ y์˜ ํ˜„์žฌ ๊ฐ’์— ๋”ฐ๋ผ ๋‹ค๋ฆ„ #(4:5:6) g = 0;์€ ์ตœ์†Œ, ์ผ๋ฐ˜, ์ตœ๋Œ€ ์ง€์—ฐ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•จ. ์ด๋Ÿฌํ•œ ๊ฐ’๋“ค์€ ๋ณดํ†ต ๋ฌผ๋ฆฌ์  ๊ตฌํ˜„์˜ ๋ณ€๋™์„ฑ์„ ๋ฐ˜์˜ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฒŒ์ดํŠธ ๋ ˆ๋ฒจ ๋ชจ๋ธ๋ง์—์„œ ์ž์ฃผ ๋…ผ์˜๋จ
  • ํ• ๋‹น ๋‚ด ์ง€์—ฐ ์ œ์–ด
    • ํ• ๋‹น ์—ฐ์‚ฐ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์ง€์—ฐ์„ ํ• ๋‹นํ•จ
      • // ๋ ˆ์ง€์Šคํ„ฐ ๋ณ€์ˆ˜ ์ •์˜ 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
        Verilog์—์„œ ๋‚ด๋ถ€ ํ• ๋‹น ์ง€์—ฐ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ณด์—ฌ์คŒ. ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ํŠน์ • ์ง€์—ฐ ์ดํ›„์— ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•จ. ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ๋ณ€์ˆ˜ ๊ฐ’์˜ ๋ณ€ํ™”๊ฐ€ ์ตœ์ข… ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•จ
  • ์ œ๋กœ ์ง€์—ฐ ์ œ์–ด
    • ๋ฌธ์ด ํ•ด๋‹น ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฌธ๋“ค ์ดํ›„์— ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž„
    • ๊ฒฝ์Ÿ ์ƒํ™ฉ์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ
      • initial begin x = 0; y = 0; end initial begin #0 x = 1; //์ œ๋กœ ์ง€์—ฐ ์ œ์–ด #0 y = 1; end
        Verilog ์‹œ๋ฎฌ๋ ˆ์ด์…˜์—์„œ "์ œ๋กœ ์ง€์—ฐ ์ œ์–ด"๋ฅผ ๋ณด์—ฌ์คŒ. ์ดˆ๊ธฐ ๋ธ”๋ก์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์ž‘ ์‹œ ์‹คํ–‰๋˜๋ฉฐ, ๋‘ ๋ฒˆ์งธ initial ๋ธ”๋ก ๋‚ด์˜ #0์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์ด ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ํ•ด๋‹น ํ• ๋‹น์„ ์‹คํ–‰ํ•˜๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ. ์—ฌ๊ธฐ์„œ x์™€ y ๋ณ€์ˆ˜๋Š” ์ง€์—ฐ ์—†์ด ์ฆ‰์‹œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ. ์ด๋Š” ์‹œ๋ฎฌ๋ ˆ์ด์…˜์˜ ํŠน์ • ์‹œ์ ์—์„œ ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์ด ๋™์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ๋ชจ๋ธ๋งํ•  ๋•Œ ์œ ์šฉํ•จ
  • #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์—์„œ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•จ. @(clock)์€ clock ์‹ ํ˜ธ์˜ ์–ด๋–ค ๋ณ€ํ™”์—๋„ ๋ฐ˜์‘ํ•˜์—ฌ q = d๋ฅผ ์‹คํ–‰ํ•จ. @(posedge clock)๊ณผ @(negedge clock)์€ clock ์‹ ํ˜ธ์˜ ๊ธ์ •์  ๋ณ€ํ™”์™€ ๋ถ€์ •์  ๋ณ€ํ™”์— ๊ฐ๊ฐ ๋ฐ˜์‘ํ•จ. ๋งˆ์ง€๋ง‰ ์ค„์€ clock์˜ ๊ธ์ •์ ์ธ ์—์ง€์—์„œ d๊ฐ€ 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]};
        ๋ฐ์ดํ„ฐ ๋ฒ„ํผ๊ฐ€ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ ํŒจํ‚ท ์ˆ˜์‹  ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ๋ฅผ ์„ค๋ช…ํ•จ. event received_data;๋Š” "received_data"๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•จ. always @(posedge clock) ๋ธ”๋ก์€ ํด๋Ÿญ์˜ ๊ธ์ •์  ์—์ง€์—์„œ ๋งค๋ฒˆ ํ™œ์„ฑํ™”๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์ด ๊ฐ์ง€๋˜๋ฉด "received_data" ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•จ. ๋˜ ๋‹ค๋ฅธ always @(received_data) ๋ธ”๋ก์€ ์ด ์ด๋ฒคํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋  ๋•Œ ํ™œ์„ฑํ™”๋˜์–ด, ๋ฐ›์€ ๋„ค ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ "data_buf"์— ์ €์žฅํ•จ. ์ด ๊ตฌ์กฐ๋Š” ํŠน์ • ์กฐ๊ฑด์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ , ์ด์— ๋”ฐ๋ผ ํŠน์ • ์ž‘์—…(์ด ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ ์ €์žฅ)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•˜๋“œ์›จ์–ด ๋กœ์ง์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•จ
  • ์ด๋ฒคํŠธ 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
        ๋น„๋™๊ธฐ ์žฌ์„ค์ •์ด ์žˆ๋Š” ๋ ˆ๋ฒจ ๊ฐ์ง€ ๋ž˜์น˜(level-sensitive latch)์˜ ๋™์ž‘์„ ์„ค๋ช…ํ•จ. ๋ ˆ๋ฒจ ๊ฐ์ง€ ๋ž˜์น˜๋Š” ํŠน์ • ์กฐ๊ฑด์—์„œ ์ž…๋ ฅ์„ "์žก์•„" ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋””์ง€ํ„ธ ํšŒ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์ž„ always @(reset or clock or d) : ์ด ๊ตฌ๋ฌธ์€ 'reset', 'clock', ๋˜๋Š” 'd' ์‹ ํ˜ธ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ทธ ์ดํ›„์˜ ์ฝ”๋“œ ๋ธ”๋ก์ด ์‹คํ–‰๋˜๋„๋ก ๋งŒ๋“ฌ ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์˜ ์กฐ๊ฑด๋ฌธ if (reset) : ์ด ์กฐ๊ฑด๋ฌธ์€ 'reset' ์‹ ํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”(์ผ๋ฐ˜์ ์œผ๋กœ ๋†’์€ ์ „์•• ๋ ˆ๋ฒจ)๋˜๋ฉด ์‹คํ–‰๋จ. ์—ฌ๊ธฐ์„œ 'q' ์ถœ๋ ฅ์„ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ž˜์น˜๋ฅผ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ์žฌ์„ค์ •ํ•จ else if (clock) : ์ด ์กฐ๊ฑด๋ฌธ์€ 'clock' ์‹ ํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ ์‹คํ–‰๋จ. 'd'์˜ ํ˜„์žฌ ๊ฐ’์„ 'q'์— ํ• ๋‹นํ•จ์œผ๋กœ์จ, 'd' ์ž…๋ ฅ๊ฐ’์ด ๋ž˜์น˜์˜ ํ˜„์žฌ ์ƒํƒœ๋กœ "์žกํžˆ๊ฒŒ" ๋จ
    • Verilog๋Š” ๊ฐ๋„ ๋ชฉ๋ก์—์„œ ์‹ ํ˜ธ๋ฅผ ๋†“์น˜์ง€ ์•Š๋„๋ก @* ๋ฐ @(*)๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ํŠน์ˆ˜ ๊ธฐํ˜ธ๋ฅผ ์ œ๊ณตํ•จ
ย 

๋ ˆ๋ฒจ ๊ฐ์ง€ ํƒ€์ด๋ฐ ์ œ์–ด

  • Verilog๋Š” ๋ ˆ๋ฒจ ๊ฐ์ง€ ํƒ€์ด๋ฐ ์ œ์–ด๋ฅผ ํ—ˆ์šฉํ•จ
  • ํŠน์ • ์กฐ๊ฑด์ด ์ฐธ์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฌธ์ด๋‚˜ ๋ฌธ์˜ ๋ธ”๋ก ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ธฐ๋Šฅ์ž„
  • wait ํ‚ค์›Œ๋“œ๋Š” ๋ ˆ๋ฒจ ๊ฐ์ง€ ๊ตฌ์กฐ์— ์‚ฌ์šฉ๋จ
    • always wait (count_enable) #20 count = count + 1;
      ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ํ•ญ์ƒ ๋Œ€๊ธฐํ•œ ๋‹ค์Œ ํ•ด๋‹น ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” Verilog ๊ตฌ๋ฌธ์ž„ always: ์ด ํ‚ค์›Œ๋“œ๋Š” ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก์ด ์ง€์†์ ์œผ๋กœ ๋ฐ˜๋ณต ์‹คํ–‰๋˜์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋ƒ„. ์ฆ‰, ํ•˜๋“œ์›จ์–ด์—์„œ ํŠน์ • ์กฐ๊ฑด์ด ๋งŒ์กฑ๋  ๋•Œ๋งˆ๋‹ค ๋ฐ˜์‘ํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•จ wait (count_enable): ์ด๋Š” ํŠน์ • ์‹ ํ˜ธ ๋˜๋Š” ์กฐ๊ฑด์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ช…๋ น์ž„. ์—ฌ๊ธฐ์„œ๋Š” 'count_enable'์ด๋ผ๋Š” ์‹ ํ˜ธ๊ฐ€ ์ฐธ(๋˜๋Š” ํ™œ์„ฑ ์ƒํƒœ)์ด ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•จ #20: ์ด๋Š” ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” Verilog์˜ ๋ฌธ๋ฒ•์ž„. '#20'์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ƒ์—์„œ 20 ์‹œ๊ฐ„ ๋‹จ์œ„๋งŒํผ์˜ ์ง€์—ฐ ํ›„์— ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž„. ์‹ค์ œ ํ•˜๋“œ์›จ์–ด์—์„œ๋Š” ์ด๊ฒƒ์ด ํŠน์ •ํ•œ ์‹ค์ œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์€ ์•„๋‹˜. ๊ทธ์ € ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ƒ์˜ ์ƒ๋Œ€์ ์ธ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ์˜๋ฏธํ•จ count = count + 1;: ์ด ๋ถ€๋ถ„์€ 'count' ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ช…๋ น์ž„. ์ด ๋ช…๋ น์€ 'count_enable'์ด ํ™œ์„ฑํ™”๋˜๊ณ , ๊ทธ ํ›„ 20 ์‹œ๊ฐ„ ๋‹จ์œ„๊ฐ€ ์ง€๋‚œ ํ›„์— ์‹คํ–‰๋จ ์ „๋ฐ˜์ ์œผ๋กœ ์ด ์ฝ”๋“œ๋Š” 'count_enable' ์‹ ํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ณ , ํ™œ์„ฑํ™”๋˜๋ฉด 20 ์‹œ๊ฐ„ ๋‹จ์œ„๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„ 'count' ๋ณ€์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ด. ์ด ๊ณผ์ •์ด always ๋ธ”๋ก ์•ˆ์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, 'count_enable'์ด ํ™œ์„ฑ ์ƒํƒœ๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์ด ๊ณผ์ •์ด ๋ฐ˜๋ณต๋จ
      1. count_enable์˜ ๊ฐ’์ด ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋ง๋จ
      1. count_enable์ด 0์ด๋ฉด ๋ฌธ์€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ
      1. ๋…ผ๋ฆฌ 1์ด๋ฉด, 20 ์‹œ๊ฐ„ ๋‹จ์œ„ ํ›„์— count = count+1์ด ์‹คํ–‰๋จ
      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
  • ๋งŽ์€ ์ˆ˜์˜ ๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ์ž„
    • notion image
      // 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
      s1๊ณผ s0 ์ œ์–ด ์‹ ํ˜ธ์˜ ๋‹ค์–‘ํ•œ ์กฐํ•ฉ์— ๋”ฐ๋ผ ์ž…๋ ฅ ์‹ ํ˜ธ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋””๋ฉ€ํ‹ฐํ”Œ๋ ‰์„œ์˜ ๋™์ž‘์„ ๋ชจ๋ธ๋งํ•จ. ์ œ์–ด ์‹ ํ˜ธ์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ํŠน์ • ์ถœ๋ ฅ์ด ํ™œ์„ฑํ™”๋˜๊ณ , ๋‹ค๋ฅธ ์ถœ๋ ฅ์€ ๊ณ ๋ฆฝ ์ƒํƒœ(์ฆ‰, ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ์ƒํƒœ)๊ฐ€ ๋จ. ์ด ์ฝ”๋“œ๋Š” ๋˜ํ•œ ์•Œ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ์ •์˜๋˜์ง€ ์•Š์€ ์ œ์–ด ์‹ ํ˜ธ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ œ๊ณตํ•จ
      ย 
ย 

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
      encoding ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ๋œ ํŠน์ • ๋น„ํŠธ ํŒจํ„ด์— ๋”ฐ๋ผ next_state ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์„ค์ •ํ•จ. casex๋Š” ๋น„ํŠธ ํ•„๋“œ ๋‚ด์˜ 'x'์™€ 'z' ๊ฐ’์„ ๋ฌด์‹œํ•˜๊ณ  ๋งค์นญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŠน๋ณ„ํ•œ case ๋ฌธ์ž„. ์ด๋ฅผ ํ†ตํ•ด, ์„ค๊ณ„์ž๋Š” ๋น„ํŠธ์˜ ํŠน์ • ์œ„์น˜๋งŒ ๊ณ ๋ คํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Œ. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— 'x'๋Š” "don't care" ์ƒํ™ฉ์„ ๋‚˜ํƒ€๋‚ด์–ด, ํ•ด๋‹น ์œ„์น˜์˜ ์‹ค์ œ ๋น„ํŠธ ๊ฐ’์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ
    • ์˜ˆ) encoding=4โ€™b10xz ์„ค์ •์€ next_state=3์ด ์‹คํ–‰๋˜๊ฒŒ ํ•จ
ย 

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
        ์ดˆ๊ธฐ ๋ธ”๋ก ๋‚ด์—์„œ ์‹คํ–‰๋˜๋ฉฐ, count ๋ณ€์ˆ˜์˜ ๊ฐ’์ด 128 ๋ฏธ๋งŒ์ธ ๋™์•ˆ ๊ณ„์†ํ•ด์„œ count์˜ ๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ ๋ฐ˜๋ณต ๋‹จ๊ณ„์—์„œ, ํ˜„์žฌ count ๊ฐ’์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์ด ๋กœ์ง์€ count๊ฐ€ 128์— ๋„๋‹ฌํ•˜๋ฉด ์™„๋ฃŒ๋˜๋ฉฐ, ์ด ์‹œ์ ์—์„œ ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœํ•ฉ๋‹ˆ๋‹ค.
ย 

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
        ์ฒซ ๋ฒˆ์งธ ์„น์…˜์—์„œ๋Š” ์ดˆ๊ธฐ for ๋ฃจํ”„๋ฅผ ํ†ตํ•ด count ๊ฐ’์„ 0๋ถ€ํ„ฐ 127๊นŒ์ง€ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ๊ฐ ๋‹จ๊ณ„์˜ count ๊ฐ’์„ ๋””์Šคํ”Œ๋ ˆ์ดํ•จ ๋‘ ๋ฒˆ์งธ ์„น์…˜์—์„œ๋Š” state๋ผ๋Š” ์ด๋ฆ„์˜ ์ •์ˆ˜ ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ , ์ด ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ง์ˆ˜ ์ธ๋ฑ์Šค ์œ„์น˜์— 0์„ ํ• ๋‹นํ•˜๊ณ , ํ™€์ˆ˜ ์ธ๋ฑ์Šค ์œ„์น˜์— 1์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•จ. ์—ฌ๊ธฐ์„œ ๋ฐฐ์—ด์€ 32๊ฐœ์˜ ์Šฌ๋กฏ์„ ๊ฐ€์ง€๋ฉฐ, ๊ฐ ์Šฌ๋กฏ์—๋Š” ์ •์ˆ˜ ๊ฐ’์ด ์ €์žฅ๋จ
ย 

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
        ์ฒซ ๋ฒˆ์งธ ์„น์…˜์—์„œ๋Š” count๋ฅผ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ 128๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ํ˜„์žฌ์˜ count ๊ฐ’์„ ์ถœ๋ ฅํ•จ ๋‘ ๋ฒˆ์งธ ์„น์…˜, data_buffer ๋ชจ๋“ˆ์—์„œ๋Š” ํด๋ก ์‹ ํ˜ธ์˜ ๊ธ์ •์  ์—์ง€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋™์ž‘์„ ์„ค๋ช…ํ•จ. data_start ์‹ ํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด, ์‹œ์Šคํ…œ์€ ์„ค์ •๋œ ํด๋ก ์‚ฌ์ดํด ์ˆ˜(์ด ๊ฒฝ์šฐ 8๊ฐœ) ๋™์•ˆ ๋งค ํด๋ก์˜ ๊ธ์ •์  ์—์ง€์—์„œ data ์ž…๋ ฅ์„ ๋ฒ„ํผ์˜ ํ˜„์žฌ ์ธ๋ฑ์Šค ์œ„์น˜์— ์ €์žฅํ•จ. ์ด ๊ณผ์ •์€ cycles ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋˜๋ฉฐ, ๊ฐ ํด๋ก ์‚ฌ์ดํด์—์„œ i ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํผ ๋‚ด ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™ํ•จ
ย 

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 ๊ฐ’์„ ํ• ๋‹น
      ์ฒซ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ๋Š” forever ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ก ์‹ ํ˜ธ๋ฅผ ์ƒ์„ฑํ•จ. ์ด ๋ฃจํ”„๋Š” ํด๋ก ๊ฐ’์ด ๊ณ„์†ํ•ด์„œ ๋ฐ˜์ „๋˜๋„๋ก ํ•˜์—ฌ, ์‹ค์ œ ํด๋ก ์‹ ํ˜ธ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๊ฒŒ ํ•จ. ์—ฌ๊ธฐ์„œ ํด๋ก ์ฃผ๊ธฐ๋Š” 20 ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ์„ค์ •๋จ (ํด๋ก ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๋ฐ 10 ์‹œ๊ฐ„ ๋‹จ์œ„๊ฐ€ ์†Œ์š”๋˜๋ฉฐ, ์ „์ฒด ํด๋ก ์ฃผ๊ธฐ๋ฅผ ์™„์„ฑํ•˜๋ ค๋ฉด 20 ์‹œ๊ฐ„ ๋‹จ์œ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค) ๋‘ ๋ฒˆ์งธ ์˜ˆ์ œ์—์„œ๋Š” forever ๋ฃจํ”„์™€ @(posedge clock) ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ๋™๊ธฐํ™”ํ•จ. ํด๋ก ์‹ ํ˜ธ์˜ positive edge(์ƒ์Šน ์—์ง€)๋งˆ๋‹ค y์˜ ํ˜„์žฌ ๊ฐ’์ด x์— ํ• ๋‹น๋จ. ์ด๋Š” y์—์„œ x๋กœ์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ํด๋ก ์‹ ํ˜ธ์˜ ์ƒ์Šน ์—์ง€์— ๋™๊ธฐํ™”๋จ์„ ์˜๋ฏธํ•จ
ย 

๋ธ”๋ก ์œ ํ˜•

  • ๋ธ”๋ก์—๋Š” ์ˆœ์ฐจ ๋ธ”๋ก๊ณผ ๋ณ‘๋ ฌ ๋ธ”๋ก ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Œ
  • ์ˆœ์ฐจ ๋ธ”๋ก (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
        ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋Š” ์ง€์—ฐ ์—†์ด ์ˆœ์ฐจ ๋ธ”๋ก์ด ์‹คํ–‰๋จ. ์ด๋Š” x, y, z, w๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์— ํ• ๋‹น๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ. 'initial' ๋ธ”๋ก์€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์ž‘ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋จ ๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋Š” ์ง€์—ฐ(delay)์ด ์ถ”๊ฐ€๋œ ์ˆœ์ฐจ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•จ. # ๊ธฐํ˜ธ ๋‹ค์Œ์˜ ์ˆซ์ž๋Š” ์ง€์—ฐ ์‹œ๊ฐ„(์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„ ๋‹จ์œ„)์„ ๋‚˜ํƒ€๋ƒ„. ์˜ˆ๋ฅผ ๋“ค์–ด, #5๋Š” 5 ๋‹จ์œ„์˜ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ์˜๋ฏธํ•จ. ์ด ์ง€์—ฐ๋“ค์€ ๊ฐ ํ• ๋‹น ์‚ฌ์ด์— ๋ฐœ์ƒํ•˜๋ฏ€๋กœ, y, z, w์˜ ํ• ๋‹น์€ ๊ฐ๊ฐ ์ง€์ •๋œ ์‹œ๊ฐ„ ์ง€์—ฐ ํ›„์— ๋ฐœ์ƒํ•จ. ์ด๋กœ ์ธํ•ด ๊ฐ ํ• ๋‹น์˜ ์™„๋ฃŒ ์‹œ๊ฐ„์ด ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ๋‚จ
  • ๋ณ‘๋ ฌ ๋ธ”๋ก (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 // ๊ฒฝ์Ÿ ์ƒํƒœ ๋ฐœ์ƒ!
        ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋Š” 'fork-join' ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ‘๋ ฌ ๋ธ”๋ก์ด ์žˆ์Œ. ๊ฐ ํ• ๋‹น๋ฌธ์€ ์ง€์ •๋œ ์ง€์—ฐ ํ›„์— ๋™์‹œ์— ์‹คํ–‰๋˜์ง€๋งŒ, ๊ฐ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ• ๋‹น๋ฌธ์ด ์™„๋ฃŒ๋˜๋Š” ์‹œ๊ฐ„๋„ ์„œ๋กœ ๋‹ค๋ฆ„ ๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ๋Š” ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์˜๋„์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ณ‘๋ ฌ ๋ธ”๋ก์„ ๋ณด์—ฌ์คŒ. 'fork-join' ๊ตฌ์กฐ๋Š” ๋ณ‘๋ ฌ ์‹คํ–‰์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด ๊ฒฝ์šฐ์—๋Š” 'x'์™€ 'y'๊ฐ€ ์„ค์ •๋œ ํ›„ 'z'์™€ 'w'๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์— ๊ณ„์‚ฐ๋จ. ๊ทธ๋Ÿฌ๋‚˜ 'x'์™€ 'y'์˜ ํ• ๋‹น์ด ๋™์‹œ์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 'z'์™€ 'w'์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ๊ฐ’์€ ๋ถˆ๋ถ„๋ช…ํ•จ. ์ด๋Š” "๊ฒฝ์Ÿ ์ƒํƒœ"๋ผ๊ณ  ์•Œ๋ ค์ง„ ์ƒํ™ฉ์„ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ์ด๋Š” ํšŒ๋กœ์˜ ๋™์ž‘์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ž„
ย 

๋ธ”๋ก์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ๋“ค

  • ์ค‘์ฒฉ๋œ ๋ธ”๋ก
    • ๋ธ”๋ก์€ ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ˆœ์ฐจ ๋ธ”๋ก๊ณผ ๋ณ‘๋ ฌ ๋ธ”๋ก์ด ํ˜ผํ•ฉ๋  ์ˆ˜ ์žˆ์Œ
  • ๋ช…๋ช…๋œ ๋ธ”๋ก
    • ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ๋ช…๋ช…๋œ ๋ธ”๋ก์— ๋Œ€ํ•ด ์„ ์–ธ๋  ์ˆ˜ ์žˆ์Œ
    • ๋ช…๋ช…๋œ ๋ธ”๋ก์€ ๋””์ž์ธ ๊ณ„์ธต์˜ ์ผ๋ถ€ (๊ณ„์ธต์  ์ด๋ฆ„ ์ฐธ์กฐ)
    • ๋ช…๋ช…๋œ ๋ธ”๋ก์€ ๋น„ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ์Œ
      • // ๋ช…๋ช…๋œ ๋ธ”๋ก ์˜ˆ์ œ 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
        16๋น„ํŠธ ๋ฒกํ„ฐ 'flag'๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ๋กœ '1' ๊ฐ’์„ ๊ฐ€์ง„ ๋น„ํŠธ์˜ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•จ. 'flag'์˜ ๊ฐ ๋น„ํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉฐ, ์ฐธ์ธ ๋น„ํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด, ๊ทธ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ณ  'block1' ๋ผ๋ฒจ์ด ๋ถ™์€ while ๋ฃจํ”„๋ฅผ 'disable' ๋ช…๋ น์–ด๋กœ ์ค‘๋‹จํ•จ. ์ด๋Š” ๋” ์ด์ƒ์˜ ๊ฒ€์ƒ‰ ์—†์ด ์ฆ‰์‹œ ๋ฃจํ”„๋ฅผ ๋น ์ ธ๋‚˜๊ฐ€๊ฒŒ ํ•จ. 'i'๋Š” ๋น„ํŠธ ์œ„์น˜๋ฅผ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋งค ๋ฐ˜๋ณต์—์„œ 1์”ฉ ์ฆ๊ฐ€ํ•จ
ย 

์ œ๋„ˆ๋ ˆ์ดํŠธ ๋ธ”๋ก

  • ์ œ๋„ˆ๋ ˆ์ดํŠธ ๋ฌธ์€ 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
        ์ด ์ฝ”๋“œ๋Š” "generate" ๋ธ”๋ก๊ณผ "for" ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๋ชจ๋“  ๋น„ํŠธ ์œ„์น˜์— ๋Œ€ํ•ด xor ๊ฒŒ์ดํŠธ๋ฅผ ์ƒ์„ฑํ•จ. ์ด๋ฅผ ํ†ตํ•ด ๋‘ ์ž…๋ ฅ ๋ฒ„์Šค์˜ ๊ฐ ๋น„ํŠธ์— ๋Œ€ํ•œ XOR ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•จ. ๋˜ํ•œ, ์ฝ”๋“œ์—์„œ๋Š” always ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ฒด ๋ฐฉ๋ฒ•๋„ ์ฃผ์„์œผ๋กœ ์ œ์‹œํ•˜๊ณ  ์žˆ์Œ. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ ๋น„ํŠธ ์œ„์น˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•ด XOR ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ
      • ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ์ œ๋„ˆ๋ ˆ์ดํŠธ ๋ฃจํ”„์˜ ์ฝ”๋“œ๋ฅผ ํ’€์–ด ํ—ค์นจ
      • 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
        ์ฝ”๋“œ๋Š” 'generate' ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ณฑ์…ˆ๊ธฐ๋ฅผ ์ƒ์„ฑํ•จ. ์ž…๋ ฅ ๋น„ํŠธ ๋„ˆ๋น„๊ฐ€ 8 ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ์—๋Š” 'cla_multiplier'๋ฅผ, ๊ทธ ์ด์ƒ์ธ ๊ฒฝ์šฐ์—๋Š” ๋” ํšจ์œจ์ ์ธ 'tree_multiplier'๋ฅผ ์‚ฌ์šฉํ•จ. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋‚˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ•˜๋“œ์›จ์–ด ๊ตฌ์กฐ๋ฅผ ๋™์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
ย 

์ œ๋„ˆ๋ ˆ์ดํŠธ 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
        "generate"์™€ "case" ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ N์˜ ๊ฐ’์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ€์‚ฐ๊ธฐ๋ฅผ ์ƒ์„ฑํ•จ. ์˜ˆ๋ฅผ ๋“ค์–ด, N์ด 1์ด๋ฉด 1๋น„ํŠธ ๊ฐ€์‚ฐ๊ธฐ๋ฅผ, N์ด 2์ด๋ฉด 2๋น„ํŠธ ๊ฐ€์‚ฐ๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” N๋น„ํŠธ ์บ๋ฆฌ ๋ฃฉ์–ดํ—ค๋“œ ๊ฐ€์‚ฐ๊ธฐ(carry look-ahead adder)๋ฅผ ์ƒ์„ฑํ•จ. ์ด๋Ÿฌํ•œ ๊ฐ€์‚ฐ๊ธฐ๋Š” ๋ง์…ˆ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๋” ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์—ฌ๋Ÿฌ ๋น„ํŠธ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•จ
ย 

์˜ˆ์ œ #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๊ฐœ์˜ ์„ ํƒ ์‹ ํ˜ธ(s1, s0)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 4๊ฐœ์˜ ์ž…๋ ฅ(i0, i1, i2, i3) ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ์ถœ๋ ฅ(out)์œผ๋กœ ๋‚ด๋ณด๋ƒ„. ์„ ํƒ ์‹ ํ˜ธ์— ๋”ฐ๋ผ ํ•ด๋‹นํ•˜๋Š” ์ž…๋ ฅ์ด ์ถœ๋ ฅ์œผ๋กœ ์—ฐ๊ฒฐ๋จ. 'default' ์ ˆ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•œ ๊ฒƒ์œผ๋กœ, ํ•ด๋‹น ๊ฒฝ์šฐ์—๋Š” ์ถœ๋ ฅ์ด ์ •์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ(x)๊ฐ€ ๋จ
ย 

์˜ˆ์ œ #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
        ์ด ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์€ ์ˆœ์ฐจ์  ๋…ผ๋ฆฌ ํšŒ๋กœ๋ฅผ ์„ค๋ช…ํ•จ. clear ์‹ ํ˜ธ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ์นด์šดํ„ฐ๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋จ. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ํด๋Ÿญ์˜ ์Œ์˜ ์—์ง€๋งˆ๋‹ค ์นด์šดํ„ฐ๋Š” 1์”ฉ ์ฆ๊ฐ€ํ•จ. ๋น„๋ธ”๋กœํ‚น ํ• ๋‹น(<=)์€ ์ˆœ์ฐจ ๋…ผ๋ฆฌ์—์„œ ํ˜„์žฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ๊ฐ„ ๋‹จ๊ณ„์—์„œ ๋‹ค๋ฅธ ํ• ๋‹น์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์‹ ํ˜ธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ๋จ. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํ•œ ํ• ๋‹น(=)์ด ์‚ฌ์šฉ๋˜์—ˆ์ง€๋งŒ, ๋ณต์žกํ•œ ์„ค๊ณ„์—์„œ๋Š” ๋น„๋ธ”๋กœํ‚น ํ• ๋‹น์ด ๊ถŒ์žฅ๋จ
      ย