2016-09-07 5 views
0

Ich lese ein Registerfeld aus einem UVM-RAL-Modell zurück. Das Feld selbst ist eine 14-Bit-Zahl mit Vorzeichen, aber RAL hat keinen Sinn für Zeichen so dass ich nur die entsprechenden Bits greifen muß und wirft sie dann auf eine signierte ZahlGießen auf eine feste Breite signierte Nummer

uvm_reg_data_t reg_value; 
int destination; 

reg_value = reg_field.get(); 
assign destination = signed'(14'(reg_value)); 

Gibt es eine Möglichkeit, dies zu tun mit einer Besetzung? Ich weiß, ich könnte eine Art definieren und verwenden Sie dann die, aber ich habe mich gefragt, ob es eine Syntax wie das war, die funktionieren würde:

assign destination = (14's)'(reg_value); 

Antwort

1

Es gibt keine solche Syntax diese in einem Guss ohne typedef zu tun. Sie könnten auch

assign destination = signed'(reg_value[13:0]); 

tun, aber ich denke ein typedef für den Feldtyp zu schaffen wäre am besten, Ihre Absicht zu zeigen.

+0

Als ich die Frage tippe ich erkennen, dass diese Register Felder bereits 'typedef's, die von meiner regmap Generation Tool automatisch generiert wurden. Wie auch immer, das war nicht die Antwort, auf die ich gehofft hatte, aber ich bin froh zu wissen, dass die Syntax nicht existiert. – nguthrie

0

können Sie Makro verwenden:

`define conv2signed(ral_reg) \ 
    signed'($size(ral_reg)'(ral_reg)) 

Und dann:

assign destination = `conv2signed(reg_value); 

UPDATE:

oder (seit uvm_reg_data_t ist denke ich, 64b) dann:

`define conv2signed(ral_reg, reg_width) \                                        
    signed'(reg_width'(ral_reg)) 

und:

assign destination = `conv2signed(reg_value, 14); 

oder verwenden Sie die Funktion ...

Verwandte Themen