如何生成依赖于 systemverilog 中先前参数的参数

Posted

技术标签:

【中文标题】如何生成依赖于 systemverilog 中先前参数的参数【英文标题】:How do I generate parameters dependent onf previous parameters in systemverilog 【发布时间】:2020-01-21 23:47:20 【问题描述】:

我最近从 VHDL 切换到 SystemVerilog,并且正在转换我的一些代码。我想根据 3 个参数 SZ,L,max 生成一个局部参数数组。

module test #(
    parameter int SZ = 1024,
    parameter int L = 35,
    parameter int MAX = 4
)()
//...
localparam int n[MAX:0] = ;//...

for(genvar i = 0; i < max; i++) begin: gg
//n[i] and n[i+1] will be used here
//There is a second generate loop here that uses n[i+1] and therefore n[i+1] has to be parameter.

end

我尝试使用函数来生成 localparams,但我得到一个错误,即函数中的元素分配不是恒定的。我在 VHDL 中从来没有遇到过这个问题。

我能想到的唯一其他选择是在 for generate 中创建参数,但我将如何引用初始值?有没有其他解决办法?

我使用的模拟器是 Verilator,但我也希望该设计在 Xilinx Vivado 中工作。

编辑:我不想从外部脚本生成参数,因为我无法使用 Vivado 在同一项目中使用不同参数运行多个综合/实现的能力。这就是我以前在 VHDL 中所做的。

【问题讨论】:

【参考方案1】:

您可以使用函数来初始化参数,您只需要将整个数组的输出作为函数的结果。为此,您需要一个 typedef

typedef int array_type[MAX:0];

function array_type f();
  f[0]=SZ;
  for(int i=0;i<MAX;i++)
      f[i+1]=f[i]-((2*i)+1)*L)/2;
endfunction
localparam array_type n = f();

【讨论】:

这在 Verilator 中不起作用。它给出了不允许解压的数组。 太糟糕了 Verillar 不支持 SystemVerilog 的这种可综合特性。您应该能够修改函数以采用一个返回您需要的值的索引参数并使用该函数而不是localparam n 你可以尝试使用打包数组吗? @EnzeChi 我搞定了。打包的 int 不起作用。我必须使用打包的 32 位,它可以毫无问题地转换为 int。【参考方案2】:

我通过使用 32 位压缩数组让它工作。 Verilator 不支持带常量的 unpacked int。 Packed int 也不支持,所以我不得不将类型更改为 32 位打包。

typedef [MAX:0][31:0] array_type;

function array_type f();
  f[0]=SZ;
  for(int i=0;i<MAX;i++)
      f[i+1]=f[i]-((2*i)+1)*L)/2;
endfunction
localparam array_type n = f();

【讨论】:

以上是关于如何生成依赖于 systemverilog 中先前参数的参数的主要内容,如果未能解决你的问题,请参考以下文章

对于更新不依赖于先前值的不可变集合,是不是有任何理由更喜欢 Interlocked 而不是 volatile?

SystemVerilog 随机数据仅针对有效信号生成

vcs怎么编译产生随机激励的systemverilog语句

systemverilog 为啥要用$cast类型转换函数

SystemVerilog 采样和数据驱动

如何创建一个对 Javascript 中先前函数生成的内容作出反应的函数