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

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


一  阻塞赋值

操作符  “ = ”

把赋值运算看做

LHS = RHS

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

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

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

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

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

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

always @(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置位或者上一个时钟上升沿确定的值。在用户看,这两个赋值语句是并行执行的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值