Verilog HDL
2007/07/16 18:32
http://blog.naver.com/PostPrint.nhn?blogId=babojay&logNo=40039891215#
Chapter 9
Useful Modeling Techniques
À̹ø Àå¿¡¼´Â ¸ðµ¨¸µ°ú ºÐ¼®°úÁ¤¿¡¼ ´õ¿í °·ÂÇϰí À¯¿¬ÇÑ Verilog·Î ¸¸µé ¼ö ÀÖ´Â ¿©·¯°¡Áö Ãß°¡ÀûÀÎ »çÇ׵鿡 ´ëÇØ¼ ¾Ë¾Æº»´Ù.
 *Objectives
    - Procedural 
continuous assignment : assign, 
deassign, force, release
    - 
Overriding parameters : defparam
    - 
Conditional compilation
    - System tasks : file output, 
displaying hierarchy, strobing, random number generation, memory initialization, 
value change dump.
9.1 Procedural Continuous Assignments
 - Procedural Assignment : register¿¡ °ªÀ» ÀúÀåÇÑ´Ù. ´Ù¸¥ procedural assignment°¡ 
´Ù¸¥ °ªÀ» ÀúÀåÇϱâ Àü±îÁö °ªÀ» À¯ÁöÇÏ°Ô µÈ´Ù.
 - Procedural Continuous Assignment : ¼ö½ÄÀÇ °ªÀÌ 
register³ª net¿¡ Á¤ÇØÁø ½Ã°£µ¿¾È °è¼Ó driveÇÏ°Ô ÇÑ´Ù. 
9.1.1 assign & deassign
 - assign, deassign 
: procedural continuous assignmentÀÇ Ã¹ ¹øÂ° typeÀÌ´Ù.
 - assignmentÀÇ ¿ÞÂÊ¿¡´Â 
register(or concatenated reg, part or bit selected reg, array of reg)°¡ 
¿Â´Ù.
 - ÀϹÝÀûÀÎ procedural assignment¸¦ µ¤¾î¾²´Â È¿°ú¸¦ °®´Â´Ù.
Ex)
    // D-F/F with 
Procedural Continuous Assignments
    module edge_dff(q, qbar, 
d, clk, reset);
    output q, 
qbar;
    input d, clk, reset;
    reg q, 
qbar;
 
    always @(negedge 
clk)
    begin
        q 
= d;
        qbar = 
~d;
    end
    always 
@(reset)    // Override regular assignment to q & 
qbar
        if 
(reset)
        
begin                          
            assign q 
= 1'b0;         // q¿¡ »õ·Î¿î °ªÀ¸·Î 
override  
            assign 
qbar = 1'b1;    // qbar¿¡ »õ·Î¿î °ªÀ¸·Î 
override
        
end
        
else
        
begin
            
deassign q;          // q¿¡ ´ëÇÑ 
override¸¦ ÇØÁ¦, ´ÙÀ½ negedge clk¿¡ q = d; ·Î 
º¹±Í
            
deassign qbar;    // qbar¿¡ ´ëÇÑ override¸¦ ÇØÁ¦, ´ÙÀ½ clk¿¡ qbar = 
~d; ·Î º¹±Í
        end
    
    endmodule
* deassign q;, deassign qbar¿¡¼ q¿Í qbar¿¡ ´ëÇÑ override°¡ ÇØÁ¦µÈ ´ÙÀ½, negedge clkÀÌ µÇ¾î¼ q = d;, qbar = ~d;ÀÇ ±¸¹®¿¡¼ »õ·Î¿î °ªÀÌ ÇÒ´çµÇ±â Àü±îÁö´Â ÀÌÀüÀÇ °ªÀ» °è¼Ó À¯ÁöÇÏ°Ô µÈ´Ù.
9.1.2 force and release
 - force, release 
: procedural continuous assignmentÀÇ µÎ ¹øÂ° Çü½ÄÀÌ´Ù.
 - register»Ó¸¸ ¾Æ´Ï¶ó net¿¡µµ 
ÇÒ´çÀÌ °¡´ÉÇÏ´Ù.
 - º¸Åë interactive debug°úÁ¤¿¡¼ register³ª net¿¡ °Á¦ÀûÀ¸·Î °ªÀ» ÇÒ´çÇÏ¿© ±× °á°ú¸¦ 
°ËÅäÇϴµ¥ »ç¿ëÇϸç, design block¿¡´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù.
 - ½Ã¹Ä·¹À̼ÇÀ» À§ÇÑ stimulus¿¡¼ »ç¿ëÇϰųª debug 
±¸¹®À¸·Î¸¸ »ç¿ëÇÑ´Ù.
¡á force and release on registers
 - procedural assignment³ª procedural continuous assignment¸¦ 
overrideÇÑ´Ù.
 - override°¡ ÇØÁ¦°¡ µÈÈÄ¿¡ ´Ù¸¥ °ªÀ¸·Î assignµÇ±â Àü±îÁö´Â ÀÌÀü °ªÀ» À¯ÁöÇÏ°Ô µÈ´Ù.
Ex)
    // force on 
registers
    module stimulus;
    
...
    ...
    edge_dff dff(Q, Qbar, D, 
CLK, RESET);  // À§ÀÇ ¿¹Á¦¿¡¼ÀÇ D-F/FÀÇ instantiation
    
...
    ...
    
initial
    
begin
        #50 force dff.q = 
1'b1;    // dff.qÀÇ °ªÀ» 50tu~100tu±îÁö 1·Î °Á¦ÀûÀ¸·Î 
ÇÒ´ç
        #50 release 
dff.q;
    end
    ...
    
...
    endmodule 
¡á force and release on nets
 - netÀÇ continuous assignment¸¦ overrideÇÑ´Ù.
 - ÇØÁ¦ µÇ´Â ¼ø°£¿¡ Á¤»óÀûÀÎ ÇÒ´ç¿¡ 
ÀÇÇÑ drive value·Î º¹±ÍÇÑ´Ù.
Ex)
    // force on 
nets
    module top;
    
...
    assign out = a & b & c;
    
...
    initial
        
#50 force out = a | b & c;  // ¼ö½Äµµ override 
°¡´ÉÇÏ´Ù.
        #50 release 
out;
    end
    ...
    
endmodule
* force¿¡ ÀÇÇÑ ÇÒ´ç out = a | b & c;´Â force°¡ À¯ÁöÇÏ´Â µ¿¾È¿¡´Â a, b, cÀÇ º¯È¿¡ µû¸¥ °á°úµéÀÌ Áö¼ÓÀûÀ¸·Î ¹Ý¿µµÈ´Ù. Àӽ÷Π»õ·Î¿î continuous assignment¸¦ Àû¿ëÇÑ °Í°ú °°´Ù.
9.2 Overriding Parameters
 - moduleÀÇ Á¤ÀÇ ºÎºÐ¿¡¼ ¼±¾ðµÇ´Â parameter¸¦ moduleÀ» compileÇÏ´Â µ¿¾È ´Ù¸¥ °ªÀ¸·Î ¹Ù²Ü ¼ö 
ÀÖ´Ù.
 - module instatiationÇÏ¸é¼ parameter¸¦ overrideÇÒ ¼ö ÀÖÀ¸¹Ç·Î °¢ instance¸¶´Ù 
´Ù¸¥ parameter¸¦ µ¤¾î ¾µ ¼ö ÀÖ´Ù.
9.2.1 defparam Statement
 - defparam : parameter¿¡ 
»õ·Î¿î °ªÀ» overrideÇÒ¶§ »ç¿ëÇÏ´Â keyword.
 - °¢°¢ÀÇ module instanceÀÇ hierarchical 
nameÀ¸·Î °ªÀ» µ¤¾î¾´´Ù.
Ex)
    // defparam 
Statement
    module hello_world;
    
    parameter id_num = 0;
    
initial
        $display("Displaying 
hello_world id number = %d", id_num);
endmodule
module top;
defparam w1.id_num = 1, w2.id_num = 2; // parameter override
    hello_world 
w1();
    hello_world w2();
endmodule
9.2.2 Module_Instance Parameter Values
 - defparam keyword¾øÀÌ 
parameter°ªÀ» overrideÇÏ´Â ¹æ¹ý
 - module instantiationÇÏ´Â °úÁ¤¿¡¼ »õ·Î¿î parameterÀÇ 
°ªÀ» Àü´ÞÇÑ´Ù.
Ex)
    // patameter 
override in module instantiation
    module top;
    hello_world #(1) 
w1();    // module w1ÀÇ parameter¿¡ 1À» Àü´Þ
    
hello_world #(2) w2();    // module w2ÀÇ parameter¿¡ 2À» 
Àü´Þ
endmodule
- ¸¸¾à parameter°¡ ¿©·¯ °³ÀÏ °æ¿ì´Â ´ÙÀ½°ú °°´Ù.
Ex)
    // Multiple 
parameter override
    module bus_master;
    parameter delay1 = 
2;
    parameter delay2 = 3;
    parameter 
delay3 = 7;
    ...
    endmodule
module top;
    // parameter°¡ Á¤ÀÇµÈ 
¼ø¼´ë·Î Àü´ÞµÈ´Ù.
    bus_master #(4, 5, 6) b1();  // delay1=4, 
delay2=5, delay3=6
    bus_master #(9, 4) 
b2();     // delay1=9, delay2=4, 
delay3=7(default)
endmodule
9.3 Conditional Compilation and Execution
 - Verilog·Î ¼³°è¸¦ ÇÏ´Ùº¸¸é ÀÌ È¯°æ¿¡¼´Â ¸ÂÁö¸¸ ´Ù¸¥ ȯ°æ¿¡¼´Â ¸ÂÁö ¾Ê´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ·¯ÇÑ °æ¿ì¸¦ À§ÇØ µÎ°³ÀÇ 
versionÀ¸·Î ¼³°èÇÒ ¼öµµ ¾ø´Â ³ë¸©ÀÌ´Ù. ¿©±â¿¡ Verilog codeÀÇ ÀϺκÐÀ» ¼±ÅÃÀûÀ¸·Î compile¿¡ Æ÷ÇÔ½ÃŰ°Å³ª ¹èÁ¦½Ãų ¼ö ÀÖ´Â 
±â´ÉÀÌ ÀÖ´Ù. À̰ÍÀÌ conditional compilationÀÌ´Ù. 
 - ºñ½ÁÇÏ°Ô ½ÇÇà´Ü°è¿¡¼ ÀϺκÐÀ» ¼±ÅÃÀûÀ¸·Î Ȱ¿ëÇÒ ¼ö 
ÀÖ´Â °ÍÀÌ conditional executionÀÌ´Ù.
9.3.1 Conditional Compilation
 - 'ifdef, 'else, 
'endif : Conditional compilationÀ» 
°¡´ÉÇÏ°Ô ÇÏ´Â compiler directivesÀÌ´Ù
 - 'ifdef´Â design ¾îµð¿¡¼µçÁö »ç¿ë°¡´ÉÇÏ´Ù. ±¸¹®, module, 
block, declarationµî¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
 - 'else´Â ÇѰ³ÀÇ 'ifdef¿¡ ÇÑÇØ¼ Çѹø »ç¿ë°¡´ÉÇÏ´Ù.
 - 'ifdef´Â ¹Ýµå½Ã 'endif·Î ³¡¸ÎÀ½À» ÇØ¾ß ÇÑ´Ù.
Ex)
    // Conditional 
Compilation
    // Ex #1
    'ifdef 
TEST    // TEST°¡ Á¤ÀǵǾîÀÖ´Ù¸é test ¸ðµâÀ» ÄÄÆÄÀÏÇÑ´Ù.
    module test;
    
...
    endmodule
    
'else            // TEST°¡ 
Á¤ÀǵÇÁö ¾Ê¾Ò´Ù¸é stimulus ¸ðµâÀ» ÄÄÆÄÀÏÇÑ´Ù.
    module 
stimulus;
    ...
    
endmodule
    
'endif           // 'ifdefÀÇ 
³¡
    // Ex 
#2
    module top;
    bus_master 
b1();
    'ifdef 
ADD_B2           // ADD_B2°¡ 
Á¤ÀǵǾîÀÖ´Ù¸é b2¸¦ instantiationÇÑ´Ù.
        
bus_master b2();
    'endif
endmodule
* flag·Î »ç¿ëµÈ text macro TEST, ADD_B2´Â 'defineÀ¸·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
9.3.2 Conditional Execution
 - Conditional execution flag¿¡ µû¶ó¼ ±¸¹®ÀÇ ½ÇÇàÀ» Á¦¾îÇÒ ¼ö ÀÖ´Ù.
 - system 
task keywordÀÎ $test$plusargs¸¦ »ç¿ëÇϸé 
´ÙÀ½ÀÇ ¿¹¿¡¼ ó·³ ½ÇÇàÁß ±¸¹®ÀÇ ½ÇÇà¿©ºÎ¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
 - ÇÏÁö¸¸ À̰ÍÀº ½Ã¹Ä·¹ÀÌÅÍ¿¡ µû¶ó¼ ±× »ç¿ë¹æ¹ýÀÌ ´Ù¸¦ ¼ö 
ÀÖ´Ù. 
Ex)
    // Conditional 
execution
    module test;
    
...
    ...
    
initial
    
begin
        if 
($test$plusargs("DISPLAY_VAR"))       // flag 
DISPLAY_VARÀÌ ¼³Á¤µÇ¾î 
ÀÖ´Ù¸é
            
$display("Display = %b ", {a, b, c});  // ÀÌ ±¸¹®ÀÌ 
½ÇÇàµÈ´Ù
        
else
            
$display("No Display");
    end
    
endmodule
9.4 Time Scales
- °¡²û ÇϳªÀÇ ½Ã¹Ä·¹ÀÌ¼Ç Áß¿¡¼ ¾î¶² ¸ðµâÀº 1§Á·Î delay°ªÀ» Á¤ÀÇÇÒ Çʿ䰡 ÀÖ°í, ´Ù¸¥ ¸ðµâÀº 100§À·Î delay°ªÀ» Á¤ÀÇÇÒ Çʿ䰡 »ý±â°Ô µÈ´Ù. ÀÌ·±°æ¿ì¸¦ À§Çؼ 'timescaleÀ̶õ compiler directive°¡ ÇÊ¿äÇÏ´Ù.
    
Syntax]
        
'timescale 
<reference_time_unit>/<time_precision>
    * <reference_time_unit> : delay¿Í timeÀÇ ÃøÁ¤´ÜÀ§. 
1, 10, 100 À¸·Î¸¸ Á¤Àǰ¡´É
    ** <time_precision> : ¹Ý¿Ã¸²µÇ´Â °ªÀ» Á¤ÀÇ. 1, 10, 100À¸·Î¸¸ 
Á¤ÀÇ °¡´É
Ex)
    // Time 
Scales
    // Ref. time unit : 100ns, Precision : 
1ns
    'timescale 100 ns / 1 ns
    
    module dummy1;
reg toggle;
    
initial
        toggle = 1'b0;
    always 
#5         // #5 = 500 
ns
        
begin
            
toggle = 
~toggle;
            
$display("%d, In %m toggle = %b ", $time, 
toggle);
        end
endmodule
    // Ref. time unit = 
1us, Precision : 10ns
    'timescale 1 us / 10 ns
    module 
dummy2;
  
    reg toggle;
    
initial
        toggle = 1'b0;
    always 
#5        // #5 = 
5us
        
begin
            
toggle = 
~toggle;
            
$display("%d, In %m toggle = %b ", $time, 
toggle);
        end
endmodule
    * dummy1, dumm2´Â reference time unit ÀÌ °¢°¢ 100§À, 1§Á·Î ´Ù¸¦ »Ó 
³ª¸ÓÁö´Â ¸ðµÎ µ¿ÀÏÇÏ´Ù.
   ** dummy2ÀÇ $display°¡ Çѹø ½ÇÇàµÉ ¶§ dummy1ÀÇ $display±¸¹®Àº 
10¹ø ½ÇÇàµÈ´Ù.
 - ½Ã¹Ä·¹ÀÌ¼Ç °á°ú
              
5, In dummy1 toggle = 
1
            10, In 
dummy1 toggle = 
0
            15, In 
dummy1 toggle = 
1
            20, In 
dummy1 toggle = 
0
            25, In 
dummy1 toggle = 
1
            30, In 
dummy1 toggle = 
0
            35, In 
dummy1 toggle = 
1
            40, In 
dummy1 toggle = 
0
            45, In 
dummy1 toggle = 
1
              
5, In dummy2 toggle = 
1
            50, In 
dummy1 toggle = 
0
            55, In 
dummy1 toggle = 1
9.5 Useful System Tasks
9.5.1 File Output
 - VerilogÀÇ Ãâ·ÂÀº ±âº»ÀûÀ¸·Î Ç¥ÁØÃâ·ÂÀåÄ¡·Î 
Ãâ·ÂµÇ°Å³ª verilog.log¶ó´Â ÆÄÀÏ·Î Ãâ·ÂµÈ´Ù.
 - º°µµÀÇ ÆÄÀÏÀ» ÁöÁ¤ÇÏ¿© ±× ÆÄÀÏ·Î Ãâ·ÂÀ» ÀúÀåÇÒ ¼ö ÀÖ´Ù.
 ¡á Opening a file
 - $fopen : fileÀ» ¿©´Â keyword
    
Syntax]
        
$fopen("<name_of_file");
        
<file_handle> = 
$fopen("<name_of_file>");
- $fopen˼ 32-bit˂ multichannel 
descriptor¸¦ µÇµ¹·ÁÁØ´Ù.
 - multichannel descriptor: 32-bitÁß¿¡¼ ¿ÀÁ÷ ÇϳªÀÇ bit¸¸ 
set(1)µÈ »óÅÂÀÇ °ª
 - Ç¥ÁØÃâ·ÂÀåÄ¡´Â channel 0À̸ç bit0(LSB)°¡ 1·Î setµÈ discriptor¸¦ °¡Áö¸ç, 
Ç×»ó ¿·ÁÀÖ´Ù.
 
Ex)
    // File 
Descriptors
    integer handle1, handle2, 
handle3;     // integer : 32-bit 
  
    initial
    
begin
        handle1 = 
$fopen("file1.out");    // handle1 = 32'h0000_0002 (bit1 
set)
        handle2 = 
$fopen("file2.out");    // handle2 = 32'h0000_0004 (bit2 
set)
        handle3 = 
$fopen("file3.out");    // handle3 = 32'h0000_0008 (bit3 
set)
    end
 ¡á Writing to files
 -$fdisplay, $fmonitor, $fwrite, $fstrobeµîÀÇ keyword·Î fileÀ» 
ÀÛ¼ºÇÑ´Ù.
 - $display, $monitor¿Í ºñ½ÁÇÑ Æ¯¼ºÀ» °®´Â´Ù.
    
Syntax]
        
$fdisplay(<file_descriptor>, p1, 
p2,...,pn);
        
$fmonitor(<file_descriptor>, p1, 
p2,...,pn);
* p1, p2,...,pnÀº variables, signal names, stringµîÀÌ µÉ ¼ö ÀÖ´Ù.
- file_descriptor´Â multichanel descriptorÀ̸ç file handleÀÇ Á¶ÇÕÀ¸·Î ´Ù¼öÀÇ Ãâ·Â ÆÄÀÏ¿¡ Ãâ·ÂÇÒ ¼ö ÀÖ´Ù.
Ex)
    // Writing 
files
    // À§ÀÇ ¿¹Á¦¿¡ À̾î¼...
    integer 
desc1, desc2, desc3;
   
initial
    
begin
        desc1 = handle1 | 
1;                 // 
desc1 = 32'h0000_0003
        
$fdisplay(desc1, "Display 1");    // write to file1.out & 
stdout.
    
        
desc2 = handle2 | handle1;       // desc2 = 
32'h0000_0006
        $fdisplay(desc2, 
"Display 2");    // write to file1.out & file2.out
        desc3 = 
handle3;
        $fdisplay(desc3, "Display 
3");    // write to file3.out only
    
end
 ¡á Closing files
 - $fclose : fileÀ» ´Ý´Â keyword
    
Syntax]
        
$fclose(<file_handle>);
 - Çѹø ´ÝÇôÁø ÆÄÀÏÀ» ´Ù½Ã ¾µ¼ö ¾ø´Ù. multichannel descriptorÀÇ ÇØ´ç bit´Â 0À¸·Î ÃʱâÈ 
µÈ´Ù.
 - µÚÀ̾î $fopenÀÌ È£ÃâµÇ¸é 
ÃʱâÈµÈ releaseµÈ bit¸¦ »ç¿ëÇÏ´Â multichannel descriptor¸¦ µ¹·ÁÁØ´Ù.
9.5.2 Displaying Hierarchy
- %m : $display, $write, $monitor, $strobe¿¡¼ hierarchical nameÀ» Ãâ·ÂÇÑ´Ù.
Ex)
    // Displaying 
Hierarchy
    module M;
    
...
    initial
        
$display("Displaying in %m");
    endmodule
    module 
top;
    ...
        M 
m1();
        M 
m2();
        M 
m3();
    endmodule
 - ½Ã¹Ä·¹ÀÌ¼Ç °á°ú
    
Displaying in top.m1
    Displaying in 
top.m2
    Displaying in top.m3
9.5.3 Strobing
 - $strobe : $display¿Í 
°ÅÀÇ °°Áö¸¸, °°Àº½Ã°£¿¡ ½ÇÇàµÉ ¸ðµç ±¸¹®ÀÇ ½ÇÇàÀÌ ³¡³ ÈÄ¿¡ $strobe ½ÇÇà
 - $display´Â 
°°Àº simulation time¿¡ ½ÇÇàµÉ ´Ù¸¥ ±¸¹®µé°úÀÇ ¿ì¼±°ü°è°¡ ¾øÀ¸¹Ç·Î ¾î´À ±¸¹®ÀÌ ¸ÕÀú ½ÇÇàµÉÁö È®½ÇÇÏÁö ¾Ê´Ù. $strobe´Â 
°°Àº simulation time¿¡ ½ÇÇàµÉ ´Ù¸¥ ±¸¹®µéÀÇ ½ÇÇàÀÌ ¸ðµÎ ³¡³ÈÄ¿¡ ½ÇÇàµÈ´Ù.
Ex)
    // 
Strobing
    always @(posedge clock)
    
begin
        a = 
b;
        c = d;
    
end
  
    always @(posedge 
clock)
        $strobe("Displaying a = %b, 
c = %b", a, c);
* À§ÀÇ ¿¹¿¡¼ $strobe´ë½Å $display¸¦ »ç¿ëÇÒ °æ¿ì a¿Í cÀÇ °ªÀº b¿Í d°¡ ¾Æ´Ò ¼ö ÀÖ´Ù.
9.5.4 Random Number Gerneration
 - $random : 32-bitÀÇ random 
number¸¦ ¹ß»ý½ÃÄÑ µ¹·ÁÁØ´Ù.
 - random testingÀº Á¾Á¾ ¼û¾îÀÖ´Â ¹ö±×¸¦ Àâ¾Æ³»±âµµ Çϰí, chipÀÇ ¼º´ÉÀ» 
ºÐ¼®Çϴµ¥µµ »ç¿ëµÈ´Ù.
 - randomÀ» ¸¸µå´Â ¾Ë°í¸®ÁòÀº Ç¥ÁØÈµÇÁö ¾Ê¾ÒÀ¸¸ç ½Ã¹Ä·¹ÀÌÅÍ¿¡ µû¶ó ´Ù¸¦ ¼ö ÀÖ´Ù.
    
Syntax]
        
$random;
        
$random(<seed>);
    * <seed>´Â 
optionÀÌ´Ù. 
Ex)
    // Random 
Number Generation
    module test;
    integer 
r_seed;
    reg [31:0] addr;
    wire [31:0] 
data;
    ...
    ...
    
ROM rom1(data, wire);
  
    
initial
        r_seed = 2;
    always @(posedge 
clock)
        addr = 
$random(r_seed);
    ...
    <check 
output of ROM against expected results>
    
...
    endmodule
9.5.5 Initializing Memory from File
 - $readmemb, $readmemh : binay¿Í hexadecimal Çü½ÄÀÇ ¼ö¸¦ ÀÐ¾î ¸Þ¸ð¸®¸¦ 
ÃʱâÈÇÏ´Â task
 
    
Syntax]
        
$readmemb("<file_name>",<memory_name>);
        
$readmemb("<file_name>",<memory_name>,<start_addr>);
        
$readmemb("<file_name>",<memory_name>,<start_addr>,<finish_addr>);
    
* $readmemhÀÇ »ç¿ë¹ýµµ 
µ¿ÀÏÇÏ´Ù.
    ** <start_addr>, <finish_addr>Àº optionÀÌ´Ù.
Ex)
    // 
Initializing Memory
    module test;
    reg [7:0] 
memory[0:7];    // 8-byte memory
    integer 
i;
    
initial
    
begin
        $readmemb("init.dat", 
memory);
        for(i=0; i<8; 
i=i+1)
            
$display("Memory [%0d] = %b", i, memory[i]);
    
end
endmodule
 - sample init.dat
    
@002                            
  // @<address> : address´Â hexadecimal
    11111111 
01010101      // °ø¹éÀ¸·Î data ±¸ºÐ
    
00000000 10101010
    
@006
    1111zzzz 00001111
 - ½Ã¹Ä·¹ÀÌ¼Ç °á°ú
    
Memory [0] = xxxxxxxx
    Memory [1] = xxxxxxxx 
    Memory [2] = 11111111
    Memory [3] = 
01010101
    Memory [4] = 00000000
    
Memory [5] = 10101010
    Memory [6] = 
1111zzzz
    Memory [7] = 00001111
9.5.6 Value Change Dump File
- VCD(Value Change Dump)´Â simulationÀÌ ÁøÇàµÇ´Â µ¿¾ÈÀÇ simulation time, scope¿Í signalÁ¤ÀÇ, signal valueÀÇ º¯È¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã´Â ASCIIÆÄÀÏÀÌ´Ù. DesignÀÇ ¸ðµç ½ÅÈ£ÀÇ º¯È¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ÀÌ ÆÄÀÏÀº post-processing tool¿¡¼ debug¿Í °á°úºÐ¼®¿¡ »ç¿ëµÉ ¼ö ÀÖ´Ù.

±×¸² 9.1 Debugging & Analysis of Simulation with VCD file
 - $dumpvars : dumpÇÒ module 
instance¿Í ½ÅÈ£¸¦ ¼±ÅÃ
 - $dumpfile : VCD fileÀÇ À̸§À» Á¤ÀÇ
 - 
$dumpon, $dumpoff : dumpÀÇ ½ÃÀÛ°ú Á¾·á
 - 
$dumpall : checkpointÀÇ »ý¼º
Ex)
    // VCD file 
System Tasks
    
initial
        
$dumpfile("myfile.dmp");   // VCD file Á¤ÀÇ. 
    
    initial
        
$dumpvars;               // 
¸ðµç ½ÅÈ£¸¦ dump.
    
initial
        $dumpvars(1, 
top);   // top instance³»ÀÇ ½ÅÈ£¸¦ dump. 1Àº dumpÇÒ 
°èÃþ¼ö.
                                         // 
±×·¯¹Ç·Î topÀÇ ÇÏÀ§ °èÃþÀÇ ½ÅÈ£µéÀº dumpÇÏÁö ¾Ê´Â´Ù.
    
initial
        $dumpvars(2, 
top.m1);    // top.m1°ú ±× ÇÏÀ§ 1°èÃþ±îÁöÀÇ ½ÅÈ£µéÀ» 
dump
    initial
        
$dumpvars(0, top.m1);    // top.m1°ú ±× ÇÏÀ§ ¸ðµç °èÃþÀÇ ½ÅÈ£µéÀ» 
dump
    
initial
    
begin
        
$dumpon;                        
 // dump ½ÃÀÛ
        #100000 
$dumpoff;         // dump 
ÁßÁö
    end
  
    initial 
        
$dumpall;                         
// ÇöÀçÀÇ ¸ðµç ½ÅÈ£°ªµéÀ» dumpÇÑ´Ù
- DesignÀÇ Å©±â°¡ Ä¿Áü¿¡ µû¶ó $display³ª $monitor·Î´Â °á°ú¸¦ ºÐ¼®ÇÏ±â ¾î·Æ°Ô µÇ¾ú´Ù. ±×¸®ÇÏ¿© ±×·¡ÇÈÀ¸·Î ½Ã°¢ÈÇÏ¿© ºÐ¼®¿¡ µµ¿òÀ» ÁÖ´Â post-processingÀÇ Á߿伺ÀÌ Ä¿Á³´Ù.