2

我有一个模块参数,它是一个预定义结构的数组。我将此数组的默认大小设置为 1 个元素。这个想法是在实例化时用适当的大小覆盖它。

我在下面显示的方式不会覆盖大小。它只覆盖第一个值。我可以看到为什么它会这样做,因为 size 字段没有参数化。有没有比传递大小参数更好的方法?

感谢您的帮助。

    module reg_slave
      #(parameter
         reg_pkg::defval_pair [0:0] REG_DEFVAL  = '0 //param decl with size=1
       )();
     endmodule : reg_slave

    module top();
      localparam reg_pkg::defval_pair [1:0] REG_DEFVAL = '{ 
         {3,'h32},
         {0,'h1}
         };  //param of same type and size = 2

      reg_slave #(
                   .REG_DEFVAL(REG_DEFVAL) //trying to override the size.
                 )  
      reg_slave_inst ();

    endmodule : top

    package reg_pkg;
      typedef struct packed { int ADDR; bit [31:0] VAL;} defval_pair;
    endpackage : reg_pkg
4

2 回答 2

2

您需要一个额外的大小参数:

module reg_slave
      #(parameter
      int SIZE=1,
     reg_pkg::defval_pair [SIZE-1:0] REG_DEFVAL  = '0 //param decl with size=1
   )();
endmodule : reg_slave

REG_DEFVAL您在分配in 时有一些错误topREG_DEFVAL是一个压缩数组,因此删除单个相当。defval_pair是 a packed struct,因此条目需要强制转换:

module top();
  localparam int SIZE=2;
  localparam reg_pkg::defval_pair [SIZE-1:0] REG_DEFVAL = { // no single quite
     reg_pkg::defval_pair'{3,'h32}, // cast as defval_pair
     reg_pkg::defval_pair'{0,'h1} // cast as defval_pair
     };  //param of same type and size = 2

  reg_slave #( .SIZE(SIZE), // override size
               .REG_DEFVAL(REG_DEFVAL)
             )  
  reg_slave_inst ();

endmodule : top

更新:传递 N 大小的数组参数而不传递 SIZE 参数。

注意:这很可能是不可合成的。SystemVeilog 对此功能的支持可能因模拟器而异。

module reg_slave
      #(parameter
     reg_pkg::defval_pair REG_DEFVAL [] = '{ reg_pkg::defval_pair'{0,'h0} } //param decl with size=1
   )();
endmodule : reg_slave

module top();
  localparam reg_pkg::defval_pair REG_DEFVAL [] = '{ // with single quite
     reg_pkg::defval_pair'{3,'h32}, // cast as defval_pair
     reg_pkg::defval_pair'{0,'h1} // cast as defval_pair
     };  //param of same type and size = 2

  reg_slave #(
               .REG_DEFVAL(REG_DEFVAL)
             )  
  reg_slave_inst ();

endmodule : top
于 2013-09-05T19:48:57.257 回答
2

使用类型参数。但是,您仍然需要一个额外的参数来传递给实例。优点是您可以更改参数的类型。

module reg_slave
  #(parameter
     type T = int,
     T REG_DEFVAL  = '0 //param decl with size=1
   )();
 endmodule : reg_slave

module top();
  localparam reg_pkg::defval_pair [1:0] REG_DEFVAL = '{ 
     {3,'h32},
     {0,'h1}
     };  //param of same type and size = 2

  reg_slave #(
               .T(reg_pkg::defval_pair[1:0]),
               .REG_DEFVAL(REG_DEFVAL) //trying to override the size.
             )  
  reg_slave_inst ();

endmodule : top
于 2013-09-06T03:34:23.900 回答