2017-02-01 4 views
0

Ich habe die folgende Funktion:SystemVerilog unterzeichnet funktioniert nicht richtig

function tx_upconv_out_transaction predict(tx_upconv_in_transaction in_trx); 
     tx_upconv_out_transaction predicted = tx_upconv_out_transaction::type_id::create("predicted"); 
     //-------golden model----- 
//  predicted.y = (in_trx.xi * in_trx.cos - in_trx.xq * in_trx.sin)/ (2 ** 17); 
     $display(" xi = %d, cos = %d xq = %d sin = %d", $signed(in_trx.xi),$signed(in_trx.cos),$signed(in_trx.xq),$signed(in_trx.sin)); 
     predicted.y = ($signed(in_trx.xi) * $signed(in_trx.cos) - $signed(in_trx.xq) * $signed(in_trx.sin))/ (131072);  
     return predicted; 
    endfunction: predict 

Wo: Das Feld in in_trx sind definiert durch:

bit [15:0] xi; 
    bit [15:0] xq; 
    bit [15:0] sin; 
    bit [15:0] cos; 

Für die Eingabe:

xi, qq = fffa (hex) 
sin = 0 
cos = 7ffe (hex) 

Der Ausgang (Anzeige) ist:

xi =  -6, cos = 32766 xq =  -6 sin =  0 

wo es sein sollte:

xi =  -6, cos = -2 xq =  -6 sin =  0 

Antwort

0

Sie können Ihre Vektoren mit und ohne Vorzeichen (default) deklarieren. ZB .:

logic signed [3:0] signed_reg; // a 4-bit vector in range -8 to 7 

Von jetzt Sie werden Sie nicht $signed systemcalls benötigen. Auch wenn Sie 16-Bit-2-State-Variablen verwenden, sollten Sie den eingebauten shortint-Typ betrachten, der ein 2-State-Datentyp ist, 16-Bit-Ganzzahl mit Vorzeichen.

+0

aber was das $ (signiert) nicht richtig funktioniert? – sara8d

+1

Der vorzeichenbehaftete Dezimalwert von 16'h7ffe ist 32677, nicht -2. So funktioniert es richtig. –