【发布时间】:2014-01-17 14:29:46
【问题描述】:
谁能告诉我程序块中的非阻塞开始结束和分叉连接之间的区别。我的一位朋友告诉我,后者是不可合成的,仅用于测试平台。这是真的吗?还有其他区别吗?
【问题讨论】:
-
您能否举例说明您正在考虑使用 fork-join 暗示什么硬件,这将有助于指导答案。
-
在交叉发布方面提前做好准备是一种很好的做法。 Electronics SE.
谁能告诉我程序块中的非阻塞开始结束和分叉连接之间的区别。我的一位朋友告诉我,后者是不可合成的,仅用于测试平台。这是真的吗?还有其他区别吗?
【问题讨论】:
在 Verilog/SystemVerilog 中没有非阻塞的开始/结束结构。开始/结束块按顺序执行每个语句,阻止下一个语句的执行,直到前一个语句完成。 last 语句完成后到达块的末尾。一个fork/join同时执行每条语句,在所有语句完成后才到达block的join。
如果每种块中只有一个语句,则两者之间没有行为差异,但基本综合工具不会接受 fork/join 构造。还有许多其他使用 fork/join 的方法,您可以编写它们在行为上等同于在多个 always 中仅使用 begin/end 编写相同的东西 块,但不被认为是可合成的。这是因为综合工具依赖于识别编码风格的模板,并且具有有限的资源来支持多种风格的编写代码。
【讨论】:
是的,你的朋友说的是实话。 Fork-join 块是不可合成的,而 begin-end 块是可合成的。
这两个块之间也有区别。让我们写两个sn-ps代码。
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。
有相似之处,但由于阻塞和非阻塞分配的性质,它们并不等同。
【讨论】: