System verilog 始终按梳形块排序

System verilog 始终按梳形块排序,system-verilog,System Verilog,我的印象是,在总是梳块中,所有的非阻塞分配应该并行工作。也就是说,如果我有 always_comb begin a = b; b = c; end 然后,无论上述两行在always_comb块中的顺序如何,a都应等于c,因为它们无论如何都是并行计算的。然而,今天我遇到了一个问题,改变了以上两行的顺序,结果是不同的!!!那是什么?块中的语句连续执行。无论您使用的是始终_comb还是任何其他类型的始终块。但是您使用的是阻塞分配,而不是非阻塞分配,这是在始终\u comb块中正确执行

我的印象是,在总是梳块中,所有的非阻塞分配应该并行工作。也就是说,如果我有

always_comb
begin
    a = b;
    b = c;
end

然后,无论上述两行在always_comb块中的顺序如何,a都应等于c,因为它们无论如何都是并行计算的。然而,今天我遇到了一个问题,改变了以上两行的顺序,结果是不同的!!!那是什么?

块中的语句连续执行。无论您使用的是
始终_comb
还是任何其他类型的
始终
块。但是您使用的是阻塞分配,而不是非阻塞分配,这是在
始终\u comb
块中正确执行的操作。非阻塞分配用于分配顺序逻辑,这意味着存储当前和下一个状态

块中的语句连续执行。无论您使用的是
始终_comb
还是任何其他类型的
始终
块。但是您使用的是阻塞分配,而不是非阻塞分配,这是在
始终\u comb
块中正确执行的操作。非阻塞分配用于分配顺序逻辑,这意味着存储当前和下一个状态

这种差异源于组合始终块不能“自触发”。当信号改变值时,模拟器的工作方式是在灵敏度列表中找到带有该信号的所有
始终
块,然后依次执行它们。但是,除非该块尚未运行!在您的情况下,预期的行为将要求块运行两次,但是对于
c
的每次更新,只会发生一次迭代

这种情况是不幸的,因为灵敏度列表是一个模拟器概念,通常在合成时被完全忽略。大多数合成工具都会在不产生任何警告的情况下从代码生成一条线,从而造成模拟合成不匹配


请注意,明确的敏感度列表(例如,
始终@(b或c)
)没有任何区别。一种解决方案是始终确保任务的顺序正确。另一种方法是使用非阻塞分配,但通常建议不要这样做,因为这会降低模拟器的速度。(请注意,VHDL没有阻塞分配,因此总是会有这种性能损失。从好的方面来说,您不会遇到类似的问题。)

这种差异源于组合始终块不能“自触发”。当信号改变值时,模拟器的工作方式是在灵敏度列表中找到带有该信号的所有
始终
块,然后依次执行它们。但是,除非该块尚未运行!在您的情况下,预期的行为将要求块运行两次,但是对于
c
的每次更新,只会发生一次迭代

这种情况是不幸的,因为灵敏度列表是一个模拟器概念,通常在合成时被完全忽略。大多数合成工具都会在不产生任何警告的情况下从代码生成一条线,从而造成模拟合成不匹配

请注意,明确的敏感度列表(例如,
始终@(b或c)
)没有任何区别。一种解决方案是始终确保任务的顺序正确。另一种方法是使用非阻塞分配,但通常建议不要这样做,因为这会降低模拟器的速度。(请注意,VHDL没有阻塞分配,因此总是会有这种性能损失。从好的方面来说,您不会遇到这样的问题。)