2017-02-01 3 views
0

я следующая функция:SystemVerilog подписан не работает правильно

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 

Где: Поле в in_trx определяется:

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

Для ввода:

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

Выход (дисплей):

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

Где он должен быть:

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

ответ

0

Вы можете объявить свои векторы подписанных и неподписанных (по умолчанию). Например .:

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

Теперь вы не будете нуждаться в $signed systemcalls. Также, если вы используете 16-битные переменные с двумя состояниями, вы должны учитывать встроенный тип shortint, который представляет собой тип данных с двумя состояниями , 16-разрядное целое число со знаком.

+0

, но wht $ (подписанный) работает неправильно? – sara8d

+1

Подписанное десятичное значение 16'h7ffe равно 32677, а не -2. Поэтому он работает правильно. –

Смежные вопросы