SystemVerilog Convert将定义的连接字符串定义为Int定义

时间:2018-06-23 23:32:23

标签: concatenation c-preprocessor system-verilog atoi

我有一长串defines defining with numerous properties for these registers. I'd like to have a function that takes the string of the register name and concatenates the big定义名称,并在处理时评估`define int值。

一个简单的函数喜欢以下内容:

PrintRegInfor(REGA);

这是不起作用的类代码:

`define CHIP_REGA_ADDR   16'h0000
`define CHIP_REGA_RESET_VAL   0
`define CHIP_REGB_ADDR   16'h0100
`define CHIP_REGB_RESET_VAL   1

.
.
`define CHIP_REGZ_ADDR       16'h1000
`define CHIP_REGZ_RESET_VAL  0

clase module;
function PrintRegInfo(string reg_name)
    string reg_reset_string;
    string reg_addr_string;
    int reg_reset_int;
    int reg_addr_int;
    reg_reset_string = {"`CHIP_",reg_name,"_RESET_VAL"};
    reg_addr_string = {"`CHIP_",reg_name,"_ADDR"};
    reg_reset_int = reg_reset_string;
    reg_add_int = reg_add_string;
    $display("Reg %s at address 0x%x has a reset value of 0x%x\n",reg_name, reg_add_int,reg_reset_int);
endfunction
endclass

看起来字符串到int的转换是将实际的字符串从ascii值转换为int。我希望它可以评估所创建字符串的`define。这可能吗?

我想得到:

位于地址0x0000的Reg Rega的重置值为0x0

我得到类似的东西: 地址为0x3478的Reg Rega的重置值为0x8373

谢谢!

1 个答案:

答案 0 :(得分:0)

您不能使用字符串变量在过程代码中形成标识符。您可以创建一个宏来执行此操作

`define PrintRegInfo(reg_name) \
  $display("Reg %s at address 0x%x has a reset value of 0x%x\n", `"reg_name`", \
 `CHIP_``reg_name``_ADDR, \
  `CHIP_``reg_name``RESET_VAL);

但是,您传递给宏的参数不能是字符串变量。 您可能不使用define语句来重新考虑组织数据的方式,而是使用关联数组创建数据库。