阻塞赋值和非阻塞赋值深度解析——仿真事件的调度

来源:EETOP BLOG   作者:acgoal

http://www.eetop.cn/blog/html/46/553746-51456.html

下面有一段verilog代码和仿真文件,用的是VCS仿真和编译工具。我们来研究一下不同的驱动赋值方式对仿真结果的影响。下面我把我做的例子和大家分享一下。

设计源代码如下:


`timescale 1ns/1ps
module counter (data_out0, data_out1,clk,rst_n, data_in0, data_in1);
output [3:0] data_out0;
output [3:0] data_out1;
input [3:0] data_in0;
input [3:0] data_in1;
input clk;
input rst_n;

reg [3:0] data_out0;
reg [3:0] data_out1;
always @(posedge clk or negedge rst_n) begin
  if(!rst_n) begin
    data_out0 <= 4'd0;
  end
  else begin
    data_out0 <= data_in0;
  end
end
always @(posedge clk) begin
  if(!rst_n) begin
    data_out1 <= 4'd0;
  end
  else begin
    data_out1 <= data_in1;
  end
end
endmodule


这里有两段,分别表示带异步复位和带同步复位的。

测试程序如下:


`timescale 1ns/1ps
module tb_top;
reg clk;
reg rst_n;
wire [3:0] data_out0;
wire [3:0] data_out1;
reg [3:0] data_in0;
reg [3:0] data_in1;
counter u_counter0(.clk(clk), .rst_n(rst_n), .data_out0(data_out0), .data_out1(data_out1), .data_in0(data_in0), .data_in1(data_in1));

initial  begin
  clk=1'b0;
end
always begin
  #3 clk=~clk;
end
initial begin
  rst_n = 1'b1;
  #15 rst_n = 1'b0;
  #180 rst_n = 1'b1;
  #200 $finish;
end

initial begin
  data_in0 <= 0;
  wait(!rst_n);
  wait(rst_n);
  @(posedge clk);
  data_in0 <= 1;
  @(posedge clk);
  data_in0 <= 2;
  @(posedge clk);
  data_in0 <= 4;
  @(posedge clk);
  data_in0 <= 8;
  @(posedge clk);
  data_in0 <= 0;
end

initial begin
  data_in1 <= 0;
  wait(!rst_n);
  wait(rst_n);
  @(posedge clk);
  data_in1 <= 1;
  @(posedge clk);
  data_in1 <= 2;
  @(posedge clk);
  data_in1 <= 4;
  @(posedge clk);
  data_in1 <= 8;
  @(posedge clk);
  data_in1 <= 0;
end

initial begin
  $vcdpluson();
end
endmodule

注意这里红色的部分,data0和data1的驱动都用非阻塞赋值。得到的仿真波形图如下:

下面我把非阻塞赋值改成阻塞赋值,改动部分如下:initial begin
  data_in0 = 0;
  wait(!rst_n);
  wait(rst_n);
  @(posedge clk);
  data_in0 = 1;
  @(posedge clk);
  data_in0 = 2;
  @(posedge clk);
  data_in0 = 4;
  @(posedge clk);
  data_in0 = 8;
  @(posedge clk);
  data_in0 = 0;
end

initial begin
  data_in1 = 0;
  wait(!rst_n);
  wait(rst_n);
  @(posedge clk);
  data_in1 = 1;
  @(posedge clk);
  data_in1 = 2;
  @(posedge clk);
  data_in1 = 4;
  @(posedge clk);
  data_in1 = 8;
  @(posedge clk);
  data_in1 = 0;
end

这样的代码,仿真波形图如下:

和上面的不一样,为什么呢,为什么这次的flop行为没有了呢?直接给结论吧。

根据verilog/system verilog的standard。我这里以system verilog的standard为例,STD 1800-2009版本,第四章“Scheduling Semantics”,这一章关于仿真的调度描述。

simulation的event大体分为:Active event -> Inactive event -> NBA event -> Overserved event -> Reactive -> Re-Inactive -> Re-NBA

一般的,阻塞赋值发生在active/inactive event,而NBA( Non-blocking assignment update)从字面意思就能看出来是做非阻塞赋值的。

再结合上面的例子,如果data_in0是阻塞赋值出去的话,因为例子里的dut是在时钟上升延来的时候进行非阻塞赋值(data_out0 <= data_in0),这句话属于NBA event,而阻塞赋值data_in0 = 1 (或者2,4,8)是Active event,他比NBA要先执行,所以我们看到data_out0在当前的cycle就被采样到了。这就是后面一个波形图的样子,看起来就像flop没有用一样。实际上是我们driver写的有问题。

如果data_in0在testbench里面用阻塞赋值就是 data_in0 <= 1 (或者2,4,8,见例子),那么data_out0 <= data_in0, 和data_in0 <= 1同属于NBA event。这样子这两句话同时执行,这样就和实际电路中的flop行为一致了(就是并行执行)。

结论:做驱动的接口信号最好是非阻塞赋值出去。

(0)

相关推荐

  • 一天一个设计实例-门控时钟和使能时钟

    门控时钟的简介: 组合逻辑中多用门控时钟,一般驱动门控时钟的逻辑都是只包含一个门,如果有其他的附加逻辑,就容易因竞争而产生不希望的毛刺.门控时钟通过一个时能信号控制时钟的开关.当系统不工作时可以关闭时 ...

  • 【精品博文】详细解析基于FPGA的串口通信

    赢一个双肩背包 有多难? 戳一下试试看! →_→ 长摁识别 [主题]:详细解析基于FPGA的串口通信 [作者]:LinCoding [时间]:2016.11.28 串口通信,用的实在太广泛了,原理也很 ...

  • 【Verilog】阻塞和非阻塞赋值引申出的原则分析

    参考来源:<Verilog数字系统设计(夏宇闻)> 在介绍<[Verilog]深入理解阻塞和非阻塞赋值的不同>时得到下面几个原则: 原则1:时序电路建模时,用非阻塞赋值. 原则 ...

  • 使用Verdi的小技巧(二)

    在学习和使用 Verilog 的过程中,难免会碰到需要深入理解仿真器调度的问题.今天这篇聊聊使用 Verdi 去分析 NBA Delay 的问题. NBA 就是 NonBlocking Assignm ...

  • 【Verilog】深入理解阻塞和非阻塞赋值的不同

    来源:<Verilog数字系统设计(夏宇闻)> 阻塞和非阻塞赋值的语言结构是Verilog 语言中最难理解概念之一.甚至有些很有经验的Verilog 设计工程师也不能完全正确地理解:何时使 ...

  • Verilog非阻塞赋值添加#1延迟设计讨论

    导言: 在进入文章前,先看一段代码如下,这段代码是上次发的IIC的IP核中的一段,具体内容大家可以参阅IIC(一)以及 IIC(二) . // generate clk enable signal   ...

  • 阻塞、非阻塞、多路复用、同步、异步、BIO、NIO、AIO 一锅端

    关于IO会涉及到阻塞.非阻塞.多路复用.同步.异步.BIO.NIO.AIO等几个知识点.知识点虽然不难但平常经常容易搞混,特此Mark下,与君共勉. 1 阻塞跟非阻塞 1.1 阻塞 阻塞IO 阻塞IO ...

  • Linux的epoll使用LT 非阻塞IO和ET 非阻塞IO有效率上的区别吗?

    linux服务器开发相关视频解析: linux下的epoll实战揭秘--支撑亿级IO的底层基石 epoll的网络模型,从redis,memcached到nginx,一起搞定 问题: Linux 的 e ...

  • 非阻塞性易损斑块是否需要预防性PCI治疗?丨健心知著

    一.研究方法 对898例心肌梗死患者所有血流受限病变成功PCI后,联合应用血管内超声(IVUS)和近红外光谱(NIRS)导管进行三支血管成像.研究者将那些因造影提示非阻塞性狭窄未行PCI,但IVUS提 ...

  • 同步、异步、阻塞、非阻塞

    同步.异步.阻塞.非阻塞 目录 同步.异步.阻塞.非阻塞 1.同步 2.异步 3.同步与异步的区别 4.阻塞与非阻塞 5.阻塞非阻塞与同步异步的区别?(故事篇) 1.同步 所谓同步,就是发出一个功能调 ...

  • 【TXSP418】 非阻塞性肠缺血CT评价

    版权申明 本微信平台属于个人公益性医学影像类学习平台,本微信所有转载文章系出于传递更多信息之目的,且明确注明来源和作者,所有转载视频只用于基层教学使用,且明确注明授课专家姓名,不希望被转载的原作者及老 ...

  • 高通骁龙888深度解析:为什么说非它不买?

    将「雷科技Lite」收藏为我的小程序,不再错过精彩内容 雷科技数码3C组 编辑 | 白徵明 刚刚结束的高通骁龙技术峰会上,高通新一代旗舰移动平台骁龙888正式登场,5G.AI.影像.游戏等性能提升令人 ...