2017-03-17 5 views
0

Wenn ich eine Case-Anweisung schreibe, die Platzhalter für die Fälle enthält, wie werden mehr oder weniger spezifische Fälle behandelt?Wie behandelt SystemVerilog mögliche Platzhalterkonflikte in Fallanweisungen?

always_comb case(selector) 
    4'b0???: begin // Pick me if the msb is 0, unless the two lsb's are 01. 
    end 
    4'b0?01: begin // Pick me if the msb is 0 and the two lsb's are 01. 
    end 
    default: begin // Pick me if the msb is X or 1. 
    end 
endcase 

In dem vereinfachten Beispiel oben, der erste Fall (alle Platzhalter) können für einen beliebigen Wert von Selektor ausgewählt werden, aber ich will es die spezifischste Fall nicht wählen. Werden Fälle behandelt?

+0

Fälle sind immer prioritätsbasiert und sobald eine case-Anweisung übereinstimmt, wird die gesamte nachfolgende Anweisung nicht ausgeführt. –

Antwort

2

SystemVerilog geht davon aus, dass die case-Anweisung in der Reihenfolge der Priorität ist - das zweite Element wird nie abgeglichen. Sie müssen also zuerst die spezifischsten Fälle verschieben. SystemVerilog verfügt über unique case und priority case Konstrukte, um Ihre Absicht besser anzugeben.

+0

Kann ich den eindeutigen Modifikator für mein Beispiel verwenden? Würde es die Konstruktionsabsicht vermitteln, dass sich der spezifischere Fall und der weniger spezifische Fall gegenseitig ausschließen (nehmen Sie immer den spezifischeren Fall, wenn möglich)? Wenn Sie den spezielleren Fall zuerst platzieren und ihn als Priorität markieren, wäre er für meine Verwendung weniger lesbar. – Vreenak

+0

Nein, "eindeutiger Fall" bedeutet, dass Sie garantieren, dass nur ein Fallwert für einen beliebigen Wert von "Selektor" übereinstimmt. Und ein _don't care_ bedeutet, dass Sie sich nicht um den Wert dieser Bitposition kümmern, so dass Sie mehrere übereinstimmende Elemente erhalten. Wenn Ihre spezifischen Fallelemente eine höhere Priorität als andere übereinstimmende Elemente haben, müssen sie zuerst angegeben werden. –