verilog中阻塞与非阻塞的范围分别是多大?初学者的困惑!
在同一个always快内,阻塞型赋值语句是顺序执行的,那么我理解的就是阻塞赋值的作用范围是“一个过程块”。那么非阻塞赋值的作用范围是多大呢?是不是所有(多个)过程块在同一时刻赋值?也就是说先计算所有过程快中的非阻塞型语句右边表达式的值,最后统一赋值,也就是非阻塞的作用范围是整个模块,是不是这样理解的啊?非常疑惑中···· 强烈推荐看书。http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_544101.jpg
(原文件名:数字逻辑基础与Verilog设计(原书第2版).jpg) 回复【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
如果说非阻塞赋值的范围是一个快,那么我理解的是又产生竞争的可能,但是书上说不会。为什么啊
??? VHDL/Verilog语句不是“顺序执行”而是“并行执行的”,这一点初学者特别容易理解错。 程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题! 回复【4楼】asus119
程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!
-----------------------------------------------------------------------
这是书上的一个测试程序,是故意这样写的,以说明非阻塞赋值的特点。
我的问题是如果两个always块的速度不同步,那么y1,y2的值不就是不确定了吗?为什么书上还说这种写法不会产生竞争呢? 按照LZ的写法,两个always块的速度必须保证同步(即是采用相同的时钟沿):
always @(posedge clk,posedge reset)
写代码的基本规则之一就是不要在两个时钟域内直接交换数据,否则会产生不确定态(metastability)。
要从电路的角度去检查你的代码:y1/y2是两个D触发器,彼此的D端与对方的Q端相连,复位时一个置0,一个置1,复位消除后的值每时钟周期0/1交替变化。 没看出会发生冲突呀。我立即的非阻塞就相当于在赋值与被赋值对象之间隐含一个锁存器,或者应该叫程序上的寄存器来保存赋值变量当前的数值。然后当这个块运行到最后,再按照顺序将那个保存的变量并行的付给各个需要被赋值的变量。因此这个程序应该没有冲突发生。 回复【楼主位】10086RainEr
-----------------------------------------------------------------------
区别很大啊 回复【5楼】10086RainEr
回复【4楼】asus119
程序中的y1,y2都定义成了output,怎么还要对它们进行相互的赋值操作呢
写法有问题!
-----------------------------------------------------------------------
这是书上的一个测试程序,是故意这样写的,以说明非阻塞赋值的特点。
我的问题是如果两个always块的速度不同步,那么y1,y2的值不就是不确定了吗?为什么书上还说这种写法不会产生竞争呢?
-----------------------------------------------------------------------
个人觉得,always块的速度不同步,这句话是不是有问题,他们应该是同步执行(在这两个触发条件下posedge clk,posedge reset),应该不会有你认为的组合逻辑条件下,门电路传输时间差异产生的竞争。 阻塞与非阻塞,理解定义是没有意义的。
从某种程度的总结
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;
/************************************/
入门就先这样理解吧。
以后有经验了,就会明白的 书在那里?数字逻辑基础与Verilog设计(原书第2版). 多谢
页:
[1]