我有一堆像这样的信号:
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
上面的代码不起作用,但我认为我之前做过类似的事情。
答案 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