Einbetten von Daten in RAM während der Synthese

Ich habe eine CPU entworfen, die in der Simulation mit Verilator funktioniert, und möchte sie jetzt in Hardware auf einem FPGA testen. Ein schneller Weg, um in die Testphase zu gelangen, wäre, ein Programm, das auf der CPU ausgeführt werden soll, in den Speicher des FPGA selbst einzubetten und dann Anweisungen daraus zu lesen.

Ich habe über die $readmemh(...)Funktion gelesen, die Daten aus einer .mem-Datei in eine Speicherstruktur liest, aber ich bin mir nicht sicher, wie dies während der Synthese geschehen soll. Ich habe versucht, ein initialKonstrukt zu verwenden, aber gelernt, dass dies nur in der Simulation ausgeführt wurde. Wie würde ich vorgehen, um Daten bei der Synthese in das FPGA einzubetten?

In Zukunft würde ich mir eine Möglichkeit ausdenken, ein Programm beim Start seriell zu laden oder Anweisungen von etwas wie Flash-Speicher zu lesen, der separat programmiert werden könnte (ähnlich wie ein ATMega programmiert wird).

Mein RAM-Modul ist:

`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

In der dataStruktur möchte ich die Bytes aus einer Datei einbetten.

„Ich habe versucht, ein anfängliches Konstrukt zu verwenden, habe aber festgestellt, dass dies nur in der Simulation ausgeführt wurde“ – initialBlöcke funktionieren mit vielen FPGA-Synthesewerkzeugen, um die Einschaltwerte von Registern und Speichern festzulegen
Zuerst müssen Sie herausfinden, ob die bestimmte FPGA-Blockspeicherressource, auf die Sie abzielen, aus dem Bitstrom initialisiert werden kann. Wenn dies der Fall ist, verfolgen Sie die entsprechende Methode. Einige Typen können dies nicht, in diesem Fall benötigen Sie Ihre eigene Logik, um den Zustand zu initialisieren, entweder durch Verwendung von Hooks, mit denen Sie zusätzliche Daten über das Ende des Bitstroms hinaus aus dem Konfigurations-Flash lesen können, oder durch Lesen von einer anderen Form von non -flüchtiger Speicher.
Warum muss es RAM sein?
@BruceAbbott Das muss nicht unbedingt sein. Ich brauche nur eine Möglichkeit, einige vordefinierte Daten abzurufen.
Auf welches FPGA zielen Sie ab?
@DonFusili Ich ziele auf einen Arty-A7 mit einem Artix-7 35T fpga ( reference.digilentinc.com/reference/programmable-logic/arty-a7/… )
Dann ist Tom Carpenter genau richtig: initialBlöcke lassen sich gut für die Artix-7-Linie synthetisieren, vorausgesetzt, Sie verwenden offizielle Xilinx-Werkzeuge. Andere Toolchains könnten ebenfalls funktionieren.
Vielen Dank an alle, ich erkannte, dass der Grund, warum readmemh für mich nicht funktionierte, darin bestand, dass die Größe der Struktur, in die geschrieben wird, dieselbe Größe wie die eingelesenen Daten haben muss. Dies kann eine normale Einschränkung sein oder daran liegen mein Setup, aber es hat das Problem für mich behoben.

Antworten (1)

Mir wurde klar, dass der Grund, warum es readmemhbei mir nicht funktionierte, darin bestand, dass die Größe der Struktur, in die geschrieben wird, dieselbe Größe wie die eingelesenen Daten haben muss. Dies kann eine normale Einschränkung sein oder an meinem Setup liegen, aber es hat das Problem für mich behoben.