概述
学习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带来的结果就完全不一样。
最后
以上就是香蕉曲奇为你收集整理的非阻塞赋值的内部延时和外部延时的全部内容,希望文章能够帮你解决非阻塞赋值的内部延时和外部延时所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复