Come identificare le aree di un progetto FPGA che utilizzano la maggior parte delle risorse e dell'area?


11

Sto lavorando su un grande design FPGA e sono molto vicino ai limiti di risorse dell'FPGA che sto attualmente utilizzando, Xilinx LX16 nel pacchetto CSG225.

Anche il design è quasi completo, tuttavia al momento non si adatta più all'FPGA. Posso disattivare le parti per adattarle, tuttavia devo ridurre l'utilizzo delle risorse al fine di completare la progettazione e far sì che soddisfi i requisiti di tempistica e dimensioni.

Vorrei sapere se ci sono strumenti nei nostri rapporti che possono aiutarmi a identificare quali parti del mio progetto consumano più risorse. Il mio progetto non è partizionato ed è suddiviso in circa una dozzina o più moduli VHDL.

I rapporti sui tempi di Xilinx sono fantastici, ma ora devo sapere dove posso ottenere il miglior rapporto qualità-prezzo in termini di risparmio di spazio.

Ho anche difficoltà a dire da quale tipo di risorse sto esaurendo o quali effetti hanno tali risorse.

Un altro fastidio è che, man mano che il design si ingrandisce, i componenti utilizzati per rispettare i tempi iniziano a fallire perché il loro posizionamento non è più l'ideale.

Attualmente, utilizzo i rapporti di temporizzazione Post-Place e Route Static e utilizzo SmartXplorer. Sto usando strategie di progettazione per ottimizzare i tempi.

Dopo aver disattivato parte del mio design per adattarlo, ecco alcuni dei risultati:

utilizzo del registro slice: 42% utilizzo LUT slice: 96% numero di coppie LUT-FF completamente utilizzate: 38% Questo significa che sono leggero sui registri, ma pesante sull'uso del gate?

Esistono strumenti per aiutare gli sviluppatori a ottimizzare per area o almeno fornire loro maggiori informazioni sul loro codice?

Aggiornamento: Dopo aver esaminato l'utilizzo a livello di modulo, ho scoperto che avevo una piccola colla asincrona quindici in tutto il luogo che occupavano circa il 30% dei LUT totali. Li sto usando come colla per domini incrociati per bus ad alta velocità. Dovrei essere in grado di eliminarli, poiché gli orologi sono strettamente correlati. (Ingresso da 120 MHz, produce 100 MHz e 200 MHz tramite DCM)


Sembra che tu abbia molte interconnessioni tra i segnali, sono sicuro che puoi risolverlo cambiando i livelli di ottimizzazione, condivisione delle risorse e così via. Quale strumento stai usando? ISE o Vivado?
FarhadA,

1
Sto usando ISE (Vivado non supporterà Spartan-6) Ho postato questo post nei forum di Xilinx e hanno detto di attivare il Rapporto mappe dettagliate. L'ho fatto e il file * .mrp ora contiene la Sezione 13 - Utilizzo da parte della Gerarchia. Pubblicherò i dati una volta formattati meglio.
Marcus10110,

Risposte:


5

Ho incrociato questa domanda sul forum Xilinx qui: http://forums.xilinx.com/t5/Implementation/How-to-determine-what-part-of-the-design-consumes-the-most/td-p / 393.247

Questa risposta si basa in gran parte sui commenti lì. Grazie a Deepika, Sikta e Gabor.

Innanzitutto, abilita "Genera report MAP dettagliato" nelle proprietà del processo della mappa (-detail).

Quindi, aprire il Riepilogo del progetto e passare a Utilizzo a livello di modulo. Ecco la gerarchia completa, che mostra l'utilizzo del design esclusivo e inclusivo.

Ogni riga mostrerà una coppia di numeri come 0/5392. Ciò significa che quel modulo contiene zero di quell'elemento specifico, ma quel modulo e tutti i suoi sottomoduli contengono un totale di 5392 elementi.

Ecco il mio output (parzialmente espanso) Rapporto di utilizzo

Quando si lavora per ridurre le dimensioni, Gabor consiglia di passare a un FPGA più grande negli strumenti synth in modo che possa mappare completamente anche quando è troppo grande per adattarsi al FPGA corrente e renderà gli strumenti più veloci.


3

Sembra che tu stia utilizzando quasi tutte le risorse logiche mentre usi solo la metà dei registri. Sembra che tu abbia bisogno di capire cosa sta divorando tutti i tuoi LUT. Esistono modi per ottimizzare determinati componenti e renderli un po 'più efficienti in termini di spazio, ad esempio RAM, registri a scorrimento e macchine a stati. Guarda il file .log risultante dal sintetizzatore. Ti dirà che tipo di componenti vengono dedotti. Assicurarsi che stia inferendo correttamente i componenti. In caso contrario, potrebbe non generare una netlist particolarmente efficiente. Puoi dire molto semplicemente guardando i file di registro di sintesi. È possibile che alcune piccole modifiche al codice consentano al sintonizzatore di dedurre vari componenti, quindi dai un'occhiata al manuale del sintetizzatore per alcuni template. Potrebbe essere necessario cambiare il sintetizzatore per ottimizzare l'area anziché la velocità. Inoltre, controlla per assicurarti di non avere nessuna impostazione inferita disattivata. Una volta ho provato a sintetizzare un componente di design che consumava il 40% di uno Spartan 3E 500 (9.312 coppie LUT / FF a 4 ingressi, 5,6 KB di blocco RAM) per un Virtex 6 HXT 565 (354.240 coppie LUT a 6 ingressi / doppio FF, 32 MB blocco RAM). Xilinx par ha impiegato 7 ore per terminare e ha assorbito circa il 40% del chip. ?!?!?!? Si scopre che il blocco infer di RAM è stato disattivato e il sintetizzatore ha trasformato diversi KB di RAM in LUT. Non è la decisione più efficiente di sempre. Dopo aver modificato l'impostazione, ha assorbito l'1% del chip. Vai a capire. 312 coppie LUT / FF a 4 ingressi, 5,6 KB di blocco RAM) per un Virtex 6 HXT 565 (354.240 coppie LUT a 6 ingressi / doppio FF, 32 MB di blocco RAM). Xilinx par ha impiegato 7 ore per terminare e ha assorbito circa il 40% del chip. ?!?!?!? Si scopre che il blocco infer di RAM è stato disattivato e il sintetizzatore ha trasformato diversi KB di RAM in LUT. Non è la decisione più efficiente di sempre. Dopo aver modificato l'impostazione, ha assorbito l'1% del chip. Vai a capire. 312 coppie LUT / FF a 4 ingressi, 5,6 KB di blocco RAM) per un Virtex 6 HXT 565 (354.240 coppie LUT a 6 ingressi / doppio FF, 32 MB di blocco RAM). Xilinx par ha impiegato 7 ore per terminare e ha assorbito circa il 40% del chip. ?!?!?!? Si scopre che il blocco infer di RAM è stato disattivato e il sintetizzatore ha trasformato diversi KB di RAM in LUT. Non è la decisione più efficiente di sempre. Dopo aver modificato l'impostazione, ha assorbito l'1% del chip. Vai a capire.


3

Vale la pena pubblicare l'intera sezione sull'utilizzo delle risorse dall'output dello strumento.

Usi tutte le RAM di blocco? È comune essere in grado di sostituire le funzioni logiche / matematiche con tabelle di ricerca RAM equivalenti se il dominio è sufficientemente limitato e sono di complessità sufficiente da valere il pre-calcolo.

Oltre all'inferenza della memoria, lo stesso vale per i moltiplicatori. A volte una piccola deviazione dal modello di istanza consigliato può eliminare il moltiplicatore inferito alle unità DSP48A.

Se si utilizza il controller PCIe, è possibile ridurre lo spazio buffer totale riservato ai payload TLP o la dimensione massima del pacchetto TLP? Ciò può ridurre l'utilizzo della RAM / della logica del core IP a scapito della larghezza di banda complessiva.

Con (Altera) Quartus, è possibile selezionare più voci nella vista gerarchica del disegno e vedere lì l'uso post-p & r con codice colore / cluster. Questo può dare un'idea visiva dell'uso relativo dei tuoi moduli di progettazione.


Grazie. Sto usando le macro IP rigide per i moltiplicatori e ho usato CoreGen per creare i FIFO, anche se ho selezionato alcuni dei piccoli quindici per utilizzare la RAM distribuita (anziché la RAM a blocchi). Esaminerò il loro utilizzo.
Marcus10110,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.