Verilog HDL
2007/06/15 15:03
http://blog.naver.com/PostPrint.nhn?blogId=babojay&logNo=40038759144#
Chapter 4.
Modules & Ports
*Objectives
 - ModuleÁ¤ÀÇÀÇ ±¸¼º¿ä¼Òµé : 
Module name, Port lists, Parameters, Variables ¼±¾ð,
                                 
 Dataflow, Behavioral, ÇÏÀ§ module instantiation, Task & 
Functions
 - Port list¸¦ Á¤ÀÇÇÏ°í ¼±¾ðÇÏ´Â ¹æ¹ý
 - Module instantiation¿¡¼ÀÇ 
port ¿¬°á ±ÔÄ¢
 - PortÀÇ ¿ÜºÎ ¿¬°á ¹æ¹ý : List ¼ø¼, port name
 - Hierachical 
name referencing
4.1 Modules

±×¸² 4-1 Components of Module in Verilog
 - module·Î ½ÃÀÛÇÏ¿© endmodule·Î ³¡³´Ù.
 - Port list, Port declarationÀº 
port°¡ Á¸ÀçÇÒ ¶§¸¸ »ç¿ë
 - ³»ºÎ 5°¡Áö block(Variable declaration, dataflow, ÇÏÀ§ 
module instantiation, behavioral, tasks & functions)Àº ¼ø¼¿¡ »ó°ü¾øÀÌ ¸ðµâ³» ¾îµð¿¡µç ¿Ã ¼ö 
ÀÖ´Ù.
SR latchÀÇ ¿¹·Î ¾Ë¾Æº»´Ù.

±×¸² 4-2 SR latch
Ex)
    module 
SR_latch(Q, Qbar, Sbar, Rbar); // module name(SR_latch)
// port lists(Q, Qbar...)
    output Q, 
Qbar;                        // 
port declaration
    input Sbar, Rbar;
    nand n1(Q, Sbar, 
Qbar);           // ÇÏÀ§ moduleÀÇ 
instantiation
    nand n2(Qbar, Rbar, Q);
endmodule // end of SR_latch
    module 
Top;        // Stimulus ¸ðµâ.  port list, 
port declaration »ý·«
    wire q, 
qbar;       // wire, reg, variables 
declaration
    reg set, reset;
SR_latch m1(q, qbar, ~set, ~reset); // ÇÏÀ§ moduleÀÇ instantiation
   
 initial                    // 
behavioral block, initial
    begin  
        $monitor($time, " set = %b, reset 
= %b, q = %b\n", set, reset, q);
        
set = 0; reset = 0;
        #5 reset = 
1;
        #5 reset = 
0;
        #5 set = 
1;
    end
endmodule // end of Top
   * SR_latch ¸ðµâ Á¤ÀÇ¿¡¼´Â variable, dataflow, behavioral blockÀÌ 
»ý·«
  ** Top ¸ðµâ(Stimulus)¿¡´Â port list, port declarationÀÌ ¾ø´Â ¹Ý¸é, 
variable(wire, reg) ¼±¾ð, behavioral ±¸¹®ÀÌ 
Æ÷ÇԵǾú´Ù.
 *** module, module 
name, endmoduleÀ» Á¦¿ÜÇÑ ¸ðµç ºÎºÐÀº 
»ý·«°¡´ÉÇÏ´Ù.
4.2 Ports
- ModuleÀÌ ¿ÜºÎ¿Í ¼ÒÅëÇÒ ¼ö ÀÖµµ·Ï ÇÏ´Â interface.
4.2.1 List of Ports
 - ModuleÀº »ý·«°¡´ÉÇÑ port ¸®½ºÆ®¸¦ Æ÷ÇÔÇÑ´Ù.
 - ¿ÜºÎ¿ÍÀÇ ¾î¶°ÇÑ ½ÅÈ£±³È¯µµ ¾ø´Â °æ¿ì port´Â 
Çʿ䰡 ¾ø°Ô µÇ°í ±× listµµ ¾ø´Ù.

±×¸² 4-3. I/O ports for Top & Full Adder
 - Top¸ðµâ ¾È¿¡ fulladder°¡fulladd4¶ó´Â À̸§À¸·Î instantiationµÇ¾î 
ÀÖ´Ù.
 - a, b, c_inÀº input, sum, c_outÀº outputÀ¸·Î Á¤ÀÇ µÇ¾î ÀÖ´Ù.
 - 
Top¸ðµâÀº ¿ÜºÎ¿Í ¾î¶°ÇÑ ½ÅÈ£±³È¯µµ ¾øÀ¸¹Ç·Î port¿Í port list°¡ ¾ø´Ù.
Ex)
    module fulladd4(sum, c_out, a, b, 
c_in);
    module Top;
4.2.2 Port Declaration
 - ¸®½ºÆ®¿¡ ÀÖ´Â ¸ðµç port´Â ´ÙÀ½°ú 
°°Àº typeÀ¸·Î ¼±¾ðµÈ´Ù.

 - moduleÀÇ port´Â ±× ¹æÇâ¿¡ µû¶óinput, output, inoutÀ¸·Î Á¤ÀÇ µÈ´Ù. 
Ex)
    module fulladd4(sum, c_out, a, b, 
c_in);
    output[3:0] 
sum;
    output c_out;
    input[3:0] a, 
b;
    input c_in;
    
...
    ...
    endmodule
   * ¸ðµç port´Â Ưº°È÷ ÁöÁ¤ÇÏÁö ¾Ê´Â ÇÑ wire·Î ¼±¾ðµÈ´Ù.
  ** output port°¡ ±× 
°ªÀ» °è¼Ó À¯ÁöÇϵµ·Ï ¼³°èÇÑ´Ù¸é reg·Î ¼±¾ðÇØ ÁÖ¾î¾ß 
ÇÑ´Ù.
 *** input port´Â reg·Î 
¼±¾ðÇÒ ¼ö ¾ø´Ù. 
Ex)
    module DFF(q, 
d, clk, reset);
    output q;
    reg 
q;  // q port´Â ±× °ªÀ» °è¼Ó À¯ÁöÇÑ´Ù.
    input d, clk, 
reset;
    ...
    ...
    
endmodule
4.2.3 Port Connection Rules
 - ModuleÀÇ ³»ºÎ¿Í ¿ÜºÎ¸¦ ¿¬°áÇÏ´Â 
µ¥¿¡´Â ¸î°¡Áö ±ÔÄ¢ÀÌ ÀÖ´Ù. PortÀÇ Å¸ÀÔ¿¡ µû¶ó¼ ±× ±ÔÄ¢Àº ´ÙÀ½°ú °°´Ù.

±×¸² 4-5 Port Connection Rules

 - Width matching : size°¡ ´Ù¸¥ ½ÅÈ£³¢¸® ¿¬°áÀÌ Çã¿ëÀº µÇÁö¸¸ °æ°í(warning)ÀÌ ¹ß»ýÇÏ´Â°Ô 
º¸Åë
 - Unconnected Ports : ¿¬°áÇÏÁö ¾ÊÀº ä µÎ¾îµµ »ó°ü¾ø´Ù. ¿¹¸¦ µé¾î ´ÜÁö µð¹ö±ëÀ» Çϱâ À§ÇØ ¸¸µç 
output port°¡ ±×·¸´Ù. 
Ex)
    fulladd4 
fa0(SUM, , A, B, C_IN); // c_out port¿¡ ¿¬°áÀÌ ¾ø´Ù.
- ±ÔÄ¢¿¡ ¾î±ß³ª´Â ¿¬°áµéÀÇ ¿¹
 Ex)
    module 
Top;
    reg [3:0] A, 
B;
    reg C_IN;
    reg [3:0] 
SUM;
    wire 
C_OUT;
        
...
        fulladd4 fa0(SUM, C_OUT, A, B, 
C_IN); // Illegal : output(sum) - 
reg(SUM)
        ...
    
endmodule
 4.2.4 Connecting Ports to External Signals
 - 
¸®½ºÆ® ¼ø¼´ë·Î ¿¬°á
    Module Á¤ÀÇ ÇÒ¶§ port list¿¡ ¿°ÜµÈ ¼ø¼´ë·Î 
instantiation¿¡ ½ÅÈ£¸¦ Àû¾îÁÖ´Â °ÍÀ¸·Î ¿¬°áµÈ´Ù.
Ex)
    module Top;
    reg [3:0] A, 
B;
    reg C_IN;
    wire [3:0] 
SUM;
    wire 
C_OUT;
        
...
        fulladd4 fa_ordered(SUM, 
C_OUT, A, B, C_IN);
        
...
    endmodule
module fulladd4(sum, c_out, a, b, c_in);
    output [3:0] 
sum;
    output c_out;
    input [3:0] a, 
b;
    input 
c_in;
        
...
        <module 
internals>
        
...
    endmodule
 - À̸§À¸·Î ¿¬°á
    ¼ö½Ê¿©°³ÀÇ port¸¦ °®´Â Å« design¿¡¼ ¾î¶² ¼ø¼·Î portµéÀÌ 
Á¤ÀÇ µÇ¾ú´ÂÁö ÀÏÀÏÀÌ ´Ù ±â¾ïÇÏ´Â °ÍÀÌ ºÒ°¡´ÉÇÏ°Ô µÈ´Ù. ±×¸®ÇÏ¿© ´ÙÀ½°ú °°ÀÌ portÀÇ À̸§À¸·Î ¿¬°áÇÏ°Ô µÇ¸é portÀÇ ¼ø¼´Â ¹«½ÃµÇ¸ç, 
¿¬°áÇÏÁö ¾Ê´Â port´Â ÀÚ¿¬È÷ »ý·«µÈ´Ù.
Ex)
    fulladd4 
fa_byname(.c_out(C_OUT), .sum(SUM), .b(B), .c_in(C_IN), .a(A));
* À̸§¿¡ ÀÇÇÑ port¿¬°áÀ» »ç¿ëÇϸé moduleÀÇ port list¿¡¼ port¸¦ Á¤¸®ÇÏ´Â °úÁ¤¿¡¼ ¼ø¼°¡ ¹Ù²î¾îµµ ¿¬°á¿¡ ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù.
4.3 Hierarchical Names
 - 
°èÃþ±¸Á¶¸¦ Æ÷ÇÔÇÑ À̸§À» »ç¿ëÇÏ¸é ¾îµð¼µç ºÒ·¯ »ç¿ëÇÒ ¼ö ÀÖ´Ù. °èÃþÀÌ Ãß°¡µÉ ¶§ ¸¶´Ù Á¡(".")À¸·Î ºÐ¸®ÇÏ¿© °èÃþÀÇ À̸§À» ºÙ¿© 
»ç¿ëÇÑ´Ù.

±×¸² 4-6 SR LatchÀÇ °èÃþ±¸Á¶
 - Root level : Top-level moduleÀ» ÀǹÌÇÑ´Ù. Design ¾îµð¿¡¼µµ instantiationµÇÁö ¾ÊÀº 
moduleÀ̸ç hierarchical nameÀÇ ½ÃÀÛÁ¡ÀÌ´Ù.
 - module instance´Â ¹°·ÐÀÌ°í ½ÅÈ£(signals), 
º¯¼ö(variables)µµ hierarchical nameÀ¸·Î ÂüÁ¶°¡ °¡´ÉÇÏ´Ù.
´ÙÀ½Àº ±×¸² 4-6ÀÇ ¸ðµç Hierarchical NameÀÌ´Ù.
Ex)
    
stimulus                       
stimulus.q
   
 stimulus.qbar               
stimulus.set
    
stimulus.reset              
stimulus.m1
    
stimulus.m1.Q              stimulus.m1.Qbar
    
stimulus.m1.S              stimulus.m1.R
    
stimulus.m1.n1           
 stimulus.m1.n2