Verilog is een hardware beschrijvingstaal (HDL) die wordt gebruikt voor het ontwerpen, simuleren en verifiëren van digitale elektronische systemen, met name geïntegreerde schakelingen (IC's). Ontwikkeld in de jaren '80, stelt Verilog ingenieurs in staat om het gedrag en de structuur van elektronische systemen op verschillende abstractieniveaus te beschrijven, van het hoog-niveau algoritme tot het poortniveau. De primaire rol is het faciliteren van de simulatie en synthese van digitale logische schakelingen, waardoor het efficiënte ontwerp en de verificatie van complexe hardwarecomponenten zoals CPU's, FPGA's (Field-Programmable Gate Arrays) en ASIC's (Application-Specific Integrated Circuits) mogelijk wordt gemaakt.
Verilog is ontstaan in 1984 als een propriëtaire taal ontwikkeld door Gateway Design Automation. Het oorspronkelijke doel was het bieden van een modelleertool voor digitale systemen. In 1990 werd het overgenomen door Cadence Design Systems, wat de bredere acceptatie van de taal in de elektronica-industrie vergemakkelijkte.
In 1995 werd Verilog gestandaardiseerd als IEEE 1364, waarmee het een officiële HDL-standaard werd. Deze standaardisatie droeg aanzienlijk bij aan de populariteit van Verilog, waardoor het kon concurreren met andere HDLs, met name VHDL, dat in de jaren '80 aan populariteit had gewonnen door het gebruik in militaire en luchtvaarttoepassingen.
In de daaropvolgende jaren is Verilog geëvolueerd om constructies voor moderne ontwerpmethodologieën zoals SystemVerilog op te nemen, een uitbreiding die functies van zowel Verilog als objectgeoriënteerde programmeerparadigma's integreert. Tegenwoordig vertegenwoordigt SystemVerilog zowel een verificatie- als een ontwerptool, wat de mogelijkheden van Verilog verder vergroot.
Tot op heden blijven Verilog en zijn extensies een fundamentele taal in de elektronica-ontwerpautomatisering (EDA) industrie, met een robuust ecosysteem van tools die worden aangeboden door verschillende grote bedrijven zoals Synopsys, Mentor Graphics en Cadence.
Het fundamentele bouwblok in Verilog is de module. Modules bevatten ingangen, uitgangen en interne logica.
module my_adder(input a, input b, output sum);
assign sum = a + b;
endmodule
Verilog ondersteunt procedurele blokken zoals always
en initial
, die sequentiële logica en initialisatie mogelijk maken.
always @(posedge clk) begin
q <= d; // Bij de opgaande rand van clk, wijs d toe aan q
end
Continue toewijzingen kunnen worden gemaakt met de assign
verklaring, die ervoor zorgt dat de uitvoer onmiddellijk de wijziging in ingangen weerspiegelt.
wire out;
assign out = a & b; // EN-poort
Verilog maakt directe modellering mogelijk met behulp van ingebouwde primitieve zoals AND, OR en NOT.
and my_and(out, a, b); // Instantieert een EN-poort
Testbenches worden in Verilog gebruikt om de functionaliteit van een ontwerp te simuleren en te verifiëren.
module tb_my_adder;
reg a, b;
wire sum;
my_adder dut (.a(a), .b(b), .sum(sum)); // Instantieer het ontwerp
initial begin
a = 0; b = 0; #10; // Pas ingangen toe en wacht
a = 1; #10;
b = 1; #10;
end
endmodule
Verilog ondersteunt voorwaardelijke verklaringen zoals if
, case
voor besluitvorming in procedurele blokken.
if (sel) begin
out = a;
end else begin
out = b;
end
Lussen kunnen in Verilog worden gebruikt voor repetitieve toewijzingen en bewerkingen.
for (i = 0; i < 8; i = i + 1) begin
// Voer bewerkingen uit
end
Verilog staat parameterized modules toe, waardoor ontwerpen kunnen worden hergebruikt met verschillende configuraties.
module my_multiplier #(parameter WIDTH = 8)(input [WIDTH-1:0] a, input [WIDTH-1:0] b, output [2*WIDTH-1:0] product);
assign product = a * b;
endmodule
Verilog biedt de mogelijkheid om taken en functies te definiëren voor modulair codeontwerp.
function [7:0] add(input [7:0] a, input [7:0] b);
add = a + b;
endfunction
Niet-blokkerende toewijzingen met de <=
operator maken een betere modellering van synchrone ontwerpen mogelijk.
always @(posedge clk) begin
q <= d; // Gepland voor latere uitvoering
end
De ontwikkeling van Verilog wordt vergemakkelijkt door een verscheidenheid aan tools en IDE's. Veelgebruikte software omvat ModelSim, Synopsys VCS en Cadence Incisive, die simulatie-, synthese- en debugmogelijkheden bieden.
Om een Verilog-project te bouwen, schrijf je doorgaans je Verilog-code in .v
-bestanden. Je kunt vervolgens een simulator of synthese-tool aanroepen vanuit de opdrachtregel of binnen een IDE. Een compilatieopdracht kan er bijvoorbeeld als volgt uitzien:
vcs my_design.v -o my_sim
Na compilatie kun je de simulatie uitvoeren met:
./my_sim
Verilog wordt voornamelijk gebruikt in het ontwerp en de verificatie van digitale schakelingen, waaronder:
De mogelijkheid om hardware op verschillende abstractieniveaus te modelleren maakt het veelzijdig voor tal van toepassingen in de elektronica-industrie.
Verilog wordt vaak vergeleken met andere HDL-talen zoals VHDL. Hoewel beide vergelijkbare doeleinden dienen, wordt Verilog over het algemeen als gemakkelijker te leren beschouwd vanwege de vereenvoudigde syntaxis die lijkt op de C-programmeertaal. VHDL heeft de voorkeur voor meer uitgebreide ontwerpen die sterke type-controle vereisen en wordt vaak gebruikt in overheids- en luchtvaarttoepassingen.
In vergelijking met software programmeertalen zoals C en Java, richt Verilog zich op hardwarestructuren en gelijktijdige processen, terwijl softwaretalen sequentiële en procedurele logica behandelen. Python kan worden gebruikt voor hoog-niveau testen en verwerking van simulatiegegevens, maar biedt geen directe methode voor hardwarebeschrijving.
Voor degenen die Verilog-ontwerpen naar andere HDL-formaten willen vertalen, bestaan er tools zoals Calyx en andere open-source software om dit proces te vergemakkelijken. De specifieke kenmerken van Verilog kunnen echter directe vertalingen uitdagend maken vanwege de inherente verschillen in abstractie en intentie van elke taal.
Tools zoals Verilator of Yosys zijn ontwikkeld om te helpen Verilog-code om te zetten in verschillende formaten of deze te optimaliseren, en ze bieden mogelijkheden voor synthese en simulatie. Deze tools zijn bijzonder nuttig voor het integreren van Verilog-ontwerpen in flow-georiënteerde omgevingen.