Verilog Simulatie Technieken voor betrouwbare RTL-verificatie
Verilog is een hardwarebeschrijvingstaal en er is geen vereiste voor ontwerpers om hun RTL-ontwerpen te simuleren om ze om te zetten in logic gates. Wat is dan de noodzaak om te simuleren?
Simulatie is een techniek om verschillende input-stimuli op verschillende tijden aan het ontwerp toe te passen om te controleren of de RTL-code zich gedraagt zoals bedoeld. Essentieel is simulatie een veelgebruikte techniek om de robuustheid van het ontwerp te verifiëren. Het is ook vergelijkbaar met hoe een gefabriceerde chip in de echte wereld gebruikt zal worden en hoe het reageert op verschillende inputs.
Bijvoorbeeld, het bovenstaande ontwerp vertegenwoordigt een positieve flankdetector met inputs klok en signaal die op periodieke intervallen geëvalueerd worden om de output pe te vinden zoals getoond. Simulatie stelt ons in staat om het timing-diagram van gerelateerde signalen te bekijken om te begrijpen hoe de ontwerpbeschrijving in Verilog zich daadwerkelijk gedraagt.
Er zijn verschillende EDA-bedrijven die simulators ontwikkelen die in staat zijn de outputs te bepalen voor verschillende inputs aan het ontwerp. Verilog is gedefinieerd in termen van een discrete event uitvoermodel en verschillende simulators zijn vrij om verschillende algoritmes te gebruiken om de gebruiker een consistente set resultaten te geven. De Verilog-code wordt verdeeld in meerdere processen en threads en kan op verschillende tijden geëvalueerd worden tijdens een simulatie, wat later aangeraakt zal worden.
Voorbeeld
De testbench genaamd tb is een container om een ontwerpmodule te bevatten. In dit voorbeeld hebben we geen ontwerpinstanties gebruikt. Er zijn twee variabelen of signalen die bepaalde waarden op specifieke tijden kunnen krijgen. clk vertegenwoordigt een klok die gegenereerd wordt binnen de testbench. Dit wordt gedaan door de always-statement door de klokwaarde om te keren na elke 5ns. Het initial-blok bevat een set statements die verschillende waarden aan beide signalen toewijzen op verschillende tijden.
module tb;
reg clk;
reg sig;
// Klokgeneratie
// Proces start op tijd 0ns en loopt na elke 5ns
always #5 clk = ~clk;
// Initial-blok: Proces start op tijd 0ns
initial begin
// Deze system-taak print de signaalwaarden elke keer dat ze veranderen
$monitor("Time = %0t clk = %0d sig = %0d", $time, clk, sig);
// Ook stimulus genoemd, we wijzen simpelweg verschillende waarden toe aan de variabelen
// na enige simulatie "vertraging"
sig = 0;
#5 clk = 0; // Wijs clk 0 toe op tijd 5ns
#15 sig = 1; // Wijs sig 1 toe op tijd 20ns (#5 + #15)
#20 sig = 0; // Wijs sig 0 toe op tijd 40ns (#5 + #15 + #20)
#15 sig = 1; // Wijs sig 1 toe op tijd 55ns (#5 + #15 + #20 + #15)
#10 sig = 0; // Wijs sig 0 toe op tijd 65ns (#5 + #15 + #20 + #15 + #10)
#20 $finish; // Beëindig simulatie op tijd 85ns
end
endmodule
De simulator levert de volgende output na uitvoering van de bovenstaande testbench.
Simulatie-log
ncsim> run Time = 0 clk = x sig = 0 Time = 5 clk = 0 sig = 0 Time = 10 clk = 1 sig = 0 Time = 15 clk = 0 sig = 0 Time = 20 clk = 1 sig = 1 Time = 25 clk = 0 sig = 1 Time = 30 clk = 1 sig = 1 Time = 35 clk = 0 sig = 1 Time = 40 clk = 1 sig = 0 Time = 45 clk = 0 sig = 0 Time = 50 clk = 1 sig = 0 Time = 55 clk = 0 sig = 1 Time = 60 clk = 1 sig = 1 Time = 65 clk = 0 sig = 0 Time = 70 clk = 1 sig = 0 Time = 75 clk = 0 sig = 0 Time = 80 clk = 1 sig = 0 Simulation complete via $finish(1) at time 85 NS + 0
Wat is een simulatie-golfvorm?
Simulaties stellen ons in staat om ontwerp- en testbench-signalen in een golfvorm te dumpen die grafisch weergegeven kan worden om de functionaliteit van het RTL-ontwerp te analyseren en debuggen. De hieronder getoonde golfvorm is verkregen uit een EDA-tool en toont de voortgang van elk signaal ten opzichte van tijd en is hetzelfde als het eerder getoonde timing-diagram.
Elke verandering in de waarde van een variabele of net heet een update-event. En processen zijn gevoelig voor update-events zodanig dat deze processen geëvalueerd worden telkens wanneer het update-event plaatsvindt en heet een evaluation-event. Vanwege de mogelijkheid van meerdere processen die willekeurig geëvalueerd worden, moet de volgorde van veranderingen bijgehouden worden in iets wat een event-wachtrij heet.
Naturellijk zijn ze geordend op simulatiettijd. Plaatsing van een nieuw event op de wachtrij heet scheduling. Simulatiettijd wordt gebruikt om te verwijzen naar de tijdwaarde die door de simulator bijgehouden wordt om de actuele tijd te modelleren die het gesimuleerde circuit zou kosten. De tijdwaarden voor het bovenstaande voorbeeld zijn in nanoseconden ns getoond in het timing-diagram.
module des;
wire abc;
wire a, b, c;
assign abc = a & b | c;
// abc wordt geüpdatet via de assign-statement (proces) wanneer a, b of c veranderen -> update event
endmodule
Vernieuw Verilog en zie een voorbeeld!
Regio's in event-wachtrij
De Verilog event-wachtrij is logisch verdeeld in vijf regio's, en events kunnen aan elke regio toegevoegd worden. Echter, ze kunnen alleen uit de actieve regio verwijderd worden.
| Events | Beschrijving |
|---|---|
| Active | Vinden plaats op de huidige simulatiettijd, en kunnen in willekeurige volgorde verwerkt worden |
| Inactive | Vinden plaats op de huidige simulatiettijd, maar worden verwerkt na afloop van alle actieve events |
| Nonblocking | Geëvalueerd op een eerdere tijd, maar toewijzing gebeurt in de huidige simulatiettijd na actieve en inactieve events |
| Monitor | Verwerkt na alle actieve, inactieve en non-blocking events |
| Future | Vinden plaats op een toekomstige simulatiettijd |
Een simulatiecyclus is waar alle actieve events verwerkt worden. De standaard garandeert een bepaalde scheduling-volgorde behalve voor een paar gevallen. Statements binnen een begin-end-blok worden bijvoorbeeld alleen uitgevoerd in de volgorde waarin ze verschijnen.
module tb;
reg [3:0] a;
reg [3:0] b;
initial begin
// Statements worden één na de ander uitgevoerd op geschikte simulatiettijden
a = 5; // Op tijd 0ns, krijgt a waarde 5
b = 2; // In dezelfde simulatiestap (tijd 0ns), krijgt b waarde 2
#10 a = 7; // Wanneer simulatie vooruitgaat naar 10ns, krijgt a waarde 7
end
endmodule
De event-wachtrij definieert dat toewijzing aan b moet gebeuren na toewijzing aan a.
Verilog
- Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
- Verilog concatenatie beheersen: Een praktische gids
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
- Verilog-functies beheersen voor efficiënt RTL-ontwerp
- Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
- Verilog \`ifdef: Conditionele compilatie uitgelegd
- Verilog Scheduling Semantics begrijpen: Timing, Events, en Uitvoeringsvolgorde
- Verilog Clock Generator: Ontwerp & Implementatie Gids
- Verilog Display Tasks beheersen: Efficiënt Debuggen & Loggen
- Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp