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 initial
Konstrukt 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 data
Struktur möchte ich die Bytes aus einer Datei einbetten.
Mir wurde klar, dass der Grund, warum es readmemh
bei 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.
Tom Tischler
initial
Blöcke funktionieren mit vielen FPGA-Synthesewerkzeugen, um die Einschaltwerte von Registern und Speichern festzulegenDavid Tweed
Chris Stratton
Bruce Abbott
VivaDaylight3
DonFusili
VivaDaylight3
DonFusili
initial
Blöcke lassen sich gut für die Artix-7-Linie synthetisieren, vorausgesetzt, Sie verwenden offizielle Xilinx-Werkzeuge. Andere Toolchains könnten ebenfalls funktionieren.VivaDaylight3