添加参数重写行后Verilog宏调用报右括号缺失编译错误
Verilog宏实例化报错:缺失右括号问题排查
编译错误信息
file: ../../chip1dsn/chip1x_abxclst/ababx_cluster/chip1x_aabx_cluster.sv `AABX_PG_TEMPLATE_CHIP1M(0); .................................................................| xmvlog: *E,EXPRPA (../../chip1dsn/chip1x_abxclst/ababx_cluster/chip1x_aabx_cluster.sv,802|27): expecting a right parenthesis
问题场景
报错触发于宏调用行AABX_PG_TEMPLATE_CHIP1M(0);,仅在宏定义中模块名与实例名之间新增参数重写行#( USE_XEC_CHIP1 = 0 )后出现该错误。宏定义代码如下:
`define AABX_PG_TEMPLATE_CHIP1M(num) \ CHIP1X_AXEMIS_PG \ #( USE_XEC_CHIP1 = 0 ) \ u20_aabx_pg``num ( .AABX_ID (16'h``num ), \ ... (continued) ...
问题根源
核心问题是宏展开时的语法单元粘连:
- 参数重写行
#( USE_XEC_CHIP1 = 0 )与实例名u20_aabx_pg``num之间没有足够的分隔,预处理器展开后会将两者解析为一个连续的非法token,破坏了实例化的语法结构。 - 宏拼接操作符
后的左括号(没有明确的空格分隔,进一步导致编译器无法正确识别实例名与端口列表的边界,最终误报缺失右括号。
解决方案
修改宏定义,确保语法单元之间有明确的分隔:
- 在参数重写行与实例名之间添加空格或换行,保证两者是独立的语法单元。
- 在宏拼接后的实例名与左括号
(之间显式添加空格,避免粘连。
修改后的宏定义示例:
`define AABX_PG_TEMPLATE_CHIP1M(num) \ CHIP1X_AXEMIS_PG \ #( USE_XEC_CHIP1 = 0 ) \ u20_aabx_pg``num ( \ .AABX_ID (16'h``num ), \ ... (continued) ...
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

