Algorithm 如何在verilog中声明2D数组?我想要一个4x4矩阵作为输入

Algorithm 如何在verilog中声明2D数组?我想要一个4x4矩阵作为输入,algorithm,encryption,verilog,Algorithm,Encryption,Verilog,我正在创建一个AES verilog代码,我需要在一个4x4矩阵中收集16个输入[7:0],因此我需要定义它并实现矩阵的初始化。我该怎么做?如果您询问如何创建Verilog输入以获取该阵列,您可以有多个输入、压缩阵列或在某些情况下未压缩阵列 多输入: module aes ( input [7:0] data_1, input [7:0] data_2, //... input [7:0] data_16 ); 无包装阵列 module aes #( parameter D

我正在创建一个AES verilog代码,我需要在一个4x4矩阵中收集16个输入[7:0],因此我需要定义它并实现矩阵的初始化。我该怎么做?

如果您询问如何创建Verilog输入以获取该阵列,您可以有多个输入、压缩阵列或在某些情况下未压缩阵列

多输入:

module aes (
  input [7:0] data_1,
  input [7:0] data_2,
  //...
  input [7:0] data_16
);
无包装阵列

module aes #(
  parameter DATA_W = 8,
  parameter BYTE_COUNT = 16,
) (
  input [DATA_W*BYTE_COUNT -1:0] data
);
压缩数组,不像其他类型那样常见:

module aes #(
  parameter DATA_W = 8,
  parameter BYTE_COUNT = 16,
) (
  input [DATA_W-1:0] data [0:BYTE_COUNT-1]
);
我不确定多维数组作为端口的支持程度,但SystemVerilog 2001支持多维数组类型

要将数据保存为4x4阵列,请执行以下操作:

reg [7:0] data [0:3][0:3];
如果这不是一个输入矩阵,而是位移入并存储在触发器中,则初始化将通过复位信号或另一个清除信号完成,用于异步复位:

integer x, y;
always @(posedge clk or negede rst_n) begin
  if (~rst_n) begin
    for (x=0,x<4,x=x+1) begin
      for (y=0,y<4,y=y+1) begin
        data[x][y] <= 8'h00 ;
      end
    end
  end
  else begin
    //Control on rising edge of clk
  end
end
整数x,y;
始终@(posedge clk或negede rst_n)开始
如果开始
对于(x=0,x