10086RainEr 发表于 2010-4-6 20:01:50

verilog中阻塞与非阻塞的范围分别是多大?初学者的困惑!

在同一个always快内,阻塞型赋值语句是顺序执行的,那么我理解的就是阻塞赋值的作用范围是“一个过程块”。那么非阻塞赋值的作用范围是多大呢?是不是所有(多个)过程块在同一时刻赋值?也就是说先计算所有过程快中的非阻塞型语句右边表达式的值,最后统一赋值,也就是非阻塞的作用范围是整个模块,是不是这样理解的啊?非常疑惑中····

tear086 发表于 2010-4-6 20:11:34

强烈推荐看书。
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_544101.jpg
(原文件名:数字逻辑基础与Verilog设计(原书第2版).jpg)

10086RainEr 发表于 2010-4-6 20:59:25

回复【1楼】tear086 .COM 缺氧
-----------------------------------------------------------------------

刚重新查了资料,非阻塞应该是在一个过程块内吧。
那么请问下面这个会有竞争冒险吗?

module test(y1,y2,clk,reset);

outputy1,y2;
input   clk,reset;

regy1,y2;

always @(posedge clk,posedge reset)
if(reset)
   y1<=0;//预置值
else   y1<=y2;

always @(posedge clk,posedge reset)
if(reset)
   y2<=1;//预置值
else   y2<=y1;

endmodule

如果说非阻塞赋值的范围是一个快,那么我理解的是又产生竞争的可能,但是书上说不会。为什么啊
???

Nuker 发表于 2010-4-6 21:51:19

VHDL/Verilog语句不是“顺序执行”而是“并行执行的”,这一点初学者特别容易理解错。

asus119 发表于 2010-4-7 00:46:04

程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!

10086RainEr 发表于 2010-4-7 02:11:12

回复【4楼】asus119
程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!
-----------------------------------------------------------------------

这是书上的一个测试程序,是故意这样写的,以说明非阻塞赋值的特点。
我的问题是如果两个always块的速度不同步,那么y1,y2的值不就是不确定了吗?为什么书上还说这种写法不会产生竞争呢?

Nuker 发表于 2010-4-7 11:58:33

按照LZ的写法,两个always块的速度必须保证同步(即是采用相同的时钟沿):
always @(posedge clk,posedge reset)
写代码的基本规则之一就是不要在两个时钟域内直接交换数据,否则会产生不确定态(metastability)。

要从电路的角度去检查你的代码:y1/y2是两个D触发器,彼此的D端与对方的Q端相连,复位时一个置0,一个置1,复位消除后的值每时钟周期0/1交替变化。

tiancaigao7 发表于 2010-5-4 19:39:20

没看出会发生冲突呀。我立即的非阻塞就相当于在赋值与被赋值对象之间隐含一个锁存器,或者应该叫程序上的寄存器来保存赋值变量当前的数值。然后当这个块运行到最后,再按照顺序将那个保存的变量并行的付给各个需要被赋值的变量。因此这个程序应该没有冲突发生。

taosheng042 发表于 2010-5-8 00:00:49

回复【楼主位】10086RainEr
-----------------------------------------------------------------------

区别很大啊

only 发表于 2010-5-19 06:56:24

回复【5楼】10086RainEr
回复【4楼】asus119
程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!
-----------------------------------------------------------------------
这是书上的一个测试程序,是故意这样写的,以说明非阻塞赋值的特点。
我的问题是如果两个always块的速度不同步,那么y1,y2的值不就是不确定了吗?为什么书上还说这种写法不会产生竞争呢?
-----------------------------------------------------------------------

个人觉得,always块的速度不同步,这句话是不是有问题,他们应该是同步执行(在这两个触发条件下posedge clk,posedge reset),应该不会有你认为的组合逻辑条件下,门电路传输时间差异产生的竞争。

akuei2 发表于 2010-5-19 07:54:38

阻塞与非阻塞,理解定义是没有意义的。

从某种程度的总结

RTL级的设计都是用 <=

eg.二级状态机写法

reg Current;
reg Next;

always @ ( posedge CLK or negedge RSTn )
   if( !RSTn )
      Current <= 4'd0;
   else
      Current <= Next;

always @ ( posedege CLK negedge RSTn )
   if( !RSTn )
      Next <= 4'd0;
   else
      case ( Current )
            ***: Next <= Current;
            ......

组合逻辑和连线都是用 =

eg: 多路选择:

module demux
(
   SE, Data_Out;
)
    input SE;
    output Data_Out;

always @ ( SE )
   case ( SE )
      2'd0: Data_Out = 4'd0;
      2'd1: Data_Out = 4'd1;
      ......

eg:接线

module XXX
(
    Start_Sig, Done_Sig
);

   input Start_Sig;
   output Done_Sig;

   ....

   wire isStart = Start_Sig;

   ....
   reg rDone;

   assign Done_Sig = rDone;

/************************************/

入门就先这样理解吧。
以后有经验了,就会明白的

lsea 发表于 2010-6-19 21:36:25

书在那里?数字逻辑基础与Verilog设计(原书第2版).

ababvic 发表于 2010-6-19 22:55:11

多谢
页: [1]
查看完整版本: verilog中阻塞与非阻塞的范围分别是多大?初学者的困惑!