如何使用系统verilog中的定义形成变量名,实际上我需要配置我的寄存器(大约100)。要做到这一点,我需要硬编码100声明。有没有办法用define(任何其他方式)形成一个变量?
答案 0 :(得分:3)
`define HIER2 testbench_top.hier1.hier2
initial begin
if( `HIER2.sub_component.wire == 1'b1)
SystemVerilog IEEE 1800-2012第22.5.1节`定义,涵盖可以带参数的文本宏。
`define DISPLAY_MACRO1(a=1,b="A",c) $display(a,,b,,c);
`DISPLAY_MACRO1(4,5,6);
// Expands to $display(4,,5,,6)
可以跳过参数以允许默认值:
`DISPLAY_MACRO1( ,5,6);
// Expands to $display(1,,5,,6)
宏也可用于创建方程式
`define TOP(a,b) a + b
a = `TOP(g ,h)
// expanding to
// a = g + h
这对于创建变量名称并不直接有用,因为它需要空格来分隔参数,这就是``
派上用场的地方。它们用于分隔而不使用空格。
`define MAKE_REG( width, name) reg [ width -1:0] name``_register
`MAKE_REG( 4, enable) ;
//should expand to
// reg [ 4 -1:0] enable_register ;
答案 1 :(得分:1)
在`define
中形成标识符的方法是使用``
将令牌连接成一个令牌
`define CONCAT(A, B) A``B
int `COCNCAT(X, Y); // defines an **int** XY
有时你会看到
`define myreg(name) \
int _reg_``name;
所以`myreg(0)
声明_reg_0
SystemVerilog中没有循环宏构造,因此如果您需要_reg_0
,_reg_1
,...最好声明一个数组或使用生成语句。
答案 2 :(得分:0)
define myreg(name) \
int _reg_``name;
所以myreg(0) declares _reg_0
SystemVerilog中没有循环宏构造,因此如果需要_reg_0, _reg_1, ...
,最好声明一个数组或使用生成语句。
在上述声明中,
请澄清如何为req_0,req_1...