Verilog
Den här artikeln behöver källhänvisningar för att kunna verifieras. (2023-01) Åtgärda genom att lägga till pålitliga källor (gärna som fotnoter). Uppgifter utan källhänvisning kan ifrågasättas och tas bort utan att det behöver diskuteras på diskussionssidan. |
Verilog är ett hårdvarubeskrivande språk liksom VHDL. Det används för att beskriva digitala kretsar som sedan kan realiseras och hamna på ett chip. En stor skillnad mellan hårdvarubeskrivande språk och konventionella programspråk är att exekvering av ett programblock kan ske både parallellt och sekventiellt.
Fördelen med att konstruera kretsar med hjälp av ett språk är att det är lättare att simulera och realisera än att räkna allting för hand. Det är också lättare att beskriva vad en funktion ska åstadkomma i ett chip och sedan låta en kompilator räkna ut den optimala grindstrukturen.
Verilog lånar många element av sin syntax och exekvering från C.
En skillnad mellan Verilog och VHDL är att Verilog-standarden inte definierar parallellitet på ett sätt som gör exekveringen kompilatoroberoende. Verilog skapades som ett kommersiellt programspråk från början och har därför programelement för att underlätta konstruktion och verifiering av en design, till skillnad från VHDL som fått dylika funktioner senare som en påbyggnad.
Historia
[redigera | redigera wikitext]Verilog skapades 1984 av Gateway Design Automation Inc som köptes 1990 av Cadence. Cadence valde 1991 att försöka öppna språket och göra det till en standard. Arbetet kallades Open Verilog Initiative (OVI) men man såg snart att man behövde en hårdare standard för att inte språket åter skulle divergera. Därför vände man sig till det amerikanska standardiseringsorganet IEEE och bildade 1994 IEEE [1364 Working Group]. Arbetsgruppen standardiserade språket 1995 som IEEE std. 1364-1995.
Programexempel
[redigera | redigera wikitext]D-vippa
[redigera | redigera wikitext]Följande exempel är en D-vippa med asynkron reset:
module d_flipflop
(input wire clk,
input wire reset_n,
input wire q,
output reg d);
always @(posedge clk, negedge reset_n) begin
if (not reset_n) begin
d <= 1'b0;
end else begin
d <= q;
end
end
endmodule