Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

Verilog-toewijzingen begrijpen: types, syntax en best practices

Het plaatsen van waarden op nets en variabelen heet toewijzing. Er zijn drie basismethoden:

  • Procedurale toewijzing
  • Continue toewijzing
  • Procedurale continue toewijzing

Geldige LHS-waarden

Een toewijzing heeft twee delen: een rechterkant (RHS) en een linkerkant (LHS) met een gelijkheidsteken (=) of een kleiner-of-gelijk-teken (<=) ertussen.

Toewijzingstype Linkerkant (LHS)
Proceduraal
  • Variabelen (vector/scalair)
  • Bit-selectie of deelselectie van een vector reg, integer of time-variabele
  • Geheugenwoord
  • Concatenatie van bovenstaande
Continu
  • Net (vector/scalair)
  • Bit-selectie of deelselectie van een vector net
  • Concatenatie van bit-selecties en deelselecties
Proceduraal continu
  • Net of variabele (vector/scalair)
  • Bit-selectie of deelselectie van een vector net

De RHS kan elke expressie bevatten die resulteert in een eindwaarde, terwijl de LHS aangeeft welk net of variabele de waarde ontvangt.

module tb;
  reg clk;
  wire a, b, c, d, e, f;
  reg z, y;
  // clk staat aan de LHS, de niet-van-clk vormt de RHS
  always #10 clk = ~clk;
  // y is de LHS, de constante 1 is RHS
  assign y = 1;
  // f is de LHS, de expressie van a,b,d,e vormt de RHS
  assign f = (a | b) ^ (d & e);
  always @ (posedge clk) begin
    // z is de LHS, de expressie van a,b,c,d vormt de RHS
    z <= a + b + c + d;
  end
  initial begin
    // Variabelennamen links vormen LHS, 0 is RHS
    a <= 0;
    b <= 0;
    c <= 0;
    d <= 0;
    e <= 0;
    clk <= 0;
  end
endmodule

Procedurale toewijzing

Procedurale toewijzingen treden op binnen procedures zoals always, initial, task en function en worden gebruikt om waarden op variabelen te plaatsen. De variabele houdt de waarde tot de volgende toewijzing aan dezelfde variabele.

De waarde wordt op de variabele gezet wanneer de simulatie deze instructie uitvoert op een bepaald moment tijdens de simulatietijd. Dit kan worden beheerd en aangepast met controle-statements zoals if-else-if, case-statements en lusconstructies.

reg [7:0] data;
integer count;
real period;
initial begin
  data = 8'h3e;
  period = 4.23;
  count = 0;
end
always @ (posedge clk) count++;

Toewijzing bij variabeledeclaratie

Een beginwaarde kan aan een variabele worden toegewezen op het moment van declaratie. De toewijzing heeft geen duur en houdt de waarde tot de volgende toewijzing aan dezelfde variabele plaatsvindt. Let op: toewijzingen bij declaratie aan arrays zijn niet toegestaan.

module my_block;
  reg [31:0] data = 32'hdead_cafe;
  initial begin
    #20 data = 32'h1234_5678;
    // data heeft dead_cafe van tijd 0 tot tijd 20
    // Op tijd 20 krijgt data 12345678
  end
endmodule
reg [3:0] a = 4'b4;
// is equivalent aan
reg [3:0] a;
initial a = 4'b4;

Als de variabele geïnitialiseerd wordt tijdens declaratie én op tijd 0 in een initial-blok, is de evaluatievolgorde niet gegarandeerd en kan het resultaat 8'h05 of 8'hee zijn.

module my_block;
  reg [7:0] addr = 8'h05;
  initial addr = 8'hee;
endmodule
reg [3:0] array [3:0] = 0; // illegaal
integer i = 0, j;           // declareert twee integers i,j en wijst 0 toe aan i
real r2 = 4.5, r3 = 8;      // declareert twee reals r2,r3 met waarden 4.5, 8
time startTime = 40;        // declareert time-variabele met beginwaarde 40

Procedurale blokken en toewijzingen worden in een later hoofdstuk gedetailleerder behandeld.

Continue toewijzing

Klik hier voor een stap-voor-stap simulatievoorbeeld!

Dit wordt gebruikt om waarden toe te wijzen aan scalaire en vector-nets en treedt op telkens wanneer de RHS verandert. Het biedt een manier om combinatorische logica te modelleren zonder een interverbinding van gates op te geven en maakt het eenvoudiger om het net te sturen met logische expressies.

// Voorbeeldmodel van een AND-gate
wire a, b, c;
assign a = b & c;

Telkens wanneer b of c van waarde verandert, wordt de volledige RHS-expressie geëvalueerd en wordt a bijgewerkt met de nieuwe waarde.

Toewijzing bij net-declaratie

Dit stelt ons in staat een continue toewijzing op dezelfde instructie te plaatsen die het net declareert. Omdat een net maar één keer gedeclareerd kan worden, is er maar één declaratietoewijzing mogelijk per net.

wire penable = 1;

Proceduraal continue toewijzing

Dit zijn procedurale statements die toestaan expressies continu toe te wijzen aan nets of variabelen en zijn van twee typen:

  • assign ... deassign
  • force ... release

assign deassign

Dit overschrijft alle procedurale toewijzingen aan een variabele en wordt gedeactiveerd door dezelfde signaal met deassign te gebruiken. De waarde van de variabele blijft hetzelfde totdat de variabele een nieuwe waarde krijgt via een procedurale of proceduraal continue toewijzing. De LHS van een assign-statement mag geen bit-selectie, deelselectie of array-referentie zijn, maar wel een variabele of concatenatie van variabelen.

reg q;
initial begin
  assign q = 0;
  #10 deassign q;
end

force release

Deze zijn vergelijkbaar met assign - deassign maar kunnen ook op nets en variabelen toegepast worden. De LHS kan een bit-selectie van een net, deelselectie van een net, variabele of net zijn, maar geen referentie naar een array en bit/deelselectie van een variabele. De force-instructie overschrijft alle andere toewijzingen aan de variabele totdat deze vrijgegeven wordt met het release-trefwoord.

reg o, a, b;
initial begin
  force o = a & b;
  ...
  release o;
end

Verilog

  1. Verilog beheersen: Complete tutorial voor digitale schakelingontwerp
  2. Verilog concatenatie beheersen: Een praktische gids
  3. Verilog Blocking vs. Non-Blocking: belangrijkste verschillen uitgelegd
  4. Verilog-functies beheersen voor efficiënt RTL-ontwerp
  5. Verilog Tasks begrijpen: Functions vs Tasks, Syntax en Gebruik
  6. Verilog Clock Generator: Ontwerp & Implementatie Gids
  7. Verilog Math Functions beheersen voor efficiënt Hardware-ontwerp
  8. Verilog $timeformat beheersen: Precisie en Weergave-controle
  9. Verilog Timescales begrijpen en printen in elke Scope
  10. Verilog File I/O onder de knie: Openen, Lezen, Schrijven en Sluiten
  11. Beginner's Guide to Verilog: Hello World Voorbeeld