转换为固定宽度的有符号数

Casting to a fixed width signed number

我正在读回 UVM RAL 模型的寄存器字段。该字段本身是一个 14 位有符号数,但 RAL 没有符号感,所以我需要只获取相关位,然后将它们转换为有符号数

uvm_reg_data_t reg_value;
int destination;

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

有没有办法用一个演员表做到这一点?我知道我可以定义一个类型然后使用它,但我想知道是否有像这样的语法可以工作:

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

在没有 typedef 的情况下,没有这样的语法可以在单个转换中执行此操作。你也可以做

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

但我认为为字段类型创建一个 typedef 最能表明您的意图。

您可以使用宏:

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

然后:

assign destination = `conv2signed(reg_value);

更新:

或(因为 uvm_reg_data_t 我认为是 64b)然后:

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

和:

assign destination = `conv2signed(reg_value, 14);

或使用函数...