zoukankan      html  css  js  c++  java
  • verilog阻塞与非阻塞的初步理解(二)

    将阻塞模块改为下述代码:

    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
          c=b;
         $display("blocking:a=%d,b=%d,c=%d.",a,b,c);
        end
    
    always @(posedge clk)
        begin
          b=a;
          $display("blocking:a=%d,b=%d,c=%d.",a,b,c);
        end
        
    endmodule
     

    仿真得出结果:

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

    若更改两个always 模块的先后顺序如下:

    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;
          $display("blocking:a=%d,b=%d,c=%d.",a,b,c);
        end
        
    always @(posedge clk)
        begin
          c=b;
         $display("blocking:a=%d,b=%d,c=%d.",a,b,c);
        end
    
        
    endmodule

    则会得到结果:

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

    可以看出alway模块的先后顺序会影响b,c的取值。理论上,两个模块是并行执行的,他们出现的先后顺序并不会影响最终得到的结果。

    但从这里看出,其是有先后顺序的。只是不知道是仿真器的顺序执行的原因还是竞争冒险导致的。

    不过这种情况在非阻塞赋值时不会出现,非阻塞赋值结果是一致的。

  • 相关阅读:
    机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
    linux_shell_根据网站来源分桶
    mac_Alfred_快捷设置
    linux_无密登录
    crawler_Docker_解决用 JavaScript 框架开发的 Web 站点抓取
    linux下查看最消耗CPU、内存的进程
    绕过登陆常用万能密码
    ctf比赛linux文件监控和恢复shell
    Python爬虫之Selenium的常用方法
    CTF比赛时准备的一些shell命令
  • 原文地址:https://www.cnblogs.com/WeyneChen/p/3613702.html
Copyright © 2011-2022 走看看