4

到处都提到它作为指导方针,但经过深思熟虑后,我想知道如果我们在 Always Block for Combinatorial 中也使用 Nonblocking 语句会造成什么危害。我不会把两者混在一起。但是我的感觉是,当我们在 Always Block 中使用 Nonblocking for Combinatorial 语句时,它更准确地代表了硬件。难道不是……?

例如,如果我们采用以下电路: 小样电路图

在此图中,当提供输入 a、b、c 时,输出 x1 和 x 将不会立即可用。会有登机口延迟。第一个 x1 可用,然后 x 可用。如果我们使用阻塞语句,两者都可以立即使用。如果我们使用非阻塞,它更准确地类似于硬件。

例如,如果我们根据上图采取以下代码

module block_nonblock(output logic x,x1,y,y1,input logic a,b,c);

always@* begin : BLOCKING
    x1 = a & b;
    x  = x1 & c; 
end

always@* begin : NONBLOCKING
    y1 <= a & b;
    y  <= y1 & c; 
end

endmodule

这综合为: 非阻塞和阻塞代码的RTL图

两者都被合成为与门,并给出相同的模拟结果,但是当我们检查增量时间输出的变化时,我觉得与阻塞相比,非阻塞更准确地匹配硬件。

我还经历了: IEEE P1364.1 / D1.6 Verilog® 寄存器传输级综合标准草案,它指定了对顺序建模使用非阻塞,但没有具体指定使用 Always Block 的组合建模使用阻塞。它说不要在组合语句中混合两者(阻塞和非阻塞)。

所以,我们不应该在处理纯组合逻辑的总是块中使用非阻塞组合语句(非顺序/不涉及时钟)

4

5 回答 5

5

危害在于模拟;在性能和竞争条件下。

对于ab的每次更改,您的NONBLOCKING代码都会执行两次。非阻塞分配更新被安排到稍后的事件队列中,这会导致块被重复执行的更大的涟漪效应。

当您模拟 RTL 代码时,您是在没有物理延迟的情况下这样做的,并且综合工具了解将如何实现逻辑。但仿真工具无法做到这一点,还需要使用不可综合的代码。他们必须完全按照编写的方式执行代码。而且他们还必须在具有单个或有限数量线程的处理器上处理大量并发执行代码。因此,模拟在软件中引入了真实硬件中不存在的竞争条件。在编写顺序逻辑时,非阻塞分配可以防止这些竞争条件。但是,如果您在组合逻辑中使用它们,尤其是在涉及时钟生成的组合逻辑中使用它们时,它们可能会产生相反的影响。

于 2016-03-30T12:47:57.913 回答
1

你问“那么,我们不应该对 Sequential 中的组合语句使用非阻塞吗?” 答案是否定的

如果您在时钟控制的 always 块中对组合逻辑使用非阻塞分配,您将获得比预期更多的触发器。基本上,时钟控制的 always 块中的非阻塞分配在您模拟时会表现得像触发器,而在综合时会推断触发器。

所以,

1 - 对门使用阻塞分配和

2 - 对触发器使用非阻塞分配。

于 2016-03-30T12:29:12.063 回答
1

您自己对电路行为的描述实际上建议使用阻塞操作。

你说:(强调我的)

在此图中,当提供输入 a、b、c 时,输出 x1 和 x 将不会立即可用。会有登机口延迟。第一个 x1 可用,然后 x 可用。如果我们使用阻塞语句,两者都可以立即使用。如果我们使用非阻塞,它更准确地类似于硬件。

所以你需要x1之前有空x。所以你的 always 阻塞必须使用阻塞分配,所以......

always@* begin : BLOCKING
    x1 = a & b;
    x  = x1 & c; 
end

x1首先将有一个已知的值,然后,只有这样,x才会有一个值。如果你使用非阻塞...

always@* begin : NON BLOCKING
    x1 <= a & b;
    x  <= x1 & c; 
end

您正在告诉模拟器,x1并且x将同时进行评估。

尽管对于综合来说这可能有效,但在模拟中却不行,而且您要确保您的模拟电路在进入综合阶段之前按预期工作。

于 2016-03-30T16:27:42.393 回答
0

我找到了一个令人满意的答案,需要为此提供意见。我觉得我们应该对组合语句和顺序语句使用非阻塞语句。

对于顺序,我们应该使用非常清楚。

我将描述 Combi Blocks 的原因。对于组合段,我们将使用非阻塞语句,因为当我们使用阻塞或非阻塞语句时,即使它最终为我们提供了相同的硬件或 RTL;正是非阻塞语句向我们展示了仿真中的故障。这些故障也将存在于硬件中(由于门延迟),因此当我们在仿真中看到它们时,我们可以纠正它们,以便它们在设计/开发周期的后期阶段造成的危害更小。

描述故障的模拟

在我最初在问题中提到的电路中,如果我们将输入一起作为 (A = 1,B = 1,C = 0),然后在 10ns 之后将它们一起更改为 (A=1,B=0,C=1 ) 然后我们可以看到有一个小故障。这个故障也将存在于实际硬件中。但这仅在模拟中由非阻塞语句输出 (Y) 显示,而不是由阻塞语句输出 (X) 显示。一旦我们看到一个小故障,我们就会采取额外的措施来防止这种情况发生,这样它就不会在硬件中发生。

因此,我认为可以肯定地得出结论,我们必须对组合块使用非阻塞语句。

于 2016-04-06T04:36:35.943 回答
0

我们不应该在组合块中使用非阻塞分配,因为如果我们使用非阻塞它会推断出设计中的传输延迟,因此我们的结果永远不会达到我们的预期,但是如果我们使用阻塞,这个阻塞将能够为了抑制设计中的传输延迟,我们可以肯定地说波形中没有毛刺。所以建议我们在组合设计中使用阻塞语句。

于 2016-04-12T12:05:44.693 回答