获取 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
。
我有一个包含许多不同信号的代码,其宽度由这样的宏范围定义:
`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
。