📅  最后修改于: 2021-01-11 14:54:33             🧑  作者: Mango
Verilog延迟语句可以在分配运算符右侧的左侧指定延迟。
分配间延迟语句的延迟值在分配运算符的左侧。
内部分配是那些延迟了整个语句或分配的执行的延迟语句。
在VHDL的常规延迟语句。
// Delay is specified on the left side
# =
它指示该语句本身在延迟到期之后执行,并且是延迟控制的最常用形式。
例
module vd;
reg a, b, c, q;
initial begin
$monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);
// Now initialize all signals to 0 at time 0
a <= 0;
b <= 0;
c <= 0;
q <= 0;
// Inter-assignment delay. Wait for #5 time units
// and then assign a and c to 1. Note that 'a' and 'c'
// gets updated at the end of current timestep
#5 a <= 1;
c <= 1;
// Inter-assignment delay. Wait for #5 time units
// and then assign 'q' with whatever value RHS gets
// evaluated to
#5 q <= a & b | c;
#20;
end
endmodule
在这里,q在10个时间单位变为1,因为该语句以10个时间单位求值,并且RHS(由a,b和c组成的组合)求值为1。执行完成后,将给出以下输出。
xcelium> run
[0] a=0 b=0 c=0 q=0
[5] a=1 b=0 c=1 q=0
[10] a=1 b=0 c=1 q=1
xmsim: *W,RNQUIE: Simulation is complete.
内部分配延迟指示延迟期满后,语句本身执行,而且是延迟控制的最常用的形式。
它们可以与阻塞和非阻塞分配一起使用。如果在仿真过程中遇到带有内部分配时序控制的语句,则将对表达式进行求值,并存储其值。
然后,该语句的执行将被挂起,直到延迟控件指定的时间到期为止。表达式值在事件发生之前的更改将被忽略。
// Delay is specified on the right side
= #
在分配运算符的右侧声明内部分配延迟。这表明该语句已评估,并且首先捕获了RHS上所有信号的值。
例
module vd;
reg a, b, c, q;
initial begin
$monitor("[%0t] a=%0b b=%0b c=%0b q=%0b", $time, a, b, c, q);
// Initialize all signals to 0 at time 0
a <= 0;
b <= 0;
c <= 0;
q <= 0;
// Inter-assignment delay: Wait for #5 time units
// and then assign a and c to 1. Note that 'a' and 'c'
// gets updated at the end of current timestep
#5 a <= 1;
c <= 1;
// Intra-assignment delay: First execute the statement
// then wait for 5 time units and then assign the evaluated
// value to q
q <= #5 a & b | c;
#20;
end
endmodule
上面的代码给出以下输出:
xcelium> run
[0] a=0 b=0 c=0 q=0
[5] a=1 b=0 c=1 q=0
xmsim: *W,RNQUIE: Simulation is complete.
在5个时间单位,使用非阻塞语句分配a和c。非阻塞语句的行为得到评估,但仅在时间步长结束时才分配给变量。
因此,当执行下一个非阻塞语句q时,a和c的值被评估为1,但未赋值。因此,当评估q的RHS时,a和c仍旧值为0,因此$ monitor不会检测到更改以显示该语句。
为了观察更改,让我们将赋值语句从非阻塞更改为阻塞。
// Non-blocking changed to blocking
// rest of the code remains the same
#5 a = 1;
c = 1;
q <= #5 a & b | c;
输出结果如下:
xcelium> run
[0] a=0 b=0 c=0 q=0
[5] a=1 b=0 c=1 q=0
[10] a=1 b=0 c=1 q=1
xmsim: *W,RNQUIE: Simulation is complete.