verilog阻塞与非阻塞的初步理解(一)

通过两个模块来区别两者。测试平台:Modelsim altera 6.5b

阻塞模块:

module blocking(clk,a,b,c);
  input[3:0] a;
  input clk;
  output[3:0] b,c;
reg[3:0] b,c;
always @(posedge clk)
    begin
      b=a;
      c=b;
            $display("blocking:a=%d,b=%d,c=%d.",a,b,c);
    end
endmodule

非阻塞模块:

module non_blocking(clk,a,b,c);
  input[3:0] a;
  input clk;
  output[3:0] b,c;
reg[3:0] b,c;
always @(posedge clk)
    begin
      b<=a;
      c<=b;
      $display("non_blocking:a=%d,b=%d,c=%d.",a,b,c);
    end
endmodule

顶层测试模块:

`timescale 1ns/100ps
`include"blocking.v"
`include"non_blocking.v"

module top_blocking;
wire[3:0] b1,c1,b2,c2;
reg[3:0] a;
reg clk;


initial 
  begin
    clk=0;
    forever #50 clk=~clk;
  end
  
initial
begin
  a=4'h3;
  $display("________________");
  #100 a=4'd7;
  $display("________________");
  #100 a=4'd15;
    $display("________________");
  #100 a=4'd10;
    $display("________________");
  #100 a=4'd2;
    $display("________________");
  #100 $display("________________");
  $stop;
end
non_blocking non_bloking1(clk,a,b2,c2);
blocking blocking1(clk,a,b1,c1);
endmodule

运行仿真后结果:

# ________________
# blocking:a= 3,b= 3,c= 3.
# non_blocking:a= 3,b= x,c= x.
# ________________
# blocking:a= 7,b= 7,c= 7.
# non_blocking:a= 7,b= 3,c= x.
# ________________
# blocking:a=15,b=15,c=15.
# non_blocking:a=15,b= 7,c= 3.
# ________________
# blocking:a=10,b=10,c=10.
# non_blocking:a=10,b=15,c= 7.
# ________________
# blocking:a= 2,b= 2,c= 2.
# non_blocking:a= 2,b=10,c=15.
# ________________

可以得出结论:

 1,阻塞情况下,display显示的值c=b=a。这说明阻塞赋值是实时更新的。当赋值语句完成后,下一个语句开始,赋值语句的左值就已经发生了变化。

 2,非阻塞情况下,display显示的值,b为上一个周期a的值,c为上一个周期b的值。这说明赋值操作是在display语句之后完成的。

转载于:https://www.cnblogs.com/WeyneChen/p/3613269.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值