我有一段代码:
always_ff @(posedge X or posedge ~Y)
begin
if (~Y) Z <= '0;
else Z <= 1'b1;
end
X和Y都同时上升(〜Y下降)。 我以Z为1,但在模拟中Z为0。
因为当我们有异步RST Flop的经典代码时:
always_ff @(posedge rst)
begin
if (rst) Z <= '0;
else Z <= 1'b1;
end
我们看到Z会在rst变为1时立即变为0。
(我认为正在发生的事情:当〜Y下降时,它不会触发此代码块的仿真。因此在增量周期仿真中它仍为先前的值0)
这里发生了什么,有人可以详细解释。
答案 0 :(得分:1)
在诸如Verilog之类的事件驱动的模拟中,没有“同时更改”之类的东西,一个必须先于另一个,并且有时该顺序是不确定的。
您的问题很可能只需要灵敏度列表中的一个posedge
,而这是综合工具所必需的。