1 verilog system-verilog vivado test-bench
我尝试开发备用内存代码,但仿真在 Vivado 中卡住了。我不能确切地说它是否被卡住,但模拟没有运行。我已附上我无法清楚表达的问题的图片。代码的测试平台位于此处。在尝试获取仿真波形时,Vivado并没有给出仿真,而在Icarus Verilog中完全可以工作,并且在GTK Wave中仿真波形清晰。
module trial_tb;
reg clk;
reg rst_n;
reg bist_enable;
reg we;
reg [5:0] wraddr;
reg data_in;
reg re;
reg [5:0] rdaddr;
wire data_out;
wire repair_fail;
wire repair_finish;
integer m;
integer idx;
SRAM_repair uut (clk, rst_n, bist_enable, we, wraddr, data_in, re, rdaddr, data_out, repair_fail, repair_finish);
initial
begin
clk = 0;
rst_n <= 0;
bist_enable <= 0;
rdaddr <= 'b0;
wraddr <= 'b0;
we <= 1'b0;
re <= 1'b0;
data_in <= 1'b0;
#5.0 rst_n <= 1;
#5.0 bist_enable <= 1;
#52.9 bist_enable <= 1'b0;
we <= 1'b1;
data_in <= 1'b0;
for ( m=0 ; m<=32; m=m+1) begin
wraddr <= m;
#0.2;
end
data_in <= 1'b1;
for ( m=33 ; m<=63; m=m+1) begin
wraddr <= m;
#0.2;
end
#0.2;
we <= 1'b0;
re <= 1'b1;
for ( m=0 ; m<64; m= m+1) begin
rdaddr <= m;
#0.2;
end
end
initial
begin
$dumpfile ("SRAM_repair.vcd");
$dumpvars( 0, trial_tb);
// $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[0\]);
// $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[1\]);
// $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[2\]);
// $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[3\]);
// $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[4\]);
// $dumpvars( 0, trial_tb.uut.i_bisr_controller.fcr\[5\]);
#90 $finish;
end
always #0.1 clk = ~clk;
endmodule
Run Code Online (Sandbox Code Playgroud)
我怀疑您没有为测试平台中的延迟使用正确的时间尺度。来自 IEEE Std 1800-2017,第 22.7 节“时间尺度”:
如果没有指定“时间刻度”或者已通过“resetall”指令重置,则默认时间单位和精度是特定于工具的。
如果未指定,我的模拟器默认为:
`timescale 1ns/1ns
Run Code Online (Sandbox Code Playgroud)
我看到模拟在时间 0 挂起,正如我认为的那样。由于时间精度与时间单位相同(两者都是1ns对我而言),因此 0.1 的延迟clk被舍入为 0,导致块中出现无限循环clk always。
我通过在模块之前添加这个明确的时间刻度来解决这个问题:
`timescale 1ns/100ps
Run Code Online (Sandbox Code Playgroud)
这会将精度设置为小于单位,从而允许clk正确切换。
您在 Vivado 和 Icarus 之间看到的差异可能是由于使用不同的时间尺度造成的。要查看有效的时间范围,请将此代码添加到您的测试平台中:
initial $printtimescale;
Run Code Online (Sandbox Code Playgroud)