给矩阵作为verilog模块的输入

时间:2018-02-19 18:30:31

标签: verilog decode

我正在使用FPGA上的产品代码实现。产品代码基本上是一个矩阵,其中行和列是来自BCH代码库(BCH(1023,993,3))的代码字。我已经在Verilog中有一个BCH解码器。我想要一个1023×1023矩阵作为我的产品代码解码器的输入,然后调用该模块来解码产品代码矩阵的行和列。解码过程在更高层次上工作的方式是,如果码字中有3个以上的错误,BCH解码器模块会修复这些错误并移动到下一行/列。

我的问题如下: 1)是否可以将输入端口作为矩阵? 2)如果我需要管理解码过程,我是否需要实例化BCH解码器1023次或者有更好的方法吗? 3)如果不能将输入端口作为矩阵,我是否需要将所有1023行作为输入row1 [1022:0]等一维向量给出,还是有更好的方法可以做到这一点? 4)如果步骤3中提到的技术是唯一可用的技术,如何使那些行向量中的列向量可用作输入?

提前致谢。我非常感谢你的时间和精力。

1 个答案:

答案 0 :(得分:1)

一个无法将二维数组作为Verilog 中的端口传递。 SystemVerilog支持2D阵列作为模块端口。

在这里,您需要使用向量并执行一些打包/解包操作。可以为它定义宏。

以下是一个示例代码,其中PACK_ARRAY二维数组打包到一个向量中。根据作为输入提供的宽度和长度进行包装。同样,UNPACK_ARRAY 将矢量解包为二维数组。

`define PACK_ARRAY(PK_WIDTH,PK_LEN,PK_SRC,PK_DEST) \
genvar pk_idx; \
generate \
  for (pk_idx=0; pk_idx<(PK_LEN); pk_idx=pk_idx+1) \
    begin \
      assign PK_DEST[((PK_WIDTH)*pk_idx+((PK_WIDTH)-1)):((PK_WIDTH)*pk_idx)] = PK_SRC[pk_idx][((PK_WIDTH)-1):0]; \
    end \
endgenerate


`define UNPACK_ARRAY(PK_WIDTH,PK_LEN,PK_DEST,PK_SRC) \
genvar unpk_idx; \
generate \
  for (unpk_idx=0; unpk_idx<(PK_LEN); unpk_idx=unpk_idx+1) begin \
    assign PK_DEST[unpk_idx][((PK_WIDTH)-1):0] = PK_SRC[((PK_WIDTH)*unpk_idx+(PK_WIDTH-1)):((PK_WIDTH)*unpk_idx)]; \
  end \
endgenerate


module example (
  input  [(63):0] pack_4_16_in,
  output [(31):0] pack_16_2_out
    );

wire [3:0] in [0:15];

`UNPACK_ARRAY(4,16,in,pack_4_16_in)

wire [15:0] out [0:1];
`PACK_ARRAY(16,2,in,pack_16_2_out)


// useful code goes here

endmodule // example

正如评论中所建议的那样,我认为您应该考虑其他一些方法,而不是直接提供1023 * 1023线作为输入和输出到单个模块。作为替代方案,您可以提供1023 * 1023矩阵元素行式将它们存储到模块的内部存储器

module example(
  input [1023:0] inp, // One can take 'load', 'addr' etc as inputs also
  input clk, rst,
  output [1023:0] out
);

reg [1023:0] mem [0:1023];
reg [9:0] cnt;

always @(posedge clk) begin
  mem[cnt] <= inp;
  cnt      <= cnt + 1;
end

// Some other logic
endmodule

此处,加载内存需要 1K时钟,可能需要一些胶合逻辑。但是这种方法将在模块内部实现内存,并且您不会将硬编码的百万线作为端口。

有关上述代码,请参阅this forum discussion