Verilog 使用函数的多维压缩参数声明

Verilog 使用函数的多维压缩参数声明,verilog,system-verilog,Verilog,System Verilog,最近,我正在考虑在generate struct中实例化逻辑单元之前,使用简单的数学方程预先计算所有必要的参数。在我需要有一个二维参数的情况下,如果二维数组是一组固定值,比如 参数para_1[1:0][2:0]='{2{3{0}} 但我想要的是一个指定值的函数,这样在将返回值赋给参数之前,可以在函数内部实现复杂的方程 理想情况下,我想要的东西如下: function func01 [1:0][1:0] (input int test); int index; for (index=0;

最近,我正在考虑在generate struct中实例化逻辑单元之前,使用简单的数学方程预先计算所有必要的参数。在我需要有一个二维参数的情况下,如果二维数组是一组固定值,比如

参数para_1[1:0][2:0]='{2{3{0}}

但我想要的是一个指定值的函数,这样在将返回值赋给参数之前,可以在函数内部实现复杂的方程

理想情况下,我想要的东西如下:

function func01 [1:0][1:0] (input int test);
  int index;
  for (index=0; index<=2; index++) begin
    func01[index] = index + $floor(index/2) + $mod(index, 2) + test;
  end
endfunction

parameter test1 = 1;
parameter logic test2 [1:0][1:0] = func01(test1);
函数func01[1:0][1:0](输入int测试);
整数指数;

对于(index=0;index首先,如果您想要压缩数组,那么维度范围将位于数组名称的左侧。我建议使用显式数据类型

parameter bit [1:0][2:0] para_1 = '{2{3{0}}};.
然后,函数声明的返回类型在函数名之前

function bit [1:0][1:0] func01  (input int test);
顺便说一句,如果希望函数的返回类型具有未打包的维度,则必须使用
typedef
,这在任何情况下都是一种良好的做法

typedef bit [1:0] myParam_t [2:0];
parameter myParam_t para_1 = '{default:0};
function myParam_t func01  (input int test);

非常感谢@dave_59。标题和内容是关于未打包的数组的,而不是打包的。对不起,您的解决方案似乎就是我在
typedef
方面想要的。但是,ModelSim不喜欢系统功能(例如$floor)在功能块中,
系统函数不能用于常量函数。
。有什么解决办法吗?您需要使用SystemVerilog等效运算符(
%
表示mod)或编写替换方程(
表示下限(val)=int'(val)>val?int'(val)-1:int'(val);
表示下限)