VHDL: utilizzo dell'operatore '*' durante l'implementazione di moltiplicatori nella progettazione


10

Gli FPGA di oggi hanno blocchi DSP incorporati, gli ultimi FPGA hanno persino unità in virgola mobile conformi allo standard IEEE-754.

È possibile creare un'entità / modulo DSP usando una GUI dopo aver selezionato i parametri richiesti in essa, e quindi istanziarlo nella progettazione.

Quando dobbiamo fare un tale micromanagment in un progetto di istantizzazione di blocchi DSP effettivi e quando inseriamo semplicemente un operatore '*' nel codice e lasciamo che lo strumento di sintesi gestisca i dettagli di basso livello? Che è migliore?

Esistono molti tipi diversi di algoritmi di moltiplicazione quando si tratta di moltiplicazione binaria. Da allora abbiamo incorporato blocchi DSP su silicio e persino moltiplicatori in virgola mobile, ciò significa che tutti quegli algoritmi non sono diventati effettivamente obsoleti.


Quali FPGA hanno FPU conformi a 754 nel fabric?
Martin Thompson,

Risposte:


6

L'ho fatto alcune volte da solo.

In generale, gli strumenti di progettazione sceglieranno tra un'implementazione di fabric e una sezione DSP in base alle impostazioni di sintesi.

Ad esempio, per Xilinx ISE, nelle impostazioni del processo di sintesi, Opzioni HDL, esiste un'impostazione "-use_dsp48" con le opzioni: Auto, AutoMax, Sì, No. Come puoi immaginare, controlla quanto gli strumenti provano a posizionare Sezioni DSP. Una volta ho avuto un problema in cui ho moltiplicato un numero intero per 3, che ha inferito una porzione DSP - tranne che stavo già inferendo manualmente ogni fetta DSP nel chip, quindi il synth non è riuscito! Ho cambiato l'impostazione su No, perché stavo già usando ogni slice dsp.

Questa è probabilmente una buona regola empirica (ho appena inventato): se il tuo design ha un clock a meno di 50 MHz e probabilmente utilizzerai meno del 50% delle sezioni DSP nel chip, quindi usa semplicemente il *, + e - operatori. questo dedurrà sezioni DSP senza registri della pipeline. Questo limita davvero la velocità massima. (Non ho idea di cosa succede quando usi la divisione)

Tuttavia, se sembra che le sezioni si avvicinino alla velocità massima della sezione DSP (333 MHz per Spartan 6 grado di velocità normale) Di utilizzare tutte le sezioni, è necessario inferirle manualmente .

In questo caso, hai due opzioni.

Opzione 1: utilizzare manualmente il modello di istanza DSP non elaborato. Opzione 2: utilizzare un blocco IP da Xilinx Core Generator. (Vorrei usare questa opzione. Allo stesso tempo, imparerai tutto sulla core gen, che ti aiuterà in futuro)

Prima di eseguire una di queste operazioni, leggere le prime due pagine della guida per l'utente della sezione DSP. Nel caso di Spartan 6, (DSP48A1), sarebbe Xilinx doc UG389: http://www.xilinx.com/support/documentation/user_guides/ug389.pdf

Considera prima l'opzione Core Generator. Di solito creo un progetto di test in Core Generator per la parte con cui sto lavorando, dove creo un numero qualsiasi di blocchi IP solo per imparare il sistema. Quindi, quando sono pronto per aggiungerne uno al mio progetto in ISE, faccio clic con il pulsante destro del mouse su Design Hierarchy, faccio clic su nuova fonte e seleziono "IP (Generatore CORE e procedura guidata per l'architettura)" in modo da poter modificare e rigenerare direttamente il blocco dal mio progetto.

In Core gen, dai un'occhiata ai diversi blocchi IP tra cui puoi scegliere: ce ne sono alcune dozzine, la maggior parte delle quali sono piuttosto interessanti.

Il nucleo moltiplicatore è quello che dovresti guardare prima. Dai un'occhiata a ogni pagina e fai clic sul pulsante del foglio dati. Le parti importanti sono la larghezza dei bit interi, gli stadi della tubazione (latenza) e tutti i segnali di controllo. Questo produce il blocco più semplice possibile togliendo tutte le porte di cui non hai bisogno.

Quando stavo costruendo un filtro IIR di ordine 5 per 3 l'anno scorso, ho dovuto usare il modello di istanza manuale poiché stavo costruendo un'implementazione molto personalizzata, con 2 slice DSP con un clock 4 volte più veloce della frequenza di campionamento. È stato un dolore totale.


13

Se si desidera solo moltiplicare due numeri e si adattano al blocco DSP, l' *operatore dovrebbe dedurre un blocco DSP. In caso contrario, rispedire lo strumento di sintesi :)

Tuttavia, per sfruttare le combinazioni più complesse della funzionalità DSP è spesso necessaria un'istanza diretta del blocco e la configurazione dei suoi parametri. Esempi di cose che potrebbero non essere ben mappate per inferenza (usando Xilinx DSP48E1 come esempio):

  • Uso del pre-adder
  • Uso dell'accumulatore postale
  • Uso del rivelatore di pattern
  • Uso dell'unità logica

E soprattutto combinazioni di quanto sopra.

Gli strumenti di sintesi non sono ancora abbastanza buoni per mappare combinazioni completamente arbitrarie di logica e aritmetica nel modo più efficace che si possa sperare.


4

Se sono presenti blocchi DSP, è necessario utilizzarli se è possibile perché sarà più efficiente dell'utilizzo dei LUT per fare la stessa cosa. A meno che non sia necessaria una moltiplicazione ad alte prestazioni, nel qual caso è necessario implementare, ad esempio, un sommatore con pipeline e un registro a scorrimento per risparmiare spazio.

Tuttavia, vorrei esaminare i blocchi DSP prima di accedere agli strumenti della GUI. Il manuale Xilinx XST ha "ricette" HDL su come istanziare i blocchi DSP con verilog / VHDL puro. Fondamentalmente, se aggiungi abbastanza registri prima e / o dopo i moltiplicatori, XST utilizzerà un blocco DSP per implementare automaticamente l'operazione. Puoi controllare nei log di sintesi per vedere se sta inferendo correttamente i blocchi DSP. Presumo che Altera abbia qualcosa di simile.

Per inciso, lo stavo solo riflettendo qualche minuto fa mentre attualmente sto lavorando a un'implementazione di twister di Mersenne che utilizza solo un moltiplicatore per il seme iniziale. La mia implementazione del primo passaggio non soddisfa i tempi, ma la funzionalità è corretta. XST inserisce anche l'operazione di moltiplicazione in blocchi DSP, tuttavia non è ottimizzato, quindi corre circa la metà della velocità che vorrei. Probabilmente reimplementerò la moltiplicazione usando una tecnica shift-and-add che impiegherà 32 volte il numero di cicli di clock, ma non richiederà più un moltiplicatore hardware.


Perché non dovrebbe fallire il tempismo quando si utilizza il moltiplicatore hardware?
quantum231,

Apparentemente, la moltiplicazione senza pipeline a 32 bit per 32 bit richiede più di 8 ns.
alex.forencich,

hmm, vedo, non l'ho considerato. Quindi i blocchi DSP non vengono pipeline. Mi chiedo come abbiano implementato esattamente la moltiplicazione. È davvero un moltiplicatore parallelo veramente duro?
quantum231,

Penso che possa essere configurato per funzionare in diversi modi. Secondo il manuale XST, l'aggiunta di un numero sufficiente di registri sull'ingresso e sull'uscita consentirà a XST di utilizzare un moltiplicatore con pipeline in una porzione DSP48. Nel mio caso c'era un solo registro di uscita e nessun registro di ingresso, quindi non è stato possibile trarne vantaggio. Poiché questo era solo per l'inizializzazione (seeding del PRNG), ho sostituito il moltiplicatore parallelo con un moltiplicatore seriale di bit per risparmiare sull'utilizzo delle risorse.
alex.forencich,

2

Dipende da quanta ottimizzazione hai bisogno e da quanto portatile dovrebbe essere il tuo design. È un po 'come il software, che ottimizza usando un po' di assembly o lasciando che il compilatore scelga le istruzioni. Potresti avere anche alcuni compromessi di dimensioni / velocità in modo da non poterti permettere un moltiplicatore combinatorio di doppia precisione.

Non sapevo dove fossero i moltiplicatori FP cablati negli FPGA.

Un vero operatore di moltiplicazione conforme a IEEE P754 adatto per una CPU coinvolge più di un grande moltiplicatore: è necessario aggiungere gli esponenti, spostare i denormali, gestire gli infiniti e alcuni flag per lo più inutili (inesatti, underflow ...)


Gli FPGA di ultima generazione come la serie Altera 10 hanno moltiplicatori a virgola mobile conformi allo standard IEEE-754 sull'hardware stesso! Non ho avuto l'opportunità di usarli da solo però.
quantum231,

Se abbiamo incorporato blocchi DSP, FPGA dovrebbe usarli al posto del moltiplicatore combinatorio o utilizzare qualche altro algoritmo che ad esempio utilizza il blocco di memoria giusto?
quantum231,

2

Ho letto questo documento http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :

Mentre le funzioni che rientrano in un singolo blocco DSP possono essere sintetizzate in modo efficiente dal codice RTL pipeline, abbiamo scoperto che le funzioni più complesse che richiedono più blocchi DSP hanno prestazioni inferiori. Una descrizione RTL standard di una funzione matematica può essere fortemente pipeline, ad esempio dopo ciascuna operazione, tuttavia, poiché questa pipeline potrebbe non tenere conto della struttura e degli stadi interni del blocco DSP, il design sintetizzato risultante potrebbe mostrare prestazioni scadenti poiché i blocchi DSP sono combinati in un modo che non consente loro di funzionare alla massima velocità.

Vorrei poter trovare la fonte dei loro strumenti per verificare i loro risultati.

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.