Verilog中的阻塞赋值和非阻塞赋值

来源:互联网 发布:漏洞提交平台源码 编辑:程序博客网 时间:2024/05/22 21:36

Verilog中阻塞赋值和非阻塞赋值的异同:


一  阻塞赋值

操作符  “ = ”

把赋值运算看做

LHS = RHS

在阻塞赋值时,先计算等号右手方向(RHS)的值,这时候赋值语句不允许别的Verilog语句的干扰,直到现行的赋值过程完成,即将RHS计算得到的值赋给LHS(左手方向),然后才允许别的语句执行。

从理论上来说,阻塞赋值的过程虽然分先后(先RHS后LHS),但是确实是一步完成,中间不能有延迟(即使是零延迟也不行),计算RHS和对LHS赋值,只有概念上的先后,没有实质上的延迟。

如果加了延迟,这种Verilog代码不能被综合。

如果一个过程块中的RHS变量恰好是另一个过程块的LHS变量,且两个过程块是用同一个时钟沿触发的,则可能引起竞争。怎么理解呢?

如果这两个过程块是用同一个时钟沿触发的,赋值操作都是一步完成,但是不一定哪一个先完成,如下:

always @(posedge clock) begin alw1  a = b; endalways @(posedge clock) begin alw2  b=c; end


如果alw1的时钟沿先到,那么其中的赋值语句一步执行完成,则a的值是b,如果alw2先执行完成,则a的值是c,两个赋值语句是串行执行的

二 非阻塞赋值

操作符号: “ <= ”

分成两步:

(1)在赋值开始的时刻,计算非阻塞赋值RHS的表达式

(2)在赋值结束的时刻,更新非阻塞赋值LHS的表达式

在计算非阻塞赋值RHS 和更新LHS期间,允许其他的Verilog语句执行

alway @(posedge clock or posedge rst) if(rst) y1<=0;     //预置值 else y1<=yu2;always @(posedge clock or posedge rst) if(rst) y2<=1;   // 预置值 else y2<=y1;


非阻塞赋值语句运行时,不影响其他Verilog语句的执行,

rst置位信号由1到0后,y1为0,y2为1,当下一个时钟上升沿到来时,无论哪个always块的时钟上升沿先到几个皮秒,第一步计算RHS,y1为0,y2为1,是确定的,所以第二步对LHS赋值时y1和y2的值都是确定的,由rst置位或者上一个时钟上升沿确定的值。在用户看,这两个赋值语句是并行执行的。