【问题标题】:nonblocking statements and fork-join in verilog and/or system verilogverilog 和/或系统 verilog 中的非阻塞语句和 fork-join
【发布时间】:2014-01-17 14:29:46
【问题描述】:

谁能告诉我程序块中的非阻塞开始结束和分叉连接之间的区别。我的一位朋友告诉我,后者是不可合成的,仅用于测试平台。这是真的吗?还有其他区别吗?

【问题讨论】:

  • 您能否举例说明您正在考虑使用 fork-join 暗示什么硬件,这将有助于指导答案。
  • 在交叉发布方面提前做好准备是一种很好的做法。 Electronics SE.

标签: verilog system-verilog


【解决方案1】:

在 Verilog/SystemVerilog 中没有非阻塞的开始/结束结构。开始/结束块按顺序执行每个语句,阻止下一个语句的执行,直到前一个语句完成。 last 语句完成后到达块的末尾。一个fork/join同时执行每条语句,在所有语句完成后才到达block的join。

如果每种块中只有一个语句,则两者之间没有行为差异,但基本综合工具不会接受 fork/join 构造。还有许多其他使用 fork/join 的方法,您可以编写它们在行为上等同于在多个 always 中仅使用 begin/end 编写相同的东西 块,但不被认为是可合成的。这是因为综合工具依赖于识别编码风格的模板,并且具有有限的资源来支持多种风格的编写代码。

【讨论】:

  • 但是当我写总是@(posedge clk)开始一个
  • 现在您将非阻塞赋值 (NBA) 语句的操作与 ben/end 块的执行方式混淆了。 NBA 语句仍按顺序执行,即按顺序计算右侧 (RHS) 表达式,但稍后安排对 LHS 的更新。请注意,模拟语义(代码如何执行)和综合语义(硬件如何生成)之间存在差异。
【解决方案2】:

是的,你的朋友说的是实话。 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。

有相似之处,但由于阻塞和非阻塞分配的性质,它们并不等同。

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多