Testbench仿真时,时序逻辑无延迟存在无延迟赋值的情况
test代码:
module test_top(
input clk,
input rst_n,
input a,
input b,
output reg c_out
);
always@(posedge clk)
begin
if(!rst_n)
c_out<=0;
else if(b==1)
c_out<=a;
else c_out<=c_out;
end
endmodule
testbench代码:
下面展示一些 内联代码片
。
module top_test_tb(
);
reg clk;
reg rst_n;
reg a;
reg b;
wire c_out;
always #10 clk=~clk;
initial begin
clk=0;
rst_n=1;
a=0;
b=0;
#20;
a=1;
#30;
b=1;
#100;
a=0;
end
test_top test_top(
.clk(clk),
. rst_n(rst_n),
.a(a),
.b(b),
.c_out(c_out)
);
endmodule
仿真波形如下:
可以看出赋值和判断语句在tb赋值后,无任何延迟,时序逻辑进行直接判断和赋值。与真实下载到板子中不同,时序逻辑应该在a,b值变化后的一拍,才能检测到a和b的值的变化。并进行判断和赋值。
应如何修改tb,保证正常的测试
tb文件中的与时序相关的赋值应同样采用时序逻辑。
三种方式:
//非阻塞赋值
@(posedge clk)
a<=1;
//或
#20;
a<=1;
//将信号与时钟上升沿错开一小段
#20.1;
a=1;
testbench
代码
module top_test(
);
reg clk;
reg rst_n;
reg a;
reg b;
wire c_out;
always #10 clk=~clk;
initial begin
clk=0;
rst_n=1;
a=0;
b=0;
#20;
@(posedge clk)
a<=1;
#30;
@(posedge clk)
b<=1;
#100;
@(posedge clk)
a<=0;
end
test_top test_top(
.clk(clk),
. rst_n(rst_n),
.a(a),
.b(b),
.c_out(c_out)
);
endmodule
修改后的仿真结果正常了: