转换为固定宽度的有符号数
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);
或使用函数...
我正在读回 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);
或使用函数...