如何修复Verilog编译出现的Illegal range in part select相关报错问题
问题原因
Error-[IRIPS] Illegal range in part select错误:Verilog语法要求[a:b]形式的固定范围位选择的上下边界必须是编译期可确定的常量,你代码中使用变量size计算位选边界,不符合语法规则。Warning-[WUIMCM] Unknown in multiconcat multiplier警告:多重拼接语法{N{dataseg}}中的重复次数N同样要求是编译期常量,使用变量num计算重复次数时编译器无法在编译阶段确定数值,因此抛出警告。
修复方案
方案1:参数化定义(适用于size、num值固定的场景)
如果size和num的数值不需要在运行时修改,直接将其定义为parameter常量即可同时解决两个问题,修改后代码如下:
parameter bit[2:0] size = 3'h1; parameter bit[2:0] num = 3'h1; bit[59:0] data; data = 60'h12345; data = {(num+1){data[(size+1)*10-1:0]}};
方案2:动态位选+循环实现(适用于size、num为运行时变量的场景)
如果size和num需要在运行时动态修改,需要使用SystemVerilog支持的+:动态位选语法,配合循环实现动态拼接:
bit[2:0] size; bit[2:0] num; bit[59:0] data; bit[59:0] temp; int i; data = 60'h12345; num = 3'h1; size = 3'h1; temp = '0; // 动态位选语法 [起始位 +: 位宽],支持位宽为变量,等价于 [起始位+位宽-1:起始位] for(i = 0; i <= num; i++) begin temp = (temp << ((size + 1)*10)) | data[0 +: (size + 1)*10]; end data = temp;
内容的提问来源于stack exchange,提问作者Yike Wang
相关产品推荐
相关产品推荐

