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.
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.