verilog2005中矩阵到阵列的转换

verilog2005中矩阵到阵列的转换,verilog,Verilog,我知道在Verilog中矩阵不能传递到端口,所以我想知道如何将矩阵转换成数组 以代码为例: input [7:0] matrix1 [0:3][0:3]; 该代码在systemverilog中有效,但在Verilog 2005标准中无效 有人知道怎么做吗?我需要它是可合成的。你有选择 将其拆分为更小的端口: module top(); // ... example dut( .matrix1_0_0(matrix1[0][0]), .matrix1_0_1(matrix1[0][1])

我知道在Verilog中矩阵不能传递到端口,所以我想知道如何将矩阵转换成数组

以代码为例:

input [7:0] matrix1 [0:3][0:3];
该代码在systemverilog中有效,但在Verilog 2005标准中无效

有人知道怎么做吗?我需要它是可合成的。

你有选择

将其拆分为更小的端口:

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
合并到单个总线中,然后使用
+:
-:
将其拆分回矩阵(请参阅):

moduletop();
// ...
整数i,j;
reg[8*4*4-1:0]矩阵1_总线;
总是开始

对于(i=0;i你确定你的合成工具不能处理系统verilog语法吗?我的不能,而且我已经使用了硅的2D阵列(该阵列工作正常,正在出售给客户)。在将设计读入合成工具时,您可能只需要添加
-sv
开关。@nguthrie您使用的是什么工具?Cadence Engus。由于verilog 2005已有13年历史,我希望此时许多其他工具会支持一些sv语法,但我不确定,因为我只使用了这一个。@nguthrie我还发现对systemverilog的支持(在验证之外)是相当令人惊讶的-以一种糟糕的方式。为了简单起见,我将使用systemverilog。尽管我非常有兴趣看到关于如何在verilog中实现它的答案。
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