Concurrency 非阻塞和阻塞分配don';I don’我没有按预期工作

Concurrency 非阻塞和阻塞分配don';I don’我没有按预期工作,concurrency,verilog,simulation,blocking,assign,Concurrency,Verilog,Simulation,Blocking,Assign,我在理解这样一个简单的东西时遇到了问题:阻塞和非阻塞分配 我创建了一个小测试台,只是为了模拟此代码的行为: module ATest(clk, out); input wire clk; output reg [7:0] out; reg [7:0] A; initial begin A <= 8'b0; end always @(posedge clk) begin A = A + 1;

我在理解这样一个简单的东西时遇到了问题:阻塞和非阻塞分配

我创建了一个小测试台,只是为了模拟此代码的行为:

module ATest(clk, out);
    input wire clk;
    output reg [7:0] out;
    reg [7:0] A;

    initial begin
        A <= 8'b0;
    end

    always @(posedge clk) begin
        A = A + 1;
        out = A;
    end
endmodule
我得到了这个波:

我没想到这里会有什么,因为非阻塞语句对我来说有点神秘。为什么
A
out
都设置为“不在乎”

另外,我在每一页上都找到了不同的名字,请帮我: 阻塞和非阻塞是否可以用顺序和并发作为术语互换?哪一个是正确的:非阻塞语句还是并发语句

多谢各位

这些术语是等价的。“阻塞”与“顺序”相同,因为“阻塞”意味着必须在模拟器移动到下一行(按顺序)之前完成分配。“非阻塞”意味着所有线路可以一次完成。正如Verilog的一切一样,它有助于想象硬件的用途,因此有时您可能会认为它是“并行”与“串行”的对比


在您的模拟中,时间0处是否存在正时钟边缘?

如果不深入研究Verilog模拟器使用的模拟周期,您可以简单地将非阻塞与阻塞分配想象为:

阻塞赋值在执行给定赋值时内联发生,因此这意味着如果我有一行,如
a=a+1
,这意味着我们取
a
的当前值,加1并赋值给
a
。因此,赋值“阻塞”执行,直到完成为止


非阻塞分配(NBA)发生的时间略晚于执行该行的时间。您可以将非阻塞分配视为告诉模拟器将此分配安排在稍晚一点的行(注意,晚一点仍然使用相同的模拟时间步长,因此所有这些仍然在simtime t中发生)。因此,如果您有类似
A的问题,您的问题来自于在
初始块中使用非阻塞分配。使用
首字母A=8'b0取而代之


原因可能是这两项作业是如何处理的<代码>=
赋值以增量方式完成,任何新值都可用于后续赋值。通过
进行的更改是,有。首先对其进行偏移或将其更改为负边缘有帮助(?)。那个并发代码呢?为什么在我的情况下它仍然是
8'hxx
?谢谢!一篇长而彻底的文章!我想我现在明白了……:)再次感谢。@user35443好吧,阻塞与非阻塞分配不是一件简单的事情,需要一些思考才能理解:)
always @(posedge clk) begin
        A <= A + 1;
        out <= A;
end