Ich habe die Stichworte zu dieser Frage geändert, weil Sie Fragen über System-Verilog, nicht Verilog. Was wir Verilog nennen, ist jetzt eine Teilmenge des System-Verilog-Standards IEEE-1800.
In System-Verilog haben Aufzählungstypen einen zugrunde liegenden Basistyp. Standardmäßig ist dieser Typ int
, ein Typ mit zwei Zuständen (jedes Bit kann nur die Werte 0
oder 1
annehmen). Sie können andere Basistypen angeben, wenn Sie möchten. Jedes Element des Aufzählungstyps wird durch einen anderen Wert des Typs des Basistyps dargestellt.
Sie haben einen 4-stufigen 32-Bit-Basistyp angegeben: reg [31:0]
*. Diese 4 Zustände sind 0
, 1
, Z
(oder ?
) und X
. Jedes Element des Aufzählungstyps wird also durch einen 4-stufigen Wert dargestellt, dh eine Kombination aus 0
, 1
, Z
(oder ?
) und X
. Wenn Sie jedoch den Wert mit einem Formatbezeichner "% b" anzeigen, erhalten Sie Folgendes: Sie erhalten den zugrunde liegenden 4-Status-Wert (unter Verwendung von Z
s, nicht ?
s).
http://www.edaplayground.com/x/3khr
In einer casez
Aussage, ein Z
oder ein ?
stellt eine nicht egal. So können Sie eine eine solche enum
mit einem 4-State-Basistyp in einer casez
Anweisung verwenden, wenn Sie möchten:
casez (op_mnemonic)
BLTZ : $display("BLTZ");
BGEZ : $display("BGEZ");
BEQ : $display("BEQ");
BNE : $display("BNE");
endcase
aber, wie wir hier System Verilog sind zu sprechen, warum nicht case ... inside
stattdessen verwenden?
case (op_mnemonic) inside
BLTZ : $display("BLTZ");
BGEZ : $display("BGEZ");
BEQ : $display("BEQ");
BNE : $display("BNE");
endcase
http://www.edaplayground.com/x/4g3J
case ... inside
ist in der Regel sicherer, als die alte casez
, weil es asymmetrische Wildcard passende aufweist. Mit anderen Worten, im Gegensatz zu einer casez
, einer X
oder Z
(oder ?
) in der Testausdruck (op_mnemonic
in diesem Fall) wirkt nicht wie ein egal (aber natürlich im Zweig Ausdruck) .
* In System-Verilog wäre es üblicher, logic [31:0]
anzugeben, das identisch ist, aber logic
wird normalerweise in System-Verilog anstelle von reg
verwendet.
Ich habe das Tag in System-Verilog geändert, weil es in Verilog keine 'typedef' oder 'enum' gibt. Ich weiß, dass das deine Frage so erscheinen lassen könnte, als wäre sie für dich verschwunden. Daher dieser Kommentar, der in Ihren letzten Posteingangsmeldungen angezeigt wird. –