Verilog - In einer Nussschale
Der gesamte Verhaltenscode ist in module
geschrieben und endmodule
. Welches digitale Design Sie auch immer erstellen möchten, es passt in module
Block. Es können Ports definiert sein oder nicht - erlauben Sie Signalen, in den Block als input
einzutreten oder entkomme dem Block als output
.
Modul
Das leere Modul im Beispiel unten heißt testbench . Sie können es beliebig benennen, außer dass es alphanumerisch sein sollte und '_' enthalten darf.
module testbench;
endmodule
Schauen wir uns ein anderes Modul an. Es hat ein paar Signale (d, clk, rstb ) als Eingaben deklariert und q als Ausgabe deklariert.
module dff (input d,
clk,
rstb,
output q);
endmodule
Datentypen
Nachdem wir nun gesehen haben, wie ein Modul aussieht, sehen wir uns an, was in ein Modul gesteckt werden kann, indem wir uns das Testbench-Modul noch einmal ansehen. Es gibt hauptsächlich zwei Arten von Datentypen in Verilog:
- reg
- Draht
reg
Der Datentyp wird verwendet, um Werte wie eine Variable festzuhalten, während ein wire
ist nur analog zu einem elektrischen Draht, der kontinuierlich angetrieben werden muss. Also typischerweise wire
wird verwendet, um zwischen mehreren Modulen und anderen Signalen zu verbinden.
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
endmodule
Aufgaben
Verilog hat drei grundlegende Blöcke:
always @ (Bedingung ) | wird immer ausgeführt, wenn die Bedingung erfüllt ist |
initial | wird nur einmal ausgeführt, wenn die Simulation beginnt |
assign [LHS] =[RHS] | Der LHS-Wert wird aktualisiert, wenn sich die RHS ändert |
Beim Schreiben von Verilog sind einige Regeln zu beachten:
reg
kann nur ininitial
zugewiesen werden undalways
Blöckewire
kann nur überassign
mit einem Wert belegt werden Erklärung- Wenn es mehrere Anweisungen in einem initial/always gibt Block, sollten sie in
begin .. end
eingeschlossen werden
module testbench;
reg d;
reg rst_b;
reg clk;
wire q;
initial begin
d = 0;
rst_b = 0;
clk = 0;
#100 $finish;
end
always begin
#10 clk = ~clk;
end
endmodule
Hinweis Folgendes aus dem oben gezeigten Beispiel:
- Da es mehrere Zeilen für
initial
gibt Blockieren, beginnen und Ende verwendet werden - Die Signale d, rst_b und clk werden innerhalb eines Anfangsblocks zugewiesen, da sie vom Typ
reg
sind - Code innerhalb des Anfangsblocks wird bei 0ns ausgeführt, d. h. Beginn der Simulation
- Da es keine Bedingung für
always
gibt Block, läuft es wie eine Endlosschleife in C - # wird verwendet, um die Zeitverzögerung darzustellen. #10 weist den Simulator an, die Simulationszeit um 10 Einheiten vorzuziehen.
clk = ~clk;
wird den Wert der Uhr umschalten, und weil #10 vor die Anweisung gesetzt wird, wird die Uhr alle 10 Zeiteinheiten umgeschaltet.$finish
ist der Weg, um eine Simulation zu beenden. In diesem Fall wird es für 100 Zeiteinheiten ausgeführt und beendet.
Verilog