使用函数的多维压缩参数声明
Multi-dimentional packed parameter declaration using function
最近我正在考虑在生成结构中实例化逻辑单元之前使用简单的数学方程式预先计算所有必要的参数。在我需要有一个二维参数的情况下,如果二维数组是一组固定值就很容易了,比如
parameter para_1[1:0][2:0] = '{2{3{0}}};
。
但我想要的是一个指定值的函数,这样可以在将 return 值分配给参数之前在函数内部实现复杂的方程式。
理想情况下我想要如下内容:
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 '('.
最终的想法是在精化时有一个计算所有 parameters/constants 的块,以便这些可以在生成块中用于实例化,也在精化时。
希望它有意义,并提前致谢。
最好的,
太海
首先,如果您需要压缩数组,则维度范围位于数组名称的左侧。我建议使用显式数据类型。
parameter bit [1:0][2:0] para_1 = '{2{3{0}}};.
然后,return类型的函数声明出现在函数名之前。
function bit [1:0][1:0] func01 (input int test);
顺便说一句,如果您希望 return 类型的函数具有未压缩的维度,则必须使用 typedef
,这在任何情况下都是一个很好的做法。
typedef bit [1:0] myParam_t [2:0];
parameter myParam_t para_1 = '{default:0};
function myParam_t func01 (input int test);
最近我正在考虑在生成结构中实例化逻辑单元之前使用简单的数学方程式预先计算所有必要的参数。在我需要有一个二维参数的情况下,如果二维数组是一组固定值就很容易了,比如
parameter para_1[1:0][2:0] = '{2{3{0}}};
。
但我想要的是一个指定值的函数,这样可以在将 return 值分配给参数之前在函数内部实现复杂的方程式。
理想情况下我想要如下内容:
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 '('.
最终的想法是在精化时有一个计算所有 parameters/constants 的块,以便这些可以在生成块中用于实例化,也在精化时。
希望它有意义,并提前致谢。
最好的, 太海
首先,如果您需要压缩数组,则维度范围位于数组名称的左侧。我建议使用显式数据类型。
parameter bit [1:0][2:0] para_1 = '{2{3{0}}};.
然后,return类型的函数声明出现在函数名之前。
function bit [1:0][1:0] func01 (input int test);
顺便说一句,如果您希望 return 类型的函数具有未压缩的维度,则必须使用 typedef
,这在任何情况下都是一个很好的做法。
typedef bit [1:0] myParam_t [2:0];
parameter myParam_t para_1 = '{default:0};
function myParam_t func01 (input int test);