Verilog-opdrachten
Het plaatsen van waarden op netten en variabelen worden toewijzingen genoemd. Er zijn drie basisvormen:
- Procedureel
- Continu
- Procedureel doorlopend
Juridische LHS-waarden
Een opdracht bestaat uit twee delen - rechterkant (RHS) en linkerkant (LHS) met een gelijk-symbool (=) of een minder dan-gelijk-symbool (<=) ertussen.
Opdrachttype | Linkerkant |
---|---|
Procedureel |
|
Continu |
|
Procedureel doorlopend |
|
De RHS kan elke uitdrukking bevatten die resulteert in een uiteindelijke waarde, terwijl de LHS een net of een variabele aangeeft waaraan de waarde in RHS wordt toegewezen.
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
Procedure Opdracht
Procedurele toewijzingen vinden plaats binnen procedures zoals altijd, initiaal, taak en functies en worden gebruikt om waarden op variabelen te plaatsen. De variabele behoudt de waarde tot de volgende toewijzing aan dezelfde variabele.
De waarde wordt op de variabele geplaatst wanneer de simulatie deze instructie op een bepaald moment tijdens de simulatietijd uitvoert. Dit kan worden gecontroleerd en aangepast zoals we willen door het gebruik van controlestroominstructies zoals if-else-if, case-statement en looping-mechanismen.
reg [7:0] data;
integer count;
real period;
initial begin
data = 8'h3e;
period = 4.23;
count = 0;
end
always @ (posedge clk)
count++;
Toewijzing variabele declaratie
Een initiële waarde kan op een variabele worden geplaatst op het moment van zijn declaratie, zoals hierna wordt getoond. De toewijzing heeft geen duur en houdt de waarde vast totdat de volgende toewijzing aan dezelfde variabele plaatsvindt. Merk op dat variabele declaratietoewijzingen aan een array niet zijn toegestaan.
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;
Als de variabele wordt geïnitialiseerd tijdens de declaratie en op tijdstip 0 in een eerste blok zoals hieronder weergegeven, is de volgorde van evaluatie niet gegarandeerd en kan deze dus ofwel 8'h05 of 8'hee hebben.
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
Procedurele blokken en opdrachten zullen in een later gedeelte in meer detail worden behandeld.
Doorlopende opdracht
Klik hier voor een stap-voor-stap simulatie voorbeeld!
Dit wordt gebruikt om waarden toe te kennen aan scalaire en vectornetten en gebeurt wanneer er een verandering in de RHS is. Het biedt een manier om combinatorische logica te modelleren zonder een onderlinge verbinding van poorten te specificeren en maakt het gemakkelijker om het net te besturen met logische uitdrukkingen.
// Example model of an AND gate
wire a, b, c;
assign a = b & c;
Telkens wanneer b of c zijn waarde verandert, wordt de hele uitdrukking in RHS geëvalueerd en a wordt bijgewerkt met de nieuwe waarde.
Toewijzing nettoaangifte
Hierdoor kunnen we een continue toewijzing plaatsen op hetzelfde statement dat het net declareert. Merk op dat omdat een net maar één keer kan worden gedeclareerd, er slechts één declaratietoewijzing mogelijk is voor een net.
wire penable = 1;
Procedurele doorlopende opdracht
Dit zijn procedurele instructies waarmee expressies continu kunnen worden toegewezen aan netten of variabelen en zijn van twee typen.
assign
...deassign
force
...release
toewijzen ongedaan maken
Dit zal alle procedurele toewijzingen aan een variabele overschrijven en wordt gedeactiveerd door hetzelfde signaal te gebruiken met deassign
. De waarde van de variabele blijft hetzelfde totdat de variabele een nieuwe waarde krijgt via een procedurele of procedurele continue toewijzing. De LHS van een assign
statement kan geen bit-select, part-select of array-verwijzing zijn, maar kan een variabele of een aaneenschakeling van variabelen zijn.
reg q;
initial begin
assign q = 0;
#10 deassign q;
end
gedwongen loslaten
Deze zijn vergelijkbaar met de assign - deassign
statements, maar kunnen ook worden toegepast op netten en variabelen. De LHS kan een bitselectie van een net, een gedeeltelijke selectie van een net, een variabele of een net zijn, maar kan niet de verwijzing zijn naar een array en een bit/deelselectie van een variabele. De force
verklaring zal alle andere toewijzingen aan de variabele overschrijven totdat deze wordt vrijgegeven met behulp van de release
zoekwoord.
reg o, a, b;
initial begin
force o = a & b;
...
release o;
end
Verilog