Wat is Verilog?

Hardwarebeschrijvingstaal die veel wordt gebruikt voor ontwerp en verificatie van digitale circuits. Circuits worden per module geschreven en het gedrag wordt met assign en always beschreven.

Japanse benaming: Verilog

“Verilog” komt voor in 21 oefenvragen uit 2 onderwerpen, bijv. Hardwarebeschrijvingstalen en verificatie, LSI-ontwerpflow en EDA.

Vakgebied: Hardwarebeschrijvingstalen en verificatie

Modules, assign en always

Een Verilog-ontwerp is opgebouwd uit modules, elk een blok schakeling met gedeclareerde ingangs- en uitgangspoorten. Een module kan zo vaak als nodig binnen een andere worden geïnstantieerd, met de poorten aan elkaar verbonden, zodat een chip wordt beschreven als een hiërarchie van componenten. Binnen een module beschrijft een continue toewijzing zoals assign y = (a & b) | c combinatorische logica waarvan de uitgang altijd de ingangen volgt. Een always-blok beschrijft gedrag dat door gebeurtenissen wordt getriggerd: always @(posedge clk) wordt flankgetriggerde flipflops, terwijl always @(*) opnieuw wordt geëvalueerd zodra een signaal dat het leest verandert, en combinatorische logica beschrijft.

Denken in hardware, niet in stappen

Verilog lijkt op een programmeertaal, maar elke assign-opdracht en elk always-blok werkt gelijktijdig, ongeacht de volgorde in het bestand. In geklokte blokken evalueren non-blocking toewijzingen (<=) alle rechterleden met de waarden van vóór de flank en werken ze daarna samen bij, net als flipflops die tegelijk bemonsteren; blocking toewijzingen (=) passen bij combinatorische blokken die tussenwaarden van boven naar beneden berekenen. Een signaal dat als reg is gedeclareerd, is niet per se een register: toegewezen in always @(*) is het combinatorisch. Een if zonder else in een combinatorisch blok impliceert geheugen en leidt tot een onbedoelde latch. Ook breedtes doen ertoe, omdat toewijzingen ongemerkt afkappen, en signalen zijn unsigned tenzij ze signed zijn gedeclareerd.

Simulatiesemantiek en logica met vier toestanden

Verilog-simulators zijn event-driven: ze evalueren alleen de logica opnieuw waarvan de ingangen zijn veranderd, wat efficiënt is omdat er per cyclus weinig signalen omschakelen. Signalen nemen vier waarden aan: 0, 1, X voor onbekend en Z voor hoge impedantie. Niet-geïnitialiseerde registers en conflicterende drivers geven X, en niet-aangestuurde nets geven Z, dus een van beide in een golfvorm zien is een sterke aanwijzing bij het debuggen. Sommige semantiek is optimistisch: een if-opdracht behandelt een X-conditie als onwaar, wat bugs verbergt die echte hardware zou blootleggen. De operator == geeft X terug als operanden X of Z bevatten, terwijl === ze letterlijk vergelijkt en alleen in testbenches wordt gebruikt.

Verilog, SystemVerilog en VHDL

Slechts een deel van Verilog is synthetiseerbaar. Vertragingen zoals #10, $display en bestands-I/O zijn alleen voor simulatie en worden door synthese genegeerd, dus testbenches mogen ze vrij gebruiken maar RTL niet. SystemVerilog, de opvolgende standaard, voegt het type logic toe, waarmee het onderscheid tussen wire en reg grotendeels verdwijnt, en always_ff en always_comb, die de bedoeling van de ontwerper vastleggen zodat tools een ongewenste latch kunnen signaleren. Het voegt ook uitgebreide verificatiemogelijkheden toe, zoals assertions en klassen. VHDL is de andere grote hardwarebeschrijvingstaal, met strengere typering en een uitgebreidere stijl; beide worden gebruikt voor RTL-ontwerp.

Nu oefenen: vragen over Verilog

Welke uitspraak over het belangrijkste verschil tussen een beschrijving in een HDL zoals Verilog en een softwareprogramma in bijvoorbeeld C is juist?

  1. AEen HDL-beschrijving stelt schakelingen voor die gelijktijdig en parallel werken
  2. BEen HDL-beschrijving is een reeks instructies die regel voor regel van boven naar beneden worden uitgevoerd
  3. CIn HDL kunnen geen variabelen of voorwaardelijke sprongen worden gebruikt
Antwoord en toelichting tonen

Antwoord: A. Een HDL-beschrijving stelt schakelingen voor die gelijktijdig en parallel werken

Een HDL lijkt qua uiterlijk op een programma, maar wat erin is geschreven wordt door logische synthese een schakeling van poorten en flipflops. Alle delen van de schakeling werken voortdurend tegelijk, dus meerdere assign-statements en always-blokken werken parallel, onafhankelijk van de volgorde waarin ze zijn geschreven. Wie zoals bij software denkt in 'als deze bewerking klaar is, volgt de volgende', krijgt niet de bedoelde schakeling, dus het is belangrijk tijdens het schrijven na te denken over welke schakeling ontstaat.

Welke uitspraak over het doel van het gebruik van een module in Verilog is juist?

  1. AEen onderdeel van een schakeling met ingangs- en uitgangsaansluitingen (poorten) definiëren, zodat het in andere modules kan worden gebruikt
  2. BDe uitvoering van het programma tijdelijk stoppen
  3. CHet resultaat van de simulatie op het scherm tonen
Antwoord en toelichting tonen

Antwoord: A. Een onderdeel van een schakeling met ingangs- en uitgangsaansluitingen (poorten) definiëren, zodat het in andere modules kan worden gebruikt

Een module is de eenheid waarmee een samenhangend deel van een schakeling met ingangs- en uitgangspoorten wordt gedefinieerd, zoals een opteller, een teller of een hele CPU. Een gedefinieerde module kan in een andere module als onderdeel zo vaak als nodig worden gebruikt (instantiëring), en door de poorten met bedrading te verbinden wordt een grotere schakeling opgebouwd. Net als bij het rangschikken en bedraden van onderdelen op een printplaat kunnen schakelingen hiërarchisch worden gemaakt.

Veelgestelde vragen

Wat is het verschil tussen wire en reg in Verilog?

Een wire wordt aangestuurd door een continue toewijzing of een module-uitgang, terwijl een reg binnen een always- of initial-blok wordt toegewezen. Een reg wordt pas een flipflop als hij op een klokflank wordt bijgewerkt; in always @(*) is het combinatorische logica.

Wanneer gebruik ik blocking (=) en wanneer non-blocking (<=) toewijzingen?

Gebruik non-blocking toewijzingen in geklokte always-blokken die flipflops beschrijven, en blocking toewijzingen in combinatorische always-blokken. De twee mengen in één blok of blocking toewijzingen gebruiken voor sequentiële logica kan de simulatie afhankelijk maken van de volgorde van opdrachten en laten afwijken van de hardware.

Wat is het verschil tussen Verilog en SystemVerilog?

SystemVerilog is een superset van Verilog die ontwerpgemakken toevoegt, zoals het type logic, always_ff en always_comb, plus verificatiemogelijkheden zoals assertions, constrained random stimulus en objectgeoriënteerde testbenches.

“Verilog” in de toelichting

Vragen met “Verilog” (21)

  1. Welke uitspraak over het belangrijkste verschil tussen een beschrijving in een HDL zoals Verilog en een softwareprogramma in bijvoorbeeld C is juist?
  2. Welke uitspraak over het doel van het gebruik van een module in Verilog is juist?
  3. Welke uitspraak over het verschil tussen het wire-type en het reg-type in Verilog is juist?
  4. Welke uitspraak over de schakeling die door het bovenstaande Verilog-assign-statement wordt voorgesteld, is juist?
  5. Welke uitspraak over de schakeling die door logische synthese uit de bovenstaande Verilog-beschrijving ontstaat, is juist?
  6. Welke uitspraak over de werking van de niet-blokkerende toekenning (<=) in Verilog is juist?
  7. Welke algemene richtlijn voor het onderscheiden van soorten toekenning in Verilog is juist?
  8. Welke uitspraak over de betekenis van 'always @(*)' in Verilog is juist?
  9. Welke van de volgende Verilog-beschrijvingen wordt door logische synthese niet tot een schakeling gemaakt maar genegeerd (een beschrijving voor simulatie)?
  10. In Verilog worden de 8-bits signalen a en b opgeteld en wordt het resultaat aan het 8-bits signaal s toegekend (assign s = a + b;). Welk aandachtspunt is juist?
  11. Welke combinatie van waarden van de vierwaardige logica die in Verilog-simulatie wordt gebruikt is juist?
  12. Als sel in de bovenstaande beschrijving X (onbepaald) is, wordt in Verilog-simulatie b voor y gekozen. Welke reden waarom deze eigenschap bij verificatie een probleem is, is juist?
  13. Welk voordeel van het gebruik van always_ff en always_comb van SystemVerilog in plaats van always van Verilog is juist?
  14. Welke uitspraak over het verschil tussen de gelijkheidsoperatoren '==' en '===' in Verilog is juist?
  15. Welke volgorde is juist voor de ontwerpflow van een gewone digitale LSI?

Vergelijkingen met deze term

Verwante termen

SystemVerilog Logische synthese Numerieke apertuur (NA) Combinatorische schakeling Hardwarebeschrijvingstaal (HDL) Flipflop RTL (register transfer level) Netlist Tape-out SPICE

Naar de woordenlijst