非阻塞赋值的内部延时和外部延时

学习verilog有一段时间了,从字面上理解,阻塞和非阻塞的区别很直白。 前者是串行,主要用于描述组合逻辑,和软件中的赋值类似;后者是并行,主要用于描述时序逻辑。

但是和内部延时、外部延时混用在一起的时候,各种意想不到的情况就会发生。

下面将介绍,对于非阻塞赋值,内部延迟和外部延迟造成的结果就截然不同。

例1:  假设在5ns时刻pclock上出现一个正跳变沿;而current_state在正跳变出现之前的值为5,正跳变出现3ns后变为7, 下面两个always语句中next_state_h和next_state_l的值将会是多少?

always @(posedge pclock)
    #7 next_state_h <= current_state;

always @(posedge pclock)
     next_state_l <= #7 current_state;

经分析,next_state_l <= #7 current_state 能分解为两句话: 1)  temp <= next_state_l;  2) #7 next_state_l <= temp; 所以尽管有7ns的delay,但next_state_l得到的还是pclock正跳变时所对应的current_state的值(5)。具体仿真结果如下

 

例2:根据已知的master_clock产生phase delay的slave_clock。

`timescale 1ns/1ps

module clock_shift(master_clk, slave_clk);
 output reg master_clk;
 output reg slave_clk;
 parameter tON = 2, tOFF = 3, tDELAY = 5;
 
 always
  begin
   #tON  master_clk = 0;
   #tOFF master_clk = 1;
  end

 always @(master_clk)  
   slave_clk <= #tDELAY master_clk;
endmodule

其仿真波形图如下

但是如果将#tDELAY移到外部,如 #tDELAY slave_clk <= master_clk;则仿真图形就会变成如下:

从这里也可以看到,即使对于同一个非阻塞赋值, 内部delay和外部delay带来的结果就完全不一样。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ltshan139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值