Verilog Inter- en intratoewijzingsvertraging
Verilog-vertragingsinstructies kunnen vertragingen hebben die aan de linkerkant of aan de rechterkant van de toewijzingsoperator zijn gespecificeerd.
Vertragingen tussen opdrachten
// Delay is specified on the left side
#<delay> <LHS> = <RHS>
Een tussenopdracht vertragingsverklaring heeft een vertragingswaarde op de LHS van de toewijzingsoperator. Dit geeft aan dat de instructie zelf wordt uitgevoerd na de vertraging verloopt en is de meest gebruikte vorm van vertragingsregeling.
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
Merk op dat q 1 wordt op tijdstip 10 eenheden omdat de verklaring wordt geëvalueerd op 10 tijdseenheden en RHS, wat een combinatie is van a, b en c, wordt geëvalueerd tot 1.
Simulatielogboekxcelium> 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.
Vertragingen binnen een opdracht
// Delay is specified on the right side
<LHS> = #<delay> <RHS>
Een intra-opdracht vertraging is er een waarbij er een vertraging is op de RHS van de toewijzingsoperator. Dit geeft aan dat de verklaring wordt geëvalueerd en dat eerst de waarden van alle signalen op de RHS worden vastgelegd. Daarna wordt het pas na . aan het resulterende signaal toegewezen de vertraging verloopt.
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
Merk op dat de toewijzing aan q ontbreekt in het logboek!
Simulatielogboekxcelium> 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.
Dit komt omdat bij 5 tijdseenheden a en c worden toegewezen met behulp van niet-blokkerende instructies. En het gedrag van niet-blokkerende uitspraken is zodanig dat RHS wordt geëvalueerd, maar pas aan het einde van die tijdstap aan de variabele wordt toegewezen.
Dus de waarde van a en c wordt geëvalueerd tot 1, maar nog niet toegewezen wanneer de volgende niet-blokkerende instructie die van q wordt uitgevoerd. Dus wanneer RHS van q wordt geëvalueerd, hebben a en c nog steeds de oude waarde 0 en dus $monitor
detecteert geen wijziging om de instructie weer te geven.
Laten we, om de verandering te observeren, de toewijzingsinstructies wijzigen in a en c van niet-blokkerend naar blokkerend.
...
// Non-blocking changed to blocking and rest of the
// code remains the same
#5 a = 1;
c = 1;
q <= #5 a & b | c;
...
Simulatielogboek 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