在Verilog 2005中将矩阵转换为数组

时间:2018-09-24 09:26:29

标签: verilog

我知道在Verilog中无法将矩阵传递给端口,所以我想知道如何将矩阵转换为数组。

考虑代码:

input [7:0] matrix1 [0:3][0:3];

该代码在systemverilog中有效,但在Verilog 2005标准中无效。

任何人都知道如何执行此操作?我需要它是可综合的。

1 个答案:

答案 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

或两种方法的混合/匹配组合。

对于小的矩阵,使用哪种方法都没有关系。对于非常大的矩阵,特定的合成器工具,版本和合成约束可能开始成为使用哪种策略的因素。