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ÀÇ Á߿伺ÀÌ Ä¿Á³´Ù.