任何人都可以告诉我程序块中的非阻塞开始端和fork-join之间的区别。我的一个朋友告诉我,后者是非可合成的,仅用于测试平台。这是真的吗?还有其他差异吗?
答案 0 :(得分:4)
在Verilog / SystemVerilog中没有非阻塞的开始/结束构造。开始/结束块按顺序执行每个语句,阻止执行下一个语句,直到前一个语句完成。 最后语句完成后,将到达块的结尾。 fork / join同时执行每个语句,并且在所有语句完成后到达块的连接。
如果每种块中只有一个语句,则两者之间没有行为差异,但基本综合工具不接受fork / join构造。还有很多其他方法可以使用 fork / join 来编写,这些方法在行为上等同于在多个内部仅使用开始/结束编写相同的内容块,但不被视为可合成的。这是因为综合工具依赖于识别编码样式的模板,并且具有有限的资源来支持多种样式的编写代码。
答案 1 :(得分:0)
是的,你的朋友说的是实话。 Fork-join 块不可合成,而 begin-end 块可合成。
这两个块也有区别。让我们写两段代码。
initial
begin
begin
A <= 0;
A <= #5 1;
A <= #10 2;
end
$display($time);
end
initial
begin
fork
A = 0;
A = #5 1;
A = #10 2;
join
$display($time);
end
在第一个代码块中,begin-end 块在时间 0 执行并完成,显示函数将显示 0。但是,A 会在时间 5 和 15 处发生变化。
第二块代码中,fork-join块在时间10完成,显示函数这次会显示10。
有相似之处,但由于阻塞和非阻塞赋值的性质,它们并不等效。