簡體   English   中英

單獨的配置文件中的 Verilog 模塊參數?

[英]Verilog module parameters in seperate config file?

我使用的萊迪思 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”參數/`define,您可以在其中設置文本文件以讀取 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 中定義或包含。 我可以接受他們的驗證。 所以它歸結為你對什么感到舒服。

有沒有辦法從另一個文件中提取模塊參數或以其他方式將它們輸入編譯器?

`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

這只是該主題的可能變體之一。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM