如何用SystemVerilog的`define定义mem0、mem1这类结构?
SystemVerilog宏实现标识符拼接方案
要实现你想要的宏效果,核心是用SystemVerilog预处理器的**令牌拼接(token concatenation)**功能,也就是用 (两个连续的反引号)来把mem和参数num合并成一个完整的标识符。
正确的宏定义写法如下:
`define a(num) tb.a.b.c.d.mem``num;
原理说明
你之前的写法memnum只是把参数num当成了字符串的一部分,预处理器会直接替换成memnum这个固定标识符,而不是把num的值和mem拼接。用 连接后,预处理器会先解析num的实际值,再和前面的mem合并成一个新的标识符,比如:
a(0)会被展开为tb.a.b.c.d.mem0;a(1)会被展开为tb.a.b.c.d.mem1;a(2)会被展开为tb.a.b.c.d.mem2;
注意事项
- 令牌拼接的
必须紧挨着要合并的两个部分,中间不能有空格; - 这个特性是SystemVerilog预处理器的标准功能,主流仿真器(比如VCS、QuestaSim)都支持。
内容的提问来源于stack exchange,提问作者Trong Tran
相关产品推荐
相关产品推荐

