Verilog中的非阻塞分配

时间:2014-08-20 05:22:20

标签: verilog nonblocking

我正在为一个简单的XOR门创建一个TESTBENCH。我在测试平台内使用了非阻塞语句。我期待并行执行但我最终得到了顺序执行。我正在附加下面的代码和输出。可能是什么问题?

module test_xor_tb;
  wire y;
  reg a,b;
  test_xor x1(y,a,b);
  initial begin
    a<=0;b<=0;
    #10 a<=1;
    #10 b<=1;
    #25 b<=0;
    #35 a<=0;
  end
  initial
  $monitor("AT TIME %t,a=%b,b=%b,Y=%b",$time,a,b,y);
endmodule
/////////////////////////////////////////////////////////////////////
module test_xor(y,a,b);
  input a,b;
  output y;
  assign y=a^b;
endmodule

我得到的输出在下面给出

# AT TIME  0,a=0,b=0,Y=0
# AT TIME 10,a=1,b=0,Y=1
# AT TIME 20,a=1,b=1,Y=0
# AT TIME 45,a=1,b=0,Y=1
# AT TIME 80,a=0,b=0,Y=0

我的预期输出是

# AT TIME  0,a=0,b=0,Y=0
# AT TIME 10,a=1,b=0,Y=1
# AT TIME 10,a=1,b=1,Y=0
# AT TIME 25,a=1,b=0,Y=1
# AT TIME 35,a=0,b=0,Y=0

那么为什么非阻塞分配在顺序执行

1 个答案:

答案 0 :(得分:1)

#10 a<=1;相当于#10; a<=1;#10;是阻止声明。要实现并行,您需要非阻塞延迟a<= #10 1;

initial begin
  a<=0;b<=0;
  a<= #10 1;
  b<= #10 1;
  b<= #25 0;
  a<= #35 0;
end

或者,您可以在分支连接中放置分配。

initial begin
  fork
    a<=0;b<=0;
    #10 a<=1;
    #10 b<=1;
    #25 b<=0;
    #35 a<=0;
  join
end

我建议使用fork-join方法的非阻塞延迟,但两者都可以。