Arrays 大小可配置的Systemverilog localparam阵列
我想在SystemVerilog中创建和定义localparam数组。数组的大小应该是可配置的,并且每个localparam数组单元格的值应该根据其位置进行计算。基本上,该代码:Arrays 大小可配置的Systemverilog localparam阵列,arrays,parameters,system-verilog,Arrays,Parameters,System Verilog,我想在SystemVerilog中创建和定义localparam数组。数组的大小应该是可配置的,并且每个localparam数组单元格的值应该根据其位置进行计算。基本上,该代码: localparam [7:0] [ADDR_BITS-1:0] ADDR_OFFSET = '{ 7*PAGE_SIZE, 6*PAGE_SIZE, 5*PAGE_SIZE, 4*PAGE_SIZE, 3*PAGE_SIZE, 2*PAGE_SIZE, 1*PAGE_SIZE, 0 }
localparam [7:0] [ADDR_BITS-1:0] ADDR_OFFSET = '{
7*PAGE_SIZE,
6*PAGE_SIZE,
5*PAGE_SIZE,
4*PAGE_SIZE,
3*PAGE_SIZE,
2*PAGE_SIZE,
1*PAGE_SIZE,
0
};
但是,第一个“7”被替换为参数,并且参数初始化扩展到通用情况。所以我需要一种从0循环到(N-1)并设置ADDR_OFFSET(loop)=循环*页面大小的方法
SystemVerilog中的“显而易见”选项是generate,但我了解到,在generate块中放置一个参数定义会生成一个相对于generate块()中层次结构范围的新局部参数
有什么建议吗
作为背景参考:我需要根据基址和数字计算实际地址。计算很简单:
实际地址=基本地址+数字*页面大小
但是,我不想在代码中使用“*”,因为我担心synt工具会生成一个乘数,然后它会尝试简化,因为PAGE_SIZE是一个常量值。我猜这会比我在生成localparam数组时尝试进行所有计算时产生更多的逻辑,因为这肯定不会在逻辑中产生任何乘数
因此,使用上面的localparam定义,我执行所需的地址计算,如下所示:
function [ADDR_BITS-1:0] addr_calc;
input [ADDR_BITS-1:0] base_addr;
input [NBITS-1:0] num;
addr_calc = base_addr + ADDR_OFFSET[num];
endfunction
我想也许我找到了解决办法。我不是通过不定义localparam数组,而是在循环中执行地址计算来实现同样的功能吗?因为systemverilog将循环变量视为“常量”(当涉及到生成逻辑时),这似乎实现了相同的功能?就像这样(在我上面写的函数中):
for(int-loop1=0;loop1
您可以使用函数的返回值设置localparam
localparam bit [7:0] [ADDR_BITS-1:0] ADDR_OFFSET = ADDR_CALC();
function bit [7:0] [ADDR_BITS-1:0] ADDR_CALC();
for(int ii=0;ii<$size(ADDR_CALC,1); ii++)
ADDR_CALC[ii] = ii * PAGE_SIZE;
endfunction
localparam位[7:0][ADDR_位-1:0]ADDR_偏移量=ADDR_计算();
函数位[7:0][ADDR_BITS-1:0]ADDR_CALC();
对于(int ii=0;ii,可以使用函数的返回值设置localparam
localparam bit [7:0] [ADDR_BITS-1:0] ADDR_OFFSET = ADDR_CALC();
function bit [7:0] [ADDR_BITS-1:0] ADDR_CALC();
for(int ii=0;ii<$size(ADDR_CALC,1); ii++)
ADDR_CALC[ii] = ii * PAGE_SIZE;
endfunction
localparam位[7:0][ADDR_位-1:0]ADDR_偏移量=ADDR_计算();
函数位[7:0][ADDR_BITS-1:0]ADDR_CALC();
对于(int ii=0;ii)有人知道哪些合成工具支持这个吗?因为这更像是一个“生成”构造来初始化数组,我认为参数化函数的这种特殊用法可以用于合成?一般来说,实际逻辑的参数化函数需要在虚拟类中是静态的。有人知道哪些合成工具支持这一点吗?因为这更像是“生成”构造来初始化数组,我认为参数化函数的这种特殊用法可以用于合成?一般来说,实际逻辑的参数化函数需要在虚拟类中是静态的。