我知道在Verilog中无法将矩阵传递给端口,所以我想知道如何将矩阵转换为数组。
考虑代码:
input [7:0] matrix1 [0:3][0:3];
该代码在systemverilog中有效,但在Verilog 2005标准中无效。
任何人都知道如何执行此操作?我需要它是可综合的。
答案 0 :(得分:1)
您有选择。
将其拆分为较小的端口:
module top();
// ...
example dut(
.matrix1_0_0(matrix1[0][0]),
.matrix1_0_1(matrix1[0][1]),
// ...
.matrix1_3_2(matrix1[3][2]),
.matrix1_3_3(matrix1[3][3]),
// ... other ports ...
);
// ...
endmodule
module example(
input [7:0] matrix1_0_0,
input [7:0] matrix1_0_1,
// ...
input [7:0] matrix1_3_2,
input [7:0] matrix1_3_3,
// ... other ports ...
);
wire [7:0] matrix1 [0:3][0:3];
assign matrix1[0][0] = matrix1_0_0;
// ...
assign matrix1[3][3] = matrix1_3_3;
// ... other logic
endmodule
合并为一条总线,然后使用+:
或-:
(请参阅official documentation)将其拆分为矩阵:
module top();
// ...
integer i,j;
reg [8*4*4-1:0] matrix1_bus;
always @* begin
for(i = 0; i<4; i=i+1) begin
for(j = 0; j<4; j=j+1) begin
matrix1_bus[ 8*( 4*i + j) +: 8] = matrix1[i][j];
end
end
end
example dut(
.matrix1_bus(matrix1_bus),
// ... other ports ...
);
// ...
endmodule
module example(
input [8*4*4-1:0] matrix1_bus,
// ... other ports ...
);
integer i,j;
reg [7:0] matrix1 [0:3][0:3];
always @* begin
for(i = 0; i<4; i=i+1) begin
for(j = 0; j<4; j=j+1) begin
matrix1[i][j] = matrix1_bus[ 8*( 4*i + j) +: 8];
end
end
end
// ... other logic
endmodule
或两种方法的混合/匹配组合。
对于小的矩阵,使用哪种方法都没有关系。对于非常大的矩阵,特定的合成器工具,版本和合成约束可能开始成为使用哪种策略的因素。