将单个信号打包成阵列

时间:2015-12-15 16:26:02

标签: system-verilog

我有一堆像这样的信号:

logic [7:0] in0;
logic [7:0] in1;
logic [7:0] in2;
logic [7:0] in3;

我想分配给一个数组:

logic [7:0] in_array [4];
assign in_array[0] = in0;
assign in_array[1] = in1;
assign in_array[2] = in2;
assign in_array[3] = in3;

很简单,但是如果不是4件我有128件,那就太烦人了。我确信定义和生成的组合可以在循环中执行此操作。类似的东西:

`define IN(x) inx
genvar i;
generate
   for(i = 0; i<4; i++) begin
      assign in_array[i] = `IN(i);
   end 
endgenerate 

上面的代码不起作用,但我认为我之前做过类似的事情。

2 个答案:

答案 0 :(得分:1)

简化代码是SystemVerilog无法完成的。您可以通过创建如下所示的宏来减少键入(请注意双反引号``),但您仍需要手动编写每个索引。在生成循环之前解析宏,并将宏的输入变量视为文字。

// short named macro for reduced typing
//   Note: using short named macro is typically a bad practice,
//         but will be removed latter with an undef
`define A(idx) assign array_in[idx] = out``idx
//This works
`A(0);
`A(1);
`A(2);
`A(3);

// doesn't work. For example @ gidx==0 will eval to 'assign array_in[0] = outgidx;'.
// There is not outgidx
genvar gidx;
generate
  for(gidx=0; gidx<4; gidx++) begin
    `A(gidx); 
  end
endgenerate

`undef A // prevent macro from from being used latter on

如果只是少数条目,最好手动完成。如果是大量条目,那么您需要考虑一种为您生成的方法,例如嵌入式编码。

还有各种嵌入式代码(例如Perl&#39; EP3,Ruby&#39; eRuby / ruby_it,Python&#39; prepro等等,可以生成所需的代码。选择你的偏好。在提供给编译器之前,您需要对这些文件进行单处理。 EP3生成400个分配的示例:

@perl_begin
  foreach my $idx (0..400) {
    printf "assign array_in[%0d] = out%0d;", $idx, $idx;
  }
@perl_end

答案 1 :(得分:0)

使用``将文本与参数分开。

`define IN(x) in``x

但是在评估宏时,还没有声明变量i的另一个问题。因此整个生成循环只连接到ini,因为i只是另一个字母。因为这个宏不能通过动态分配的值来分配。

模块的环境必须明确连接到每个输入assign in0 = out0; ... assign in127 = out127。因此,最简单的解决方案是将in_array作为模块输入,并让环境连接到它assign array_in[0] = out0

这样的事情:

module parent_module();

/*some other stuff that has outputs out0, out1 etc.*/

logic [7:0] array_in[4]; 

assign array_in[0] = out0;    
assign array_in[1] = out1;
assign array_in[2] = out2;
assign array_in[3] = out3;

my_module(.array_in(array_in));
endmodule