在System Verilog中通过模块传递参数数组

问题描述 投票:3回答:3

我试图在系统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};
concatenation parameter-passing system-verilog
3个回答
1
投票

您的代码应该有效,但是数组连接语法在标准的不同修订版中经历了许多规则更改。您应该与您的工具供应商核实阵列级联的当前支持级别。


0
投票

根据第10.9节(IEEE1800-2012 LRM)对分配模式的描述:

当在右侧表达式中使用赋值模式表达式时,如果使用赋值模式初始化,则它将产生数据类型的变量将保持的值....

每个表达式项应在对数组中相应元素类型的赋值的上下文中进行计算。

因此,对于解包数组,只有当LHS表达式的元素数与其对应的RHS表达式中的元素数匹配时,赋值才是合法的。在您的示例中,LHS是期望6个解压缩数组元素的单个变量,而模块参数是两个解压缩数组变量的切片,每个变量包含3个元素。

为了解决这个问题,我建议以下列方式使用比特流投射。 1)将参数声明为打包数组。 2)对于模块实例的参数,对每个子表达式应用比特流强制转换,连接结果,并将其括在赋值模式表达式中。如果封闭在APE中不起作用,则比特流转换为concat。

以这种方式进行转换需要声明用户定义的类型,这些类型的大小等于要转换的积分。


-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]})

{}'{}对于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]));
...
© www.soinside.com 2019 - 2024. All rights reserved.