📜  Verilog内部和内部延迟

📅  最后修改于: 2021-01-11 14:54:33             🧑  作者: Mango

Verilog内部和内部延迟

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.