04 Modules and Ports
๐Ÿ”ฎ

04 Modules and Ports

Description
Date
Sep 18, 2023
URL
์ƒํƒœ
Done
Tags
Digital Design

๋ชจ๋“ˆ

  • ๋ชจ๋“ˆ์€ ๋ช…ํ™•ํ•œ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ธฐ๋ณธ ๊ตฌ์ถ• ๋ธ”๋ก์ž„
    • ๋ชจ๋“ˆ ์ด๋ฆ„, ํฌํŠธ ๋ชฉ๋ก, ํฌํŠธ ์„ ์–ธ, ์„ ํƒ์  ๋งค๊ฐœ๋ณ€์ˆ˜
    • ๋ณ€์ˆ˜ ์„ ์–ธ, ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๋ฌธ์žฅ, ํ•˜์œ„ ๋ชจ๋“ˆ์˜ ์ธ์Šคํ„ด์Šคํ™”, ํ–‰๋™ ๋ธ”๋ก, ์ž‘์—…, ๋ฐ ํ•จ์ˆ˜๋“ค
  • SR ๋ž˜์น˜ ์˜ˆ์‹œ
ย 

ํฌํŠธ ๋ชฉ๋ก

  • ํฌํŠธ(ํ„ฐ๋ฏธ๋„๋กœ ๋ถˆ๋ฆผ)๋Š” ๋ชจ๋“ˆ์ด ๊ทธ ํ™˜๊ฒฝ๊ณผ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•จ
    • ๋ชจ๋“ˆ์˜ ๋‚ด๋ถ€๋Š” ํ™˜๊ฒฝ์—๊ฒŒ ๋ณด์ด์ง€ ์•Š์Œ
    • ํ™˜๊ฒฝ์€ ํฌํŠธ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ชจ๋“ˆ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • 4-๋น„ํŠธ ํ’€ ์• ๋” ์˜ˆ์‹œ
    • Top: ์ตœ์ƒ์œ„ ๋ชจ๋“ˆ๋กœ ํฌํŠธ๊ฐ€ ์—†์Œ
    • fulladd4: ํ’€ ์• ๋” ๋ชจ๋“ˆ์ด๋ฉฐ Top ์•„๋ž˜์—์„œ ์ธ์Šคํ„ด์Šคํ™”๋จ
    • fulladd4๋Š” ํฌํŠธ a, b, c_in์— ์ž…๋ ฅ์„ ๋ฐ›๊ณ  ํฌํŠธ sum, c_out์—์„œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•จ
ย 

ํฌํŠธ ์„ ์–ธ

  • ๋ชจ๋“  ํฌํŠธ๋Š” ๋ชจ๋“ˆ ๋‚ด์˜ ํฌํŠธ ๋ชฉ๋ก์—์„œ ์„ ์–ธ๋˜์–ด์•ผ ํ•จ
    • ํฌํŠธ ๋ชฉ๋ก์˜ ๊ฐ ํฌํŠธ๋Š” ํฌํŠธ ์‹ ํ˜ธ์˜ ๋ฐฉํ–ฅ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ž…๋ ฅ, ์ถœ๋ ฅ, ๋˜๋Š” inout์œผ๋กœ ์ •์˜๋จ
      • verilog ํ‚ค์›Œ๋“œ
        ํฌํŠธ ํƒ€์ž…
        input
        ์ž…๋ ฅ ํฌํŠธ
        output
        ์ถœ๋ ฅ ํฌํŠธ
        inout
        ์–‘๋ฐฉํ–ฅ ํฌํŠธ
  • 4-๋น„ํŠธ ํ’€ ์• ๋” ์˜ˆ์‹œ
notion image
module fulladd4(sum, c_out, a, b, c_in); //ํฌํŠธ ์„ ์–ธ ๋ถ€๋ถ„ ์‹œ์ž‘ output [3:0] sum; output c_cout; input [3:0] a, b; input c_in; //ํฌํŠธ ์„ ์–ธ ๋ถ€๋ถ„ ๋ ... <๋ชจ๋“ˆ ๋‚ด๋ถ€> ... endmodule module fulladd4(output reg [3:0] sum, output reg c_out, input [3:0] a, b, input c_in); ... โ€น๋ชจ๋“ˆ ๋‚ด๋ถ€> ... endmodule
ANSI C ์Šคํƒ€์ผ ํฌํŠธ ์„ ์–ธ ๊ตฌ๋ฌธ
ย 

ํฌํŠธ ์—ฐ๊ฒฐ ๊ทœ์น™

์ž…๋ ฅ

  • ๋‚ด๋ถ€์ ์œผ๋กœ, ์ž…๋ ฅ ํฌํŠธ๋Š” ํ•ญ์ƒ net ํƒ€์ž…์ด์–ด์•ผ ํ•จ
  • ์™ธ๋ถ€์ ์œผ๋กœ, ์ž…๋ ฅ์€ reg ๋˜๋Š” net์ธ ๋ณ€์ˆ˜์— ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ
ย 

์ถœ๋ ฅ

  • ๋‚ด๋ถ€์ ์œผ๋กœ, ์ถœ๋ ฅ ํฌํŠธ๋Š” reg ๋˜๋Š” net ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ์Œ
  • ์™ธ๋ถ€์ ์œผ๋กœ, ์ถœ๋ ฅ์€ ํ•ญ์ƒ net์— ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•จ (์ ˆ๋Œ€ reg ํƒ€์ž…์ด ์•„๋‹˜!)
ย 

์–‘๋ฐฉํ–ฅ

  • Inout ํฌํŠธ๋Š” ํ•ญ์ƒ net ํƒ€์ž…์ด์–ด์•ผ ํ•จ
notion image
ย 

๋„ˆ๋น„ ์ผ์น˜

  • ๋ชจ๋“ˆ ๊ฐ„ ํฌํŠธ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค ๋•Œ ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ ํฌํŠธ ๋น„ํŠธ ํญ์ด ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•จ
ย 

์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ํฌํŠธ

  • Verilog๋Š” ํŠน์ •ํ•œ ์ด์œ ๋กœ ํฌํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š๊ฒŒ ํ—ˆ์šฉํ•จ
ย 

๋ถ€์ ์ ˆํ•œ ํฌํŠธ ์—ฐ๊ฒฐ์˜ ์˜ˆ์‹œ

module Top; // ์—ฐ๊ฒฐ ๋ณ€์ˆ˜ ์„ ์–ธ reg [3:0]A, B; reg C_IN; reg [3:0] SUM; // ์ด ๋ถ€๋ถ„์€ net ํƒ€์ž…์ด์–ด์•ผ ํ•จ (์˜ˆ: wire) wire c_OUT; // fulladd4๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ , ์ด๋ฅผ fa0์ด๋ผ ๋ถ€๋ฆ„ fulladd4 fa0 (SUM, C_OUT, A, B, C_IN) ; // ๋ถ€์ ์ ˆํ•œ ์—ฐ๊ฒฐ์ธ๋ฐ, ์ด๋Š” fulladd4 ๋ชจ๋“ˆ์˜ ์ถœ๋ ฅ ํฌํŠธ sum์ด Top ๋ชจ๋“ˆ์˜ ๋ ˆ์ง€์Šคํ„ฐ ๋ณ€์ˆ˜ SUM์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž„ // ์ผ๋ฐ˜์ ์œผ๋กœ ์ถœ๋ ฅ ํฌํŠธ๋Š” wire ํƒ€์ž…๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ . . <stimulus> . . endmodule
module fulladd4 (sum, c_out, a, b, c_in); // ํฌํŠธ ์„ ์–ธ ๋ถ€๋ถ„ ์‹œ์ž‘ output [3:0] sum; output c_cout; // input [3:0] a, b; input c_in; // ํฌํŠธ ์„ ์–ธ ๋ถ€๋ถ„ ๋ ... <module internals> ... endmodule
ย 

์™ธ๋ถ€ ์‹ ํ˜ธ์— ํฌํŠธ ์—ฐ๊ฒฐํ•˜๊ธฐ

  • ์ •๋ ฌ๋œ ๋ชฉ๋ก์œผ๋กœ ์—ฐ๊ฒฐํ•˜๊ธฐ (์œ„์น˜ ๋งคํ•‘)
    • ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•˜๋Š” ์‹ ํ˜ธ๋“ค์€ ๋ชจ๋“ˆ ์ •์˜์—์„œ ํฌํŠธ ๋ชฉ๋ก๊ณผ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šคํ™”์—์„œ ๋‚˜ํƒ€๋‚˜์•ผ ํ•จ
      • ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด argument์˜ ์ˆœ์„œ๊ฐ€ ๊ฐ™์•„์•ผ ํ•จ
        • ... fulladd4 fa_ordered(SUM, C_OUT, A, B, C_IN); ...
          ... module fulladd4(sum, c_out, a, b, c_in); ...
  • ์ด๋ฆ„์œผ๋กœ ํฌํŠธ ์—ฐ๊ฒฐํ•˜๊ธฐ (์ด๋ฆ„ ๋งคํ•‘)
    • ํฐ ๋””์ž์ธ์˜ ํฌํŠธ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ฒƒ์€ ์‹ค์šฉ์ ์ด์ง€ ์•Š์Œ
      • .c_out(C_OUT): fa_byname ์ธ์Šคํ„ด์Šค์˜ c_out ํฌํŠธ๋ฅผ C_OUT ์‹ ํ˜ธ์— ์—ฐ๊ฒฐํ•จ
      • .sum(SUM): fa_byname ์ธ์Šคํ„ด์Šค์˜ sum ํฌํŠธ๋ฅผ SUM ์‹ ํ˜ธ์— ์—ฐ๊ฒฐํ•จ
      • .b(B): fa_byname ์ธ์Šคํ„ด์Šค์˜ b ํฌํŠธ๋ฅผ B ์‹ ํ˜ธ์— ์—ฐ๊ฒฐํ•จ
      • .c_in(C_IN): fa_byname ์ธ์Šคํ„ด์Šค์˜ c_in ํฌํŠธ๋ฅผ C_IN ์‹ ํ˜ธ์— ์—ฐ๊ฒฐํ•จ
      • .a(A): fa_byname ์ธ์Šคํ„ด์Šค์˜ a ํฌํŠธ๋ฅผ A ์‹ ํ˜ธ์— ์—ฐ๊ฒฐํ•จ
      • // ๋ชจ๋“ˆ fa_byname์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์‹ ํ˜ธ๋ฅผ ์ด๋ฆ„์œผ๋กœ ํฌํŠธ์— ์—ฐ๊ฒฐํ•จ fulladd4 fa_byname (.c_out(C_OUT), .sum(SUM), .b(B), .c_in(C_IN), .a(A));
    • ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ํฌํŠธ๋Š” ์ƒ๋žต๋  ์ˆ˜ ์žˆ์Œ
      • // ๋ชจ๋“ˆ fa_byname์„ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ์‹ ํ˜ธ๋ฅผ ์ด๋ฆ„์œผ๋กœ ํฌํŠธ์— ์—ฐ๊ฒฐ fulladd4 fa_byname (.sum(SUM), .b(B), .c_in(C_IN), .a(A));
      ย 

๊ณ„์ธต์  ์ด๋ฆ„ (Hierarchical Names)

  • ๊ณ„์ธต์  ์ด๋ฆ„์€ ๊ฐ ๊ณ„์ธต ์ˆ˜์ค€์— ๋Œ€ํ•ด ์ (" . ")์œผ๋กœ ๊ตฌ๋ถ„๋œ ์‹๋ณ„์ž ๋ชฉ๋ก์ž„
    • ์˜ˆ๋ฅผ ๋“ค์–ด, top_module.sub_module.signal_name์€ signal_name ์‹ ํ˜ธ๊ฐ€ sub_module์˜ ํ•˜์œ„ ๋ชจ๋“ˆ ๋‚ด์— ์žˆ๊ณ , ๊ทธ ๋ชจ๋“ˆ์ด top_module์˜ ์ƒ์œ„ ๋ชจ๋“ˆ ๋‚ด์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ„
  • SR ๋ž˜์น˜ ๋””์ž์ธ ๊ณ„์ธต ์˜ˆ์ œ
    • ์ตœ์ƒ์œ„(๋ฃจํŠธ) ๋ชจ๋“ˆ์€ "stimulus"๋กœ ๋ช…๋ช…๋  ์ˆ˜ ์žˆ์Œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ „์ฒด ์„ค๊ณ„์—์„œ "stimulus"๋ผ๋Š” ๋ชจ๋“ˆ์€ ๊ฐ€์žฅ ์ƒ์œ„ ๊ณ„์ธต์— ์œ„์น˜ํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์„ ๊ตฌ๋™ํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ์Šคํƒ€๋ฌด๋ฆฌ์Šค(stimulus)๋ฅผ ์ œ๊ณตํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ. ์ด๋Ÿฐ ๊ฒฝ์šฐ "stimulus"๋Š” ๊ณ„์ธต ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ์ƒ์œ„์— ์œ„์น˜ํ•จ
    • notion image