电路仿真和测试程序
语言要素
$display $write
$display("<format_specifiers>“, <signal1, signa!2, …,signaln>);
$write("<format_specifiers>", <signal 1, signal2,…,signaln>);
$monitor 和 $strobe
$monitor("<format_specifiers>", <signall, signa!2, …,signaln>);
$strobe(<functions_or_signals>);
$strobe(”<string_and/or_variables>“, <functions_or_signals>);
$strobe—在所有时间处理完后,以十进制格式输出一行格式化的文本;
$strobeb——在所有时间处理完后,以二进制格式输出一行格式化的文本;
$strobeo——在所有时间处理完后,以八进制格式输出一行格式化的文本;
$strobeh—在所有时间处理完后,以十六进制格式输出一行格式化的文本
$time 和 $realtime
这两个函数被调用后都返回当前时刻相对仿真开始时刻的时间量值。所不同的是,$time函数以64位整数值的形式返回仿真时间,而$realtime函数则以实型数据的形式返回仿真时间。
$finish 和$stop
$finish;
$finish(n);
$stop;
$stop(n);
$readmemh 和$readmemb
$readmemb("<file_name>",<memory_name>);
$readmemb("<file_name>",<memory_name>, <start_addr>);
$readmemb("<file_name >",<memory_name>, <start_addr>, <finish_addr>);
$readmemh("<file_name >",<memory_name>);
$readmemh("<file_name >", <memoi-y_name>, <stail_addr>);
$readmemh("<file_name >", <memory_name>, <start_addr>, <finish_addr>);
$random
$random%<number>; //时返回一个32 bit的随机数
VCD
十进制加法器
module cntl0(clk, rst, ena, q, cout);
input clk, rst, ena;
output[3:0] q;
output cout;
reg[3:0] q;
always @ (posedge clk or posedge rst)
begin
if(rst)q = 4'b0000;
else if(ena)
begin
if(q<9)q = q+1;
else q = 0;
end
end
assign cout = q[3]&q[0];
endmodule
module cnt10_tb;
reg clk, rst, ena;
wire [3:0] q;
wire cout;
cnt_10 U1(clk, rst, ena, q, cout); //模块实例化
always #50 elk = ~clk; //时钟信号产生
initial
begin
clk = 0; rst = 0; ena = 1; //控制信号产生
#1200 rst= 1;
#120 rst = 0;
#2000 ena = 0;
#200 ena = 1;
#20000 $finish;
end
endmodule