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 initial
construcció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 data
estructura es donde me gustaría incrustar los bytes de un archivo.
Me di cuenta de que la razón por la que readmemh
no 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.
tom carpintero
initial
los bloques funcionarán con muchas herramientas de síntesis de FPGA para establecer los valores de encendido de registros y memoriasdavid tweed
chris stratton
bruce abbott
VivaDaylight3
DonFusili
VivaDaylight3
DonFusili
initial
los 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.VivaDaylight3