Incrustación de datos en RAM durante la síntesis

Diseñé una CPU que funciona en simulación usando Verilator y ahora me gustaría probarla en hardware en un FPGA. Una forma rápida de llegar a la fase de prueba sería incrustar un programa para ejecutar en la CPU en la memoria de la propia FPGA y luego leer las instrucciones de este.

He leído sobre la $readmemh(...)función que lee datos de un archivo .mem en alguna estructura de memoria, pero no estoy seguro de cómo hacer que esto suceda durante la síntesis. Intenté usar una initialconstrucción pero aprendí que esto solo se ejecutaba en simulación. ¿Cómo haría para incrustar datos en el FPGA en la síntesis?

En el futuro, idearía alguna forma de cargar un programa al inicio en serie o leer instrucciones desde algo como almacenamiento flash que podría programarse por separado (similar a cómo se programa un ATMega).

Mi módulo de RAM es:

`timescale 1ns / 1ps
`define SIZE 512
`define ADDR(address) address[8:0]

module mem(
    /* verilator lint_off UNUSED */
    input [15:0] address,
    /* verilator lint_on UNUSED */
    input [31:0] data_in,
    output reg[31:0] data_out,
    input read,
    input write,
    input clk
);

reg[7:0] data[`SIZE-1:0];

always @(negedge clk) begin
    if (write) begin
        data[`ADDR(address)] <= data_in[7:0];
        data[`ADDR(address) + 1] <= data_in[15:8];
        data[`ADDR(address) + 2] <= data_in[23:16];
        data[`ADDR(address) + 3] <= data_in[31:24];
    end
    else if (read) begin
        data_out[7:0] <= data[`ADDR(address)];
        data_out[15:8] <= data[`ADDR(address) + 1];
        data_out[23:16] <= data[`ADDR(address) + 2];
        data_out[31:24] <= data[`ADDR(address) + 3];
    end
end

endmodule

La dataestructura es donde me gustaría incrustar los bytes de un archivo.

"Intenté usar una construcción inicial, pero aprendí que esto solo se ejecutaba en simulación": initiallos bloques funcionarán con muchas herramientas de síntesis de FPGA para establecer los valores de encendido de registros y memorias
Primero, debe averiguar si el recurso de memoria de bloque de FPGA en particular al que se dirige se puede inicializar desde el flujo de bits; si es así, busque el método apropiado. Algunos tipos no pueden serlo, en cuyo caso necesitaría su propia lógica para inicializar el estado, ya sea usando ganchos que le permitan leer datos adicionales más allá del final del flujo de bits desde el flash de configuración, o leyendo de alguna otra forma de no -Almacenamiento volátil.
¿Por qué tiene que ser RAM?
@BruceAbbott No necesariamente. Solo necesito una forma de recuperar algunos datos predefinidos.
¿Qué FPGA estás apuntando?
@DonFusili Estoy apuntando a un Arty-A7 que tiene un Artix-7 35T fpga ( reference.digilentinc.com/reference/programmable-logic/arty-a7/… )
Entonces Tom Carpenter tiene razón: initiallos bloques se sintetizan bien para la línea Artix-7 siempre que esté utilizando las herramientas oficiales de Xilinx. Otras cadenas de herramientas también podrían funcionar.
Gracias a todos, me di cuenta de que la razón por la que readmemh no me funcionaba era que el tamaño de la estructura en la que se escribe debe ser del mismo tamaño que los datos que se leen. Esto puede ser una restricción normal o podría deberse a mi configuración, pero me solucionó el problema.

Respuestas (1)

Me di cuenta de que la razón por la que readmemhno funcionaba para mí era que el tamaño de la estructura en la que se escribe debe ser del mismo tamaño que los datos que se leen. Esto puede ser una restricción normal o podría deberse a mi configuración, pero me solucionó el problema.