我的印象是,在always_comb块中,所有非阻塞分配应该并行工作。也就是说,如果我有
always_comb
begin
a = b;
b = c;
end
然后,a应该等于c,不管always_comb块中上面两行的顺序如何,因为它们无论如何都是同时评估的。但是,今天我遇到了一个改变上面两行顺序的问题,结果不一样!!!这是什么?
答案 0 :(得分:0)
begin/end
块中的语句以串行方式执行。如果您使用always_comb
或任何其他类型的always
块,则无关紧要。但是您正在使用阻止分配,而不是非阻塞分配,这是在always_comb
块中正确执行的操作。非阻塞分配用于分配顺序逻辑,这意味着存储当前状态和下一状态。
答案 1 :(得分:0)
这种差异源于组合总是阻止不能自我触发"。当信号改变值时,模拟器的工作方式是在灵敏度列表中找到具有该信号的所有always
块,然后依次逐个执行它们。但是,只有该块尚未运行!在您的情况下,预期的行为将要求块运行两次,但是对于c
的每次更新,只会发生一次迭代。
情况很不幸,因为灵敏度列表是模拟器概念,并且通常完全忽略用于合成。大多数综合工具都会从代码中生成一条线,而不会产生任何警告,从而导致模拟综合不匹配。
请注意,明确的敏感度列表(例如always @(b or c)
)没有任何区别。一种解决方案是始终确保分配顺序正确。另一个是使用非阻塞分配,但通常建议不要这样做,因为它会降低模拟器的速度。 (请注意,VHDL没有阻塞分配,因此总是会有这种性能损失。从好的方面来说,你没有这样的问题。)