如何使用系统verilog中的定义来表示变量名称

时间:2013-12-24 10:58:33

标签: system-verilog

如何使用系统verilog中的定义形成变量名,实际上我需要配置我的寄存器(大约100)。要做到这一点,我需要硬编码100声明。有没有办法用define(任何其他方式)形成一个变量?

3 个答案:

答案 0 :(得分:3)

Defines(或tick定义)的典型用法。

定义

`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...

使用生成语句/数组