Verilog-Aufgaben
Das Platzieren von Werten auf Netzen und Variablen wird als Zuweisungen bezeichnet. Es gibt drei Grundformen:
- Verfahrensweise
- Kontinuierlich
- Prozedural kontinuierlich
Gesetzliche LHS-Werte
Eine Zuweisung besteht aus zwei Teilen – rechts (rechts) und links (links) mit einem Gleichheitszeichen (=) oder einem Kleiner-als-gleich-Zeichen (<=) dazwischen.
Zuweisungstyp | Linke Seite |
---|---|
Verfahrensweise |
|
Kontinuierlich |
|
Prozedural Kontinuierlich |
|
Die RHS kann jeden Ausdruck enthalten, der zu einem Endwert ausgewertet wird, während die LHS ein Netz oder eine Variable angibt, der der Wert in RHS zugewiesen wird.
module tb;
reg clk;
wire a, b, c, d, e, f;
reg z, y;
// clk is on the LHS and the not of clk forms RHS
always #10 clk = ~clk;
// y is the LHS and the constant 1 is RHS
assign y = 1;
// f is the LHS, and the expression of a,b,d,e forms the RHS
assign f = (a | b) ^ (d & e);
always @ (posedge clk) begin
// z is the LHS, and the expression of a,b,c,d forms the RHS
z <= a + b + c + d;
end
initial begin
// Variable names on the left form LHS while 0 is RHS
a <= 0; b <= 0; c <= 0; d <= 0; e <= 0;
clk <= 0;
end
endmodule
Verfahrensauftrag
Prozedurale Zuweisungen treten in Prozeduren wie always, initial, task und functions auf und werden verwendet, um Variablen Werte zuzuweisen. Die Variable behält den Wert bis zur nächsten Zuweisung an dieselbe Variable.
Der Wert wird auf die Variable gesetzt, wenn die Simulation diese Anweisung irgendwann während der Simulationszeit ausführt. Dies kann durch die Verwendung von Kontrollflussanweisungen wie if-else-if, case-Anweisung und Schleifenmechanismen nach Belieben gesteuert und modifiziert werden.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
Zuweisung der Variablendeklaration
Ein Anfangswert kann einer Variablen zum Zeitpunkt ihrer Deklaration zugewiesen werden, wie nachstehend gezeigt. Die Zuweisung hat keine Dauer und hält den Wert, bis die nächste Zuweisung an dieselbe Variable erfolgt. Beachten Sie, dass Zuweisungen von Variablendeklarationen an ein Array nicht zulässig sind.
module my_block;
reg [31:0] data = 32'hdead_cafe;
initial begin
#20 data = 32'h1234_5678; // data will have dead_cafe from time 0 to time 20
// At time 20, data will get 12345678
end
endmodule
reg [3:0] a = 4'b4;
// is equivalent to
reg [3:0] a;
initial a = 4'b4;
Wenn die Variable während der Deklaration und zum Zeitpunkt 0 in einem Anfangsblock wie unten gezeigt initialisiert wird, ist die Reihenfolge der Auswertung nicht garantiert und kann daher entweder 8'h05 oder 8'hee haben.
module my_block;
reg [7:0] addr = 8'h05;
initial
addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illegal
integer i = 0, j; // declares two integers i,j and i is assigned 0
real r2 = 4.5, r3 = 8; // declares two real numbers r2,r3 and are assigned 4.5, 8 resp.
time startTime = 40; // declares time variable with initial value 40
Verfahrensblöcke und Zuweisungen werden in einem späteren Abschnitt ausführlicher behandelt.
Kontinuierliche Zuweisung
Klicken Sie hier für ein Schritt-für-Schritt-Simulationsbeispiel !
Dies wird verwendet, um Skalar- und Vektornetzen Werte zuzuweisen, und geschieht immer dann, wenn sich die RHS ändert. Es bietet eine Möglichkeit, kombinatorische Logik zu modellieren, ohne eine Verbindung von Gattern zu spezifizieren, und erleichtert es, das Netz mit logischen Ausdrücken zu steuern.
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
Immer wenn b oder c seinen Wert ändert, wird der gesamte Ausdruck in RHS ausgewertet und a wird mit dem neuen Wert aktualisiert.
Nettodeklarationszuweisung
Dies ermöglicht es uns, eine kontinuierliche Zuweisung auf dieselbe Anweisung zu setzen, die das Netz deklariert. Beachten Sie, dass, da ein Netz nur einmal deklariert werden kann, nur eine Deklarationszuweisung für ein Netz möglich ist.
wire penable = 1;
Prozedurale kontinuierliche Zuweisung
Dies sind prozedurale Anweisungen, die es ermöglichen, Ausdrücke kontinuierlich Netzen oder Variablen zuzuweisen, und es gibt zwei Typen.
assign
...deassign
force
...release
Zuweisung aufheben
Dies überschreibt alle prozeduralen Zuweisungen an eine Variable und wird deaktiviert, indem dasselbe Signal mit deassign
verwendet wird . Der Wert der Variablen bleibt gleich, bis die Variable durch eine prozedurale oder prozedurale kontinuierliche Zuweisung einen neuen Wert erhält. Die linke Seite eines assign
Die Anweisung kann kein Bit-Select, Part-Select oder eine Array-Referenz sein, kann aber eine Variable oder eine Verkettung von Variablen sein.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
Freigabe erzwingen
Diese ähneln dem assign - deassign
Anweisungen, sondern können auch auf Netze und Variablen angewendet werden. Die LHS kann eine Bitauswahl eines Netzes, eine Teilauswahl eines Netzes, eine Variable oder ein Netz sein, kann aber nicht die Referenz auf ein Array und eine Bit/Teilauswahl einer Variablen sein. Die force
Anweisung überschreibt alle anderen Zuweisungen an die Variable, bis sie mit release
freigegeben wird Schlüsselwort.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog