我的印象是,在always_comb块中,所有的非阻塞赋值都应该并行工作。也就是说,如果我有
always_comb
begin
a = b;
b = c;
end然后,a应该等于c,而不管上面两行在always_comb块中的顺序如何,因为它们无论如何都是并发计算的。然而,今天我遇到了一个问题,改变了上面两行的顺序,结果不同!那是什么?
发布于 2016-11-01 04:06:47
begin/end块中的语句是串行执行的。无论您使用的是always_comb还是任何其他类型的always块,都没有关系。但是您使用的是阻塞赋值,而不是非阻塞赋值,这才是在always_comb块中应该做的事情。非阻塞分配用于分配顺序逻辑,这意味着当前和下一个状态的存储。
发布于 2018-02-02 07:35:38
这种差异源于组合always块不能“自触发”。当信号改变值时,模拟器的工作方式是在灵敏度列表中定位具有该信号的所有always块,然后依次执行它们。但是,只有在该块还没有运行的情况下!在您的例子中,预期的行为将要求块运行两次,但是c的每次更新只发生一次迭代。
这种情况是不幸的,因为敏感度列表是一个模拟器概念,通常在合成时被完全忽略。大多数合成工具都会在不产生任何警告的情况下从代码中生成连接,从而造成模拟合成不匹配。
请注意,显式敏感度列表(例如,always @(b or c))不会产生任何差异。一种解决方案是始终确保赋值的顺序正确。另一种是使用非阻塞赋值,但通常不建议这样做,因为它会减慢模拟器的速度。(请注意,VHDL没有阻塞赋值,因此总是会有这种性能损失。从好的方面来说,您不会遇到这样的问题。)
https://stackoverflow.com/questions/40349285
复制相似问题