Verilog中`define宏使用$bits时出现编译错误如何解决
问题原因与修复方案
- 宏定义换行符使用错误
Verilog/SystemVerilog的宏定义换行仅需要在行尾加单个反斜杠\,且反斜杠后不能有任何空格、注释等额外字符,你代码中写的\ \、\\都会导致宏展开时代码结构异常,触发语法错误。 - 重复操作符的常量表达式未加括号(直接触发你遇到的
[语法报错)
你代码中{$bits(out){sel[i]}}的写法不符合编译器语法要求,绝大多数SystemVerilog编译器要求重复操作符的重复次数必须用括号包裹为常量表达式,否则会把$bits后的[识别为非法字符,需要改为{($bits(out)){sel[i]}}。 - out初始化逻辑错误
out = $bits(1'b0);的作用是把数值1(因为1'b0的位宽固定为1)赋值给out,并非你想要的全0初始化,改为SystemVerilog通用全0赋值out = '0;即可。 - for循环边界越界
i<=$bits(sel)会导致循环索引i取到$bits(sel),而sel的合法索引范围是0~$bits(sel)-1,会触发数组越界访问,改为i < $bits(sel)即可。
修复后的完整宏代码:
`define TEST1(out, in, sel) \ integer i; \ always_comb begin \ out = '0; \ for(i=0; i < $bits(sel); i=i+1) \ out = out | ({($bits(out)){sel[i]}} & in[i]); \ end
按上述修改后重新编译即可消除该语法错误,同时逻辑也符合预期。
内容的提问来源于stack exchange,提问作者Parshant Rana
相关产品推荐
相关产品推荐

