单独配置文件中的 Verilog 模块参数?

Verilog module parameters in seperate config file?

我使用的 Lattice FPGA 具有嵌入式 RAM,可以通过配置二进制文件预加载数据。

这些 RAM 的预定义 Verilog 模块通过提供名为 INIT_0 、 INIT_1 、 INIT_2 、 ... 的参数来实现这一点,每个参数都是 256 位值,以执行此操作.

所以我实例化 RAM 的代码如下所示:

        SB_RAM40_4KNRNW #(
                .INIT_0(256'h00000FA00BB807D003E859E905E2F529486300000000000059E099E3404219E2),
                .INIT_1(256'h0123456701234567012345670123456701234567012345670123456701234567),
                .READ_MODE(0) ,
                .WRITE_MODE(0)
        ) buf0L
        (
                .RDATA(readline0[15:0]),
                .RADDR({3'b0,RAMadr[7:0]}),
                ......
        );

虽然它有效,但我想从其他文件中提取数据,因为它是由 make 过程中的其他程序生成的。在构建中修改 .v 文件并不好,因为它是 git-tracked.

有没有办法从另一个文件中提取模块参数或以其他方式将它们提供给编译器?

目前我生成数据,将其粘贴到 .v 源中,然后构建并加载它。目前可以使用,但效果不佳。

当然,这个SB_RAM40_4KNRNW模块有几个实例。该设备有 30 个。

(我使用的是开源工具yosys/nextpnr/icepack)

感谢您的帮助!

我在使用 TSMC 内存时遇到了类似的问题。 TSMC 有一个 "INIT" 参数/`定义,您可以在其中设置文本文件以读取 verilog 十六进制值。问题是,我有多个内存,所以我需要多个文件,每个内存实例都有多个参数(但我试图通过基于参数的内存索引来保持代码整洁)。然而,这说起来容易做起来难,而且对于 `define 来说,它需要在回归期间重新编译。

所以我所做的是创建一个 Python 脚本,该脚本将读取我的反汇编代码(或您想要读取的任何数据)并构造在时间 0 之后立即执行的分配语句(以说明内存初始化)。该文件将作为我的 CPU SW 制作流程的一部分创建,因此它始终是最新的。我选择了这个,因为我们已经有一些脚本可以生成其他部分用于设计和测试,我们只需要一种方法来在快速调试测试期间强制内存内容,而不是等待内存被编程。

initial begin
        // Instruction
        $display("INFO: Starting to directly program Instruction Memory!");
        #1ns;
        {`RISCV_CPU.u_instr_mem_TSMC[0].row_tmp, `RISCV_CPU.u_instr_mem_TSMC[0].col_tmp} = 0;
        `RISCV_CPU.u_instr_mem_TSMC[0].MEMORY[`RISCV_CPU.u_instr_mem_TSMC[0].row_tmp][`RISCV_CPU.u_instr_mem_TSMC[0].col_tmp] = 32'h00000013;
        {`RISCV_CPU.u_instr_mem_TSMC[0].row_tmp, `RISCV_CPU.u_instr_mem_TSMC[0].col_tmp} = 1;
        `RISCV_CPU.u_instr_mem_TSMC[0].MEMORY[`RISCV_CPU.u_instr_mem_TSMC[0].row_tmp][`RISCV_CPU.u_instr_mem_TSMC[0].col_tmp] = 32'h00000013;
        {`RISCV_CPU.u_instr_mem_TSMC[0].row_tmp, `RISCV_CPU.u_instr_mem_TSMC[0].col_tmp} = 2;
        `RISCV_CPU.u_instr_mem_TSMC[0].MEMORY[`RISCV_CPU.u_instr_mem_TSMC[0].row_tmp][`RISCV_CPU.u_instr_mem_TSMC[0].col_tmp] = 32'h00000013;
        {`RISCV_CPU.u_instr_mem_TSMC[0].row_tmp, `RISCV_CPU.u_instr_mem_TSMC[0].col_tmp} = 3;
//lots more...

根据您的内存结构,语法会有所不同。

可能完成您所要求的其他一些方法:

  • 如果每个实例都有一个参数,您可以将参数设为 `define
  • 您可以将 RAM 实例化为一个 `include

我个人不喜欢在我的 RTL 中使用 `defines 或 `includes。我同意他们的验证。所以它归结为你喜欢什么。

Is there a way to pull in module parameters from another file or some other way to feed them into the compiler?

`includeparamlocalparam 的变体是我认为您想要的。
举个例子:假设可以生成如下形式的数据:

// Generated from an assembler or whatever
localparam prg0 = 256'hdeadbeef;
localparam prg1 = 256'h0;
// etc ...

并写入文件from_other_programs.hv。假设在 git-traced 文件中有以下测试程序:

module top
  (
   input         clk,
   input [7:0]   RAMadr,
   output [15:0] readline0
   );
`include "from_other_programs.hv"

   SB_RAM40_4KNRNW #(.INIT_0(prg0), .INIT_1(prg1),
                     .READ_MODE(0),.WRITE_MODE(0)
                     ) buf0L
     (  .RDATA(readline0[15:0]),
        .RADDR({3'b0,RAMadr[7:0]}));
endmodule

这只是此主题的可能变体之一。