在debug的时候发现一个FIFO在存储数据的时候把本来预期在时钟沿跳变以后的数据打入了FIFO。发现和阻塞赋值和非阻塞赋值的差异有关。为了理解这个问题,做了个简单的实验。实现了一个简单的2级同步寄存器,然后再testbench里面试着使用两种不同的方式给同步寄存器赋值:
1. always @ (posedge clk or negedge rst_n)
begin
if (~rst_n)
D=32'd0;
else D<=D+1'b1;
end
2. always @ (posedge clk or negedge rst_n)
begin
if (~rst_n)
D =32'd0;
else D =D+1'b1;
end
使用第一种激励同步寄存器的行为和预期的一致,在时钟上升沿的时候采的是上一个周期的数据。使用第二种激励则采的是累加以后的数据。我在vcs里面把delta cycle打开看了看,两种方式在vcs的timeline里面都是一样的,先更新时钟,再更新A数据线,然后更新同步寄存器里面的2个寄存器。
第二种方式在编程规范里肯定是不推荐的,但是不理解的是为什么仿真器的表现是不同的?如果仿真器这么解释感觉有些组合逻辑的输出需要加延时才能和期望的行为一致了。有哪位能够帮忙解释一下么?谢谢了