Ik gebruik de open-source toolchain Yosys > NextPnr > IcePack
voor het synthetiseren van code voor de Lattice HX8K FPGA. Hier is een algemene versie van een 1Kb RAM (die ik gebruik als video-RAM voor een VGA-module):
module text_ram # (
parameter A = 10,
parameter D = 8
) (
input clk,
input wij,
ingang [A-1: 0] adres,
ingang [D-1: 0] din,
output reg. [D-1: 0] dout
);
reg [D-1: 0] vram [0: (1<<A) -1]; // 2 ^ Een geheugenruimte van D-bits
eerste
$ readmemh ("lib / video.hex", vram, 0, 1024);
altijd @ (posedge clk) beginnen
if (we) vram [addr] < = din;
dout < = vram [addr];
einde
eindmodule
Door de bronnen te analyseren met icebox_stat
(naast alle andere logica die ik heb; sorry, maar ik weet niet hoe ik de statistieken voor een enkele component moet isoleren), rapporteert het:
DFF's: 21
LUTs: 204
DRAAGT: 26
BRAMs: 3
IOB's: 4
PLL's: 0
GLB's: 3
Nu, met deze eenvoudige wijziging (die, toegegeven, dout
anders maakt, maar oké voor mijn beoogde doel):
altijd @ (posedge clk)
if (we) vram [addr] < = din;
altijd @(*)
dout < = vram [addr];
Het rapporteert:
DFF's: 21
LUT's: 151
DRAAGT: 26
BRAMs: 0
IOB's: 4
PLL's: 0
GLB's: 1
Het zijn niet alleen 53 minder LUT's, maar wat me echt verbaast, is dat het BRAM-gebruik verdwenen lijkt! Kan iemand me uitleggen waarom? En hoe kan ik dergelijke gevallen inspecteren om er zeker van te zijn dat ik de onderliggende beslissingen van Yosys en NextPnr begrijp ?