这两段代码片段有什么区别?
always @(posedge clk) begin
r3 <= @(posedge clk) 1;
r2 <= @(posedge clk) 1;
ready = 0;
while (r2 <= n) begin
r2 <= @(posedge clk) r2 + 1; <--- never stops executing
end
end
always @(posedge clk) begin
r3 <= @(posedge clk) 1;
r2 <= @(posedge clk) 1;
ready = 0;
while (r2 <= n) begin
@(posedge clk) r2 <= r2 + 1; <--- normally executes
end
end
答案 0 :(得分:3)
当模拟器执行r2 <= @(posedge clk) r2 + 1
时,它执行以下步骤:
r2 + 1
当模拟器执行@(posedge clk) r2 <= r2 + 1
时,它执行以下步骤:
always
进程并安排在下一个posedge clk恢复r2 <= r2 + 1
NBA,执行以下操作:
r2 + 1
第一个表单解析为非阻塞赋值,并在零时间内执行。延迟仅适用于NBA执行时生成的更新事件。第二种形式解析为延迟控制,然后是NBA。它不会在零时间内执行,因为延迟适用于语句的执行而不仅仅是更新事件。
第一种形式是无限循环,因为while
循环的主体在零时间内执行,而将增加r2
的事件将在未来安排。
使用第二种形式时,您仍然需要在循环终止时注意边界条件。在安排将r2
设置为n + 1
的更新后,该条件将在应用更新之前再次评估为true。