Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 大小可配置的Systemverilog localparam阵列_Arrays_Parameters_System Verilog - Fatal编程技术网

Arrays 大小可配置的Systemverilog 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 }

我想在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
};
但是,第一个“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)有人知道哪些合成工具支持这个吗?因为这更像是一个“生成”构造来初始化数组,我认为参数化函数的这种特殊用法可以用于合成?一般来说,实际逻辑的参数化函数需要在虚拟类中是静态的。有人知道哪些合成工具支持这一点吗?因为这更像是“生成”构造来初始化数组,我认为参数化函数的这种特殊用法可以用于合成?一般来说,实际逻辑的参数化函数需要在虚拟类中是静态的。