我试图在系统verilog中为dct8p_v5模块创建参数approx和approx1的数组。 ' KCN'模块的大小为6参数数组,名为' approx'。我想从' about'传递3变量。来自' approx1'的3变量。我试图连接这两个,但参数值没有传播到kcn模块。 传递参数数组的语法是否正确?请让我知道!
谢谢,
Farhana
module dct_8p_v5 #(parameter nb=18) (input [nb-1:0] xin [0:7] ,
output [nb-1:0] xl2 [0:7]);
localparam integer approx [0:28]={3,1,1,3,0,0,0,0,3,3,1,2,0,7,7,0,7,7,3,
3,3,10,9,9,7,7,10,9,9};
localparam integer approx1 [0:10]={8,8,8,8,8,8,9,8,8,16,16};
wire [nb-1:0] xl1 [0:7];
...
..
kcn #(.n(nb), .approx({approx[12:14],approx1[0:2]})) kcn11(.x0(xl1[4]),.x1(xl1[7]),
.y0(xl2[4]),.y1(xl2[7]));
...
..
module kcn (x0,x1,y0,y1);
parameter n=10 ;
input [n-1:0] x0;
input [n-1:0] x1;
output [n-1:0] y0;
output [n-1:0] y1;
parameter integer approx [0:5]='{0,7,7,8,8,8};
答案 0 :(得分:1)
您的代码应该有效,但是数组连接语法在标准的不同修订版中经历了许多规则更改。您应该与您的工具供应商核实阵列级联的当前支持级别。
答案 1 :(得分:0)
根据第10.9节(IEEE1800-2012 LRM)对指配模式的描述:
在右侧使用赋值模式表达式时 表达式,它将产生数据类型的变量的值 如果使用赋值模式初始化它将保持....
每个表达项都应在a的上下文中进行评估 赋值给数组中相应元素的类型。
因此,对于解包数组,只有当LHS表达式的元素数与其对应的RHS表达式中的元素数匹配时,赋值才是合法的。在您的示例中,LHS是一个期望6个解压缩数组元素的单个变量,而模块参数是两个解压缩数组变量的切片,每个变量包含3个元素。
为了解决这个问题,我建议以下列方式使用比特流投射。 1)将参数声明为打包数组 2)对于模块实例的参数,对每个子表达式应用比特流强制转换,连接结果,并将其括在赋值模式表达式中。如果封闭在APE中不起作用,则比特流会转换concat。
以这种方式进行强制转换需要声明用户定义的类型,这些类型的大小等同于要转换的积分。
答案 2 :(得分:-1)
IEEE Std 1800-2012§7.4.3对数组的操作表明所有打包或解包的数组都可以读取和写入数组的一个片。 LRM§7.4.6索引和数组切片中有一个直接的例子。但是,并非所有模拟器,合成器等都支持对解压缩阵列进行切片。如果.approx({approx[12:14],approx1[0:2]}))
不起作用,请尝试展开的表单:.approx('{approx[12],approx[13],approx[14],approx1[0],approx1[1],approx1[2]})
或.approx({approx[12],approx[13],approx[14],approx1[0],approx1[1],approx1[2]})
{}
vs '{}
对于IEEE Std 1800-2012§10.10解包数组连接中描述的解压缩数组,以及第10.10.1节中的示例
module dct_8p_v5 #(parameter nb=18) (
input [nb-1:0] xin [0:7] ,
output [nb-1:0] xl2 [0:7] );
localparam integer approx [0:28] = '{3,1,1,3,0,0,0,0,3,3,1,2,0,7,7,
0,7,7,3,3,3,10,9,9,7,7,10,9,9};
localparam integer approx1 [0:10] = '{8,8,8,8,8,8,9,8,8,16,16};
...
kcn #(.n(nb),
//.approx({approx[12:14],approx1[0:2]})
.approx('{approx[12],approx[13],approx[14],approx1[0],approx1[1],approx1[2]}) // Alt
) kcn11(
.x0(xl1[4]), .x1(xl1[7]), .y0(xl2[4]), .y1(xl2[7]));
...