使用函数的多维打包参数声明

时间:2017-03-24 19:05:38

标签: verilog system-verilog

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

parameter 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);

但是ModelSim直接抱怨第一行代码 - ** Error: (vlog-13069) near "[": syntax error, unexpected '[', expecting ';' or '('.

最终的想法是在一个精加工时有一个计算所有参数/常数的块,这样它们就可以在生成块中用于实例化,也可以在精化时使用。

希望它有意义,并且提前多多感谢。

最佳, 泰海

1 个答案:

答案 0 :(得分:0)

首先,如果您想要打包数组,则维度范围将位于数组名称的左侧。我建议使用显式数据类型。

parameter bit [1:0][2:0] para_1 = '{2{3{0}}};.

然后,函数声明的返回类型出现在函数名之前。

function bit [1:0][1:0] func01  (input int test);

BTW如果你希望函数的返回类型具有解压缩的维度,你必须使用typedef,这在任何情况下都是一个好习惯。

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