SystemVerilog中如何无显式指定宽度实现窄位向量全1扩展?
SystemVerilog窄位向量全1扩展至宽位向量的无硬编码方案
当把窄位向量赋值给宽位向量时,SystemVerilog默认会执行零扩展。如果需要实现全1扩展(高位填充1,低位保留原窄向量值)且不想显式指定扩展宽度,以下是可行方案:
推荐方案:利用$bits()动态计算扩展位宽
通过SystemVerilog内置的$bits()函数获取变量的总位数,动态计算需要填充全1的高位长度,再与原窄向量拼接:
logic [3:0] narrow; logic [7:0] wide; assign wide = {{$bits(wide)-$bits(narrow){1'b1}}, narrow};
$bits(wide)返回宽向量的总位数,$bits(narrow)返回窄向量的总位数,两者的差值就是需要填充全1的高位长度- 这种方式完全依赖变量的位宽定义,后续修改
wide或narrow的位宽时,无需调整赋值语句,适配性更强
为什么{ '1, narrow }不可行?
SystemVerilog的拼接操作要求每个操作数必须有明确的位宽,'1是无尺寸的常量,无法直接用于拼接,因此会触发语法错误。而通过$bits()计算出具体位数后生成的全1向量,具备明确的位宽,符合拼接语法要求。
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

