Verilog Inter и внутренняя задержка назначения
Операторы задержки Verilog могут иметь задержки, указанные либо в левой, либо в правой части оператора присваивания.
Задержки между назначениями
// Delay is specified on the left side
#<delay> <LHS> = <RHS>
взаимное назначение Оператор задержки имеет значение задержки в левой части оператора присваивания. Это указывает на то, что сам оператор выполняется после задержка истекает, и это наиболее часто используемая форма управления задержкой.
module tb;
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;
// 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 становится равным 1 в единицах времени 10, потому что выражение оценивается в единицах времени 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
<LHS> = #<delay> <RHS>
внутреннее задание задержка - это та, где есть задержка на правой стороне оператора присваивания. Это указывает на то, что оператор оценивается, и значения всех сигналов на RHS захватываются в первую очередь. Затем он присваивается результирующему сигналу только после задержка истекает.
module tb;
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
Обратите внимание, что присвоение q отсутствует в журнале!
Журнал моделирования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 назначаются с использованием неблокирующих операторов. И поведение неблокирующего операторы таковы, что RHS оценивается, но присваивается переменной только в конце этого временного шага.
Таким образом, значения a и c оцениваются как 1, но еще не присваиваются, когда выполняется следующий неблокирующий оператор, который является оператором q. Таким образом, когда оценивается правая часть q, a и c по-прежнему имеют старое значение 0 и, следовательно, $monitor
не обнаруживает изменения для отображения инструкции.
Чтобы увидеть это изменение, давайте изменим операторы присваивания на a и c с неблокирующих на блокирующие.
...
// Non-blocking changed to blocking and 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.
Verilog