Verilog-zaakverklaring
De case
statement controleert of de gegeven expressie overeenkomt met een van de andere expressies in de lijst en vertakt dienovereenkomstig. Het wordt meestal gebruikt om een multiplexer te implementeren. De constructie als-anders is mogelijk niet geschikt als er veel voorwaarden moeten worden gecontroleerd en zou worden gesynthetiseerd in een prioriteits-encoder in plaats van een multiplexer.
Syntaxis
Een Verilog geval statement begint met de case
zoekwoord en eindigt met de endcase
trefwoord. De uitdrukking tussen haakjes wordt exact één keer geëvalueerd en vergeleken met de lijst van alternatieven in de volgorde waarin ze zijn geschreven en de instructies waarvoor het alternatief overeenkomt met de gegeven uitdrukking worden uitgevoerd. Een blok van meerdere instructies moet worden gegroepeerd en binnen begin
. vallen en end
.
// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
case_item1 : <single statement>
case_item2,
case_item3 : <single statement>
case_item4 : begin
<multiple statements>
end
default : <statement>
endcase
Als geen van de hoofdletter-items overeenkomt met de gegeven uitdrukking, instructies binnen de default
item wordt uitgevoerd. De default
statement is optioneel en er kan maar één default
. zijn verklaring in een casus. Case-statements kunnen worden genest.
Uitvoering zal het hoofdletterblok verlaten zonder iets te doen als geen van de items overeenkomt met de uitdrukking en een default
verklaring wordt niet gegeven.
Voorbeeld
De hieronder getoonde ontwerpmodule heeft een 2-bits selectiesignaal om een van de drie andere 3-bits ingangen naar het opgeroepen uitgangssignaal te leiden. Een case
statement wordt gebruikt om de juiste invoer aan uitvoer toe te wijzen op basis van de waarde van sel. Aangezien sel een 2-bits signaal is, kan het 2
2
. hebben combinaties, 0 t/m 3. De standaardopdracht helpt om de uitvoer op 0 in te stellen als sel 3 is.
module my_mux (input [2:0] a, b, c, // Three 3-bit inputs
[1:0] sel, // 2-bit select signal to choose from a, b, c
output reg [2:0] out); // Output 3-bit signal
// This always block is executed whenever a, b, c or sel changes in value
always @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // If sel=0, output is a
2'b01 : out = b; // If sel=1, output is b
2'b10 : out = c; // If sel=2, output is c
default : out = 0; // If sel is anything else, out is always 0
endcase
end
endmodule
Hardwareschema
De rtl-code is uitgewerkt om een hardwareschema te krijgen dat een 4 op 1 multiplexer vertegenwoordigt.
Zie dat de uitgang nul is als sel 3 is en overeenkomt met de toegewezen ingangen voor andere waarden.
Simulatielogboekncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0 [10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5 [20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5 [30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1 [40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
In een case-statement slaagt de vergelijking alleen wanneer elk bit van de expressie overeenkomt met een van de alternatieven, waaronder 0, 1, x en z. Als in het bovenstaande voorbeeld een van de bits in sel x of z is, is de default
statement wordt uitgevoerd omdat geen van de andere alternatieven overeenkwam. In een dergelijk geval zal de output allemaal nullen zijn.
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
Als de casusverklaring in ontwerp x en z heeft in de casusitem-alternatieven, zouden de resultaten heel anders zijn.
module my_mux (input [2:0] a, b, c,
[1:0] sel,
output reg [2:0] out);
// Case items have x and z and sel has to match the exact value for
// output to be assigned with the corresponding input
always @ (a, b, c, sel) begin
case(sel)
2'bxz : out = a;
2'bzx : out = b;
2'bxx : out = c;
default : out = 0;
endcase
end
endmodule
Simulatielogboek ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5 ncsim: *W,RNQUIE: Simulation is complete.
Wat is het verschil tussen een case en if-else?
De case
statement is anders dan if-else-if
op twee manieren:
- Uitdrukkingen gegeven in een
if-else
blok zijn algemener in eencase
blok, wordt een enkele uitdrukking gekoppeld aan meerdere items case
geeft een definitief resultaat als er X- en Z-waarden in een uitdrukking zijn
Verilog