DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 115|回复: 0
打印 上一主题 下一主题

Verilog HDL阻塞属性探究及其应用

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-21 23:58:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Verilog HDL中,有两种过程赋值方式,即阻塞赋值(blocking)和非阻塞赋值(nonblocking)。阻塞赋值执行时,RHS(right hand statement)估值与更新LHS(left hand statement)值一次执行完成,计算完毕,立即更新。在执行时阻塞同块中的其他语句的执行。阻塞式(blocking)的操作符为 “ = ”。它的执行很像传统程序设计语言。非阻塞赋值RHS估值与更新LHS值分两步执行。在单位仿真周期开始时RHS估值,在同一单位仿真周期末更新LHS值,不阻塞同块中其他语句的执行。非阻塞式(non-blocking)的操作符为 “



  触发的任何事件可以加入到这5个事件列中的任何事件列中,但只能从活跃事件列中移出。即上面的5个事件列中的事件最后都将被激活而放入活跃事件列中。层积事件列是层次模型,层积事件列的执行顺序是按优先级排列的。任何EDA软件都只能执行活跃事件。其他事件列都按优先级级别依次激活本列事件以供执行。
  1.1 活跃事件列
  由图1可见,大部分事件都被放入活跃事件列。活跃事件列里包括非阻塞赋值RHS估值。但是,非阻塞赋值的更新不是在活跃事件列,它被列成独立的非阻塞更新事件列。活跃事件列是仿真的执行源,从一开始执行活跃事件列到活跃事件列执行完毕称为一个仿真周期。活跃事件列中的事件可以触发活跃或非活跃等其他事件。当活跃事件列中的所有事件执行完后,EDA软件会按优先级依次触发其余事件列以供仿真执行。但在当前活跃事件列中的事件执行顺序是不确定的。
  1.2 非活跃事件列
  发生在当前仿真时间里并且在活跃事件列执行完后执行的事件列,即非活跃事件列执行优先级仅次于活跃事件列。如带PLI例程的回调过程(tf_synchronize()、vpi_register_cb(cb_readwrite))。非活跃事件列中的事件亦可以触发其他事件。如果触发了优先级更高的活跃事件,非活跃事件列中的其余事件执行后移。
  1.3 非阻塞赋值更新事件列
  活跃事件列中的每个非阻塞赋值RHS估值,都会触发一个与之对应的非阻塞赋值更新事件,这些事件被放在非阻塞赋值更新事件列中,执行优先级次于活跃与非活跃事件列。非阻塞赋值更新事件亦可以触发其他事件。若在非阻塞赋值更新事件列中,存在多个对同一变量的先后赋值,只有最后一个有效,其余值将被覆盖。
  1.4 监控事件列
  监控事件列被放在非阻塞赋值更新事件列后。由此可见,用监控事件列中的监控命令监控得到的值都是赋值后的值,活跃事件列$display系统命令则可以查看非阻塞更新前的值。
  1.5 未来事件列
  在执行事件时,如果事件含有延时,为不阻碍仿真的继续执行,该事件将被挂起而放入未来事件列。未来事件包含未来非活跃事件和未来非阻塞赋值更新事件。
  理解阻塞与非阻塞赋值就需要深入理解层积事件列,层积事件列反应了Verilog事件处理机制。
 
                          
                       
                          
                                2 应用及分析

  通常非阻塞赋值产生寄存器等存储元件,对应的物理器件是带存贮功能的元件,如寄存器、触发器等。阻塞赋值则对应网线(wire)类型,通常与物理连线对应。这是两种赋值方式的最明显的差异,也是时序逻辑用非阻塞、组合逻辑用阻塞的重要原因。但这并不是绝对的,事实上阻塞赋值对应网线(wire)型,亦可对应寄存器(reg)型;阻塞赋值也能生成存贮元件,因此不能片面理解。在组合逻辑里,锁存器可能引发测试问题,带来隐患。说明在建模时,首先要从硬件出发来考虑问题,应先在头脑中形成电路结构,由于赋值方式的不同,综合结果差异甚大,运用不当很可能会导致建模失败。阻塞赋值在时序逻辑中亦有着重要应用,在需要实时更新的组合逻辑中只有阻塞赋值能满足要求。
  以下示例代码的功能是计算传送过来的data中1和0的个数。
  reg [5:0]count0,count1;
  always @(posedge clk,negedge Rst_n)
  begin
  if(!Rst_n)
  ...
  else
  begin
  count0 = 0; //语句1
  count1 = 0; //语句2
  for(i = 0;i



  input a,b,c,clk,sel;
  output out;
  reg out,temp;
  always @(posedge clk)
  begin
  temp = a & b; //语句1
  if(sel)
  out = temp | c; //语句2
  else
  out = c; //语句3
  end
  若把上面代码中语句1、语句2、语句3阻塞赋值(" = ")改为非阻塞赋值("



  流水线设计方法在高性能、需经常进行大规模运算的组合逻辑中可以到广泛运用。
  在组合逻辑中,如在begin、end块中同时有许多非阻塞赋值,则它们的赋值顺序是并发的。实际上它们赋予的都是上一个时钟送入寄存器的值。这与使用同一时钟沿触发的许多在同一个使能控制信号下赋值完全一致,并且这种赋值因为数据保存在寄存器中,当时钟沿到来时都已稳定,所以存入的数值是可靠的。用这种方法可以避免由组合逻辑产生的竞争冒险[2]。
  在相关应用中,非阻塞赋值能较好地解决零时刻竞争冒险问题。因为非阻塞赋值分两步完成,非阻塞赋值更新事件是在所有活跃与非活跃事件执行完之后执行,能确保所有敏感变量值在零时刻都被触发[3]。
  在同一always块混合使用阻塞赋值与非阻塞赋值,利弊共存,混合使用的结果可能事半功倍,亦可能功亏一篑。只有了解其处理机制,深刻理解阻塞与非阻塞赋值底层实现的异同,方可灵活运用。
  本文通过Verilog事件处理机制,详细讨论了阻塞与非阻塞赋值的区别、联系及其应用示例。由本文可知,阻塞与非阻塞赋值灵活多变,底层实现也差异甚大。因而在数字电路设计时,依据预期功能,从硬件实现出发,斟酌差异,仔细选用阻塞与非阻塞赋值才能有效避免出错,缩短开发周期。
                          
                       
                          
                               
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-6-9 20:44 , 耗时 0.099745 秒, 19 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表