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
1 ответ
Вы можете объявить ваши векторы как подписанные и неподписанные (по умолчанию). Например.:
logic signed [3:0] signed_reg; // a 4-bit vector in range -8 to 7
Отныне тебе не понадобится $signed
systemcalls. Также, если вы используете 16-битные переменные с двумя состояниями, вы должны рассмотреть встроенные shortint
тип, представляющий собой тип данных с 2 состояниями, 16-разрядное целое число со знаком.