您的位置:技术中心首页 > 硬件语言 >> 阻塞式赋值与非阻塞式赋值

阻塞式赋值与非阻塞式赋值

作者:nsun   时间:2005-12-21 19:29:52  来自:www.chalayout.com  浏览次数:431  文字大小:【】【】【

   在Verilog HDL中,有两种过程性赋值方式,即阻塞式(blocking)和非阻塞式(non-blocking)。这两种赋值方式看似差不多,其实在某些情况下却有着根本的区别,如果使用不当,综合出来的结果和你所想得到的结果会相去甚远。

Tip:所谓过程性赋值就是指在initial或always语句内的赋值,它只能对寄存器数 据类型的变量赋值。

阻塞式(blocking)的操作符为 “ = ”
非阻塞式(non-blocking)的操作符为 “ <= ”

首先,我们通过两个例子来看看这两种赋值方式的区别,这里使用的综合工具为DC。

例1:非阻塞式赋值
module nonblock (clock,in1,in2,in3,in4,out);
input clock,in1,in2,in3,in4;  
output out;
reg out;
reg f;

always @ (posedge clock)
begin
  f <= in2 | in3;         //语句1
  if (in1)
     out <= f & in4;    //语句2
  else
     out <= in4;
end
endmodule

例1综合后的结果为(**注**):

module nonblock ( clock, in1, in2, in3, in4, out );
input  clock, in1, in2, in3, in4;
output out;
    wire f, n_6;
    mfntnq out_reg ( .q(out), .da(n_6), .db(in4), .sa(in1), .cp(clock) );
    mfntnq f_reg ( .q(f), .da(1'b1), .db(in2), .sa(in3), .cp(clock) );
    an02d1 U10 ( .z(n_6), .a1(f), .a2(in4) );
endmodule

为了更直观,给出相应的schematic:







例2:阻塞式赋值

module block (clock,in1,in2,in3,in4,out);
input clock,in1,in2,in3,in4;
output out;
reg out;
reg f;

always @ (posedge clock)
begin
  f = in2 | in3;    //语句1
  if (in1)
  out = f & in4;   //语句2
  else
    out = in4;
end
endmodule

例2综合后的结果为:

module block ( clock, in1, in2, in3, in4, out );
input  clock, in1, in2, in3, in4;
output out;
wire n_6;
    mfntnq out_reg ( .q(out), .da(n_6), .db(in4), .sa(in1), .cp(clock) );
    oa14d0 U10 ( .z(n_6), .a1(in3), .a2(in2), .b(in4) );
endmodule

相应的schematic:

 




分析:
大家可以看到,例1和例2的code写法完全一样,只是在always语句块中使用了不同的赋值方式,就导致综合出来的结果不同。
在例1中,是非阻塞式赋值方式,非阻塞式赋值的赋值对象总是在当前仿真时刻结束时被赋值,所以,当在对语句2中的out赋值这一时刻, f  值还没有得到语句1中的新值,而是原来的值(即上一个时刻的值)。
而在例2中,使用了阻塞式赋值方式,就是在always语句块中是一句一句执行的。在执行语句2之前,语句1就已经执行完成,f被赋好了新值,所以语句2中的f值取的是新值。

建议:
1. 阻塞式赋值用于组合逻辑建模;
2. 非阻塞式赋值用于时序逻辑建模。


**注**
mfntnq   q = rising(cp) ? (sa&da | !sa&db) : 'p'
an02d1   z = a1 & a2
oa14d0   z = (a1 | a2) & b


参考书目:
Verilog HDL Synthesis A Practical Primer    J.Bhasker


[补充]
以上内容只是非常非常简单地介绍了这两种赋值方式的语法区别,近日看到一篇获奖论文,题目为:
Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill! (Clifford E. Cummings)
其中非常详细的论述了这两种方法的区别、用法及仿真结果。由于是pdf文档没法上传,如感兴趣的朋友可发email问我要。
nsun@chalayout.com

责任编辑:5life

更多相关 blocking non-blocking 阻塞,非阻塞 的文章

本文共有0条评论,现在显示最新的5条。

栏目导航

电路基础
硬件语言
逻辑验证
电路综合
后端设计
可测设计
基本逻辑
制造工艺
书籍精选
说文解字
工具学习
数字滤波
趣闻逸事
数字锁相
设计杂项
低耗设计

站点最新

更多相关链接

  Verilog 的些许经验
  编程修养[C语言]
  Verilog学习笔记(More)
  编码风格 --- 命名规则
  编码风格 --- 其他
  编码风格 --- 与综合相关
  编码风格 --- 编写风格
  编码风格 --- 注释
  编码风格 --- 设计考虑
  系统级芯片设计语言和验...

栏目最新

更多相关链接

  Verilog 的些许经验
  编程修养[C语言]
  Verilog学习笔记(More)
  编码风格 --- 命名规则
  编码风格 --- 其他
  编码风格 --- 与综合相关
  编码风格 --- 编写风格
  编码风格 --- 注释
  编码风格 --- 设计考虑
  系统级芯片设计语言和验...

热点文章

更多相关链接