Параметры модуля Verilog в отдельном конфигурационном файле? - PullRequest
0 голосов
/ 17 января 2020

Используемая мной решетка FPGA имеет встроенные ОЗУ, в которые можно предварительно загружать данные через двоичный файл конфигурации.

Предопределенные модули Verilog для этих ОЗУ реализуют это, предоставляя параметры с именами INIT_0, INIT_1, INIT_2,. .., каждое 256-битное значение, чтобы сделать это.

Так что мой код для создания ОЗУ выглядит следующим образом:

        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]}),
                ......
        );

Пока он работает, я хотел бы вытащить данные из другого файла, которые генерируются другими программами в процессе создания. Изменение файла .v в сборке не очень удобно, так как он отслеживается git.

Есть ли способ извлечь параметры модуля из другого файла или каким-либо другим способом передать их в компилятор?

В настоящее время я генерирую данные, вставляю их в источник .v, а затем собираю и загружаю их. Пока он работает, но не очень.

Конечно, есть несколько экземпляров этого модуля SB_RAM40_4KNRNW. В устройстве их 30.

(я использую инструменты с открытым исходным кодом yosys / nextpnr / icepack)

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 17 января 2020

У меня была похожая проблема с использованием памяти TSM C. TSM C имеет параметр "INIT" / `определяет, где вы можете установить текстовый файл для чтения в шестнадцатеричных значениях verilog. Проблема заключалась в том, что у меня было несколько ячеек памяти, поэтому мне понадобилось несколько файлов с несколькими параметрами для каждого экземпляра памяти (но я пытался сохранить код чистым, используя индекс памяти, основанный на параметре). Однако это было легче сказать, чем сделать, а также с помощью `define это потребовало бы повторной компиляции во время регрессий.

Итак, я создал сценарий Python, который будет читать в моем разобранном коде (или любые данные, которые вы хотите прочитать) и создали операторы присваивания, которые выполняются сразу после времени 0 (для учета памяти init). Этот файл будет создан как часть моего процесса создания для 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...

Синтаксис будет отличаться в зависимости от вашей структуры памяти.

Некоторые другие способы, возможно, делать то, что вы просите:

  • Вы можете сделать параметры `определить, при условии у вас есть один экземпляр
  • . Вы можете сделать инстанцирование ОЗУ `include

. Мне лично не нравится` определяет или `включает в мой RTL. Я в порядке с ними в проверке. Так что все сводится к тому, что вам удобно.

0 голосов
/ 18 января 2020

Есть ли способ извлечь параметры модуля из другого файла или каким-либо другим способом передать их в компилятор?

Вариации `include, param, localparam я думаю, что вы хотите.
В качестве примера: Предположим, что данные могут быть сгенерированы в следующей форме:

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

и записаны в файл from_other_programs.hv. Предположим, что в файле, отслеженном git, есть следующая тестовая программа:

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

Это всего лишь один из возможных вариантов этой темы.

...