获取 SystemVerilog 宏范围的大小

Getting the size of a SystemVerilog macro range

我有一个包含许多不同信号的代码,其宽度由这样的宏范围定义:

`define MY_RANGE_1 8:2
`define MY_RANGE_2 12:0
`define MY_RANGE_3 5:0

我想获得这些信号的宽度,以便以后在新的信号定义中使用它们。这样的特征对于MY_RANGE_1应该return7,然后对于MY_RANGE_2应该return13,对于MY_RANGE_3应该return6。当然,有像 $size(MY_FEATURE_1) 这样的数组大小方法,但它们不适合我的目的,因为它们 return 不是一个常数值(所以你不能通过它们定义新的信号范围) .有办法实现吗?

verilog中的文本宏只是文本片段,没有句法意义。因此,无法从宏本身提取范围信息。但是,在 System verilog 中有一个预定义函数 *$bits" ,其中 returns 声明变量或类型的位宽。它也可以用于后续的变量声明. 例如,

`define MY_RANGE_1 8:2
module top;
 reg[`MY_RANGE_1] myvar;
 reg [$bits(myvar) - 1: 0] myvar1;
  
 initial begin
    $display("type: %0d", $bits(reg[`MY_RANGE_1]));
    $display("var:  %0d", $bits(myvar));
    $display("var1: %0d", $bits(myvar1));
 end
endmodule // top

$bits的结果在所有情况下都是7