2016-06-23 7 views
0

Ist es möglich, enum zu verwenden, egal? Ich habe versucht, die folgendenVerilog, mit enum mit egal

typedef enum reg [31:0] { 
    BLTZ = 32'b000001_?????_00000_????????????????, 
    BGEZ = 32'b000001_?????_00001_????????????????, 
    BEQ = 32'b000100_?????_?????_????????????????, 
    BNE = 32'b000101_?????_?????_????????????????, 
    . 
    . 
    . 

dann die Syntax von doulos.com gegeben, habe ich mit der folgenden, um zu sehen, ob ich eine „ADD“ Anweisung bekommen

op_mne_e op_mnemonic; 
    assign op_mnemonic = op_mne_e'(32'b000000_?????_?????_?????_?????_10000); 

auf der Wellenform-Viewer angezeigt werden aber was ich sehe, ist

000000zzzzzzzzzzzzzzzzzzzz10000 

Ist es möglich, etwas ähnliches zu einem casez für enum zu haben?

+1

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. –

Antwort

0

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.

+0

'?' und "z" sind in Verilog gleichwertig. –

+0

Danke @ dave_59. Während ich wusste, dass 'Z' und'? 'Synonyme in einer' casez' Aussage waren, hatte ich nicht bemerkt, dass es allgemeiner war. Der Groschen ist jetzt auf die ursprüngliche Frage gefallen. –

0

Wenn Sie möchten, dass die Bezeichnungen Ihrer enum-Variablen in der Wellenform angezeigt werden, müssen Sie den Radix so einstellen, dass er angezeigt wird. Die meisten Werkzeuge werden standardmäßig in binärer Darstellung angezeigt. SystemVerilog hat eine Reihe von Operatoren, die 'z' als egal behandeln (casez ist einer von ihnen) so '?' ist als Teil eines numerischen Literals anstelle eines 'z' erlaubt. Dieses "?" wird sofort in ein 'z' umgewandelt und du wirst nie ein '?' ausgedruckt.

Wenn Sie versuchen, einer Enumeration einen Wert zuzuweisen und den Befehl decodieren zu lassen und ein passendes Label auszuwählen, funktioniert das nicht. Sie müssten die enum-Werte in einer Schleife verarbeiten und den Gleichheitsoperator ==? verwenden, um eine Übereinstimmung zu finden.

Aber wenn Sie nur dies tun, um eine Bezeichnung in der Wellenform zu bekommen, hat Modelsim/Questa einen radix define Befehl, der die Anweisung für Sie decodiert.