EOS

Le CLB nella FPGA XILINX SPARTAN-6

Una descrizione dettagliata della struttura interna dei blocchi logici configurabili delle nuove FPGA Spartan-6.

Spartan-6 è la famiglia di FPGA a basso costo e ridotta dissipazione di potenza proposta tempo fa da Xilinx. Realizzati in una tecnologia a 45 nm con processo dual-oxide e 9 piani di metallizzazione, con una tensione di core di 1.2 V (1.0 V nella versione low-power), i dispositivi Spartan-6 rendono disponibili oltre 150.000 celle logiche, integrando CLB con LUT a 6 ingressi, slide DSP con moltiplicatori embedded 18x18, transceiver seriali low-power a 3.125 Gbps, end-point PCI Express e controller DRAM dedicato con capacità di trasferimento dati fino a 12.8 Gbps. Disponibili in packaging green RoHS, rappresentano soluzioni ideali per applicazioni su grossi volumi caratterizzate da costi contenuti, elevata integrazione, bassa potenza, discrete prestazioni e connettività high-speed. Il paragrafo seguente riporta uno sguardo di dettaglio dell’architettura interna dei blocchi logici configurabili (Configurable Logic Block).

LUT A 6 INGRESSI

Xilinx ha da sempre basato l’architettura delle proprie FPGA su blocchi logici configurabili, denominati CLB, dotati di LUT (look-up table) e di elementi di memorizzazione e connessi tra loro da una matrice di routing ad elevate prestazioni. Le LUT sono delle tabelle di consultazione e possono essere usate per generare una qualsiasi funzione logica di un numero di variabili pari alle sue linee d’indirizzo. E’ infatti sufficiente utilizzare gli ingressi della funzione come linee di indirizzo della LUT e memorizzare in ogni sua locazione il risultato che la funzione logica produce quando, appunto, i suoi ingressi hanno i valori corrispondenti all’indirizzo della locazione stessa. Con la serie Spartan-6, Xilinx migliora ulteriormente architettura e prestazioni delle CLB. Una delle caratteristiche principali è certamente la disponibilità di LUT a 6 ingressi. La figura 1 mostra uno schema di principio dell’architettura di tali blocchi.

Figura 1: l’architettura delle FPGA Stratix V (da [1]).

Figura 1: l’architettura delle FPGA Stratix V (da [1]).

Consistono di due LUT a 5 ingressi ed un multiplexer pilotato dalla sesta linea di ingresso; dispongono di due uscite indipendenti così da poter generare una qualsiasi funzione logica di fino a 6 variabili o due funzioni logiche diverse di fino a 5 variabili che abbiamo ingressi in comune. Realizzare una funzione in una sola LUT consente di ottenere un maggiore livello d’integrazione (e quindi la possibilità di selezionare un dispositivo di minore capacità logica per il proprio progetto riducendo i costi di produzione), migliori prestazioni in frequenza (non dovendo utilizzare risorse di routing) e minore dissipazione di potenza. Il passaggio quindi a LUT a 6 ingressi nella serie Spartan-6 (inaugurato con la famiglia Virtex-5 pensata per il settore delle applicazioni highend e che troviamo anche nella nuova Virtex-6) consente notevoli benefici per i progettisti. Xilinx, sulla base di benchmark comparativi, dichiara così (si veda [2]) un fattore 1.2 di vantaggio rispetto a dispositivi concorrenti nella utilizzazione delle risorse logiche di un componente.

FLIP-FLOP E LATCH COME ELEMENTI DI MEMORIA

Le LUT sono organizzate in slice; ogni CLB ne include due. Vi sono slice di tipo X, L ed M. Le slice di tipo X, ad esempio, includono 4 LUT ed 8 elementi di memorizzazione. In generale, tali elementi sono flip-flop edge-triggered di tipo D; quattro di essi possono però essere configurati, in alternativa, come latch levelsensitive. Gli ingressi di clock, abilitazione di clock e set/reset sono comuni a tutti gli elementi di memoria della slice ma i controlli possono essere abilitati singolarmente per ognuno di essi. Oltre che come elementi di memoria, i latch possono essere usati anche per generare funzioni logiche di tipo AND ed OR a 2 ingressi, come mostrato schematicamente in figura 2 nel caso di una porta OR. In questo caso il latch ha gli ingressi di enable e clock sempre attivi e i due ingressi della porta OR sono realizzati usando le linee dato e di preset asincrono del latch. Usando al posto di quest’ultimo la linea di reset, si ottiene invece una porta AND.

Figura 2: implementazione di una porta OR con un latch (da [1]).

Figura 2: implementazione di una porta OR con un latch (da [1]).

LOGICA DI RIPORTO E MULTIPLEXER DEDICATI

Alle LUT ed agli elementi di memoria, le slice di tipo L aggiungono poi la disponibilità di multiplexer dedicati e logica di riporto per l’implementazione di funzioni aritmetiche. La logica di riporto, in particolare, consiste di 4 bit per ognuno dei quali sono previsti un multiplexer ed una porta XOR connessa direttamente alle uscite delle LUT, così da non utilizzare risorse di routing e ridurre i tempi di propagazione del segnale. I multiplexer possono invece essere usati per implementare funzioni logiche complesse con un elevato numero di variabile mediante combinazione appropriata delle uscite di diverse LUT. Ad esempio, le uscite di quattro LUT possono essere combinate in modo da realizzare una qualsiasi funzione logica di fino a 8 variabile con una singola slice o particolari funzioni di un numero maggiori di variabili, come in particolare, multiplexer 16:1. LUT e multiplexer all’interno di una slice sono connessi da connessioni dedicate, con minori ritardi di propagazioni. Ovviamente le slice possono poi essere connesse tra loro mediante la matrice di routing per creare funzioni logiche di più di 8 variabili; maggiore è il numero di variabili e quindi di LUT utilizzate, maggiore è il ritardo di propagazione della funzione e quindi minore la massima frequenza di clock raggiungibile dal circuito.

MEMORIA EMBEDDED

Più complessa è invece la struttura delle slice di tipo M, la cui architettura è mostrata in figura 3 e nelle quali le LUT possono in alternativa essere configurate come memoria RAM distribuita o registri a scorrimento.

Figura 3: struttura di una sliceM (da [1]).

Figura 3: struttura di una sliceM (da [1]).

Due linee accessorie forniscono gli ingressi di data_input e write_enable. La RAM distribuita, in particolare, si caratterizza per essere veloce e quindi ideale, ad esempio, per implementare buffer FIFO locali di poche locazioni e con dimensioni di parola inferiori a 16 bit. Gli accessi sono sincroni in scrittura ed asincroni in lettura ma il dato letto può ovviamente essere sincronizzato con il clock di sistema usando gli elementi di memoria della slice. In una sliceM possono essere implementati diversi tipi di memoria, come ad esempio una memoria single-port da 256x1 bit od una memoria da 32x2-bit quad-port realizzata usando tutte e quattro le LUT della CLB, o una memoria dual-port da 64x1 bit costruita con solo 2 LUT o, ancora, una memoria single-port da 64x1 bit implementata in una sola LUT. Nelle configurazioni single-port, vi è una sola porta d’indirizzamento per accessi sincroni in scrittura ed asincroni in lettura. In configurazione dual-port vi sono, invece, due porte, di cui una abilitata per accessi in scrittura e lettura e l’altra per i soli accessi in lettura. La configurazione quad-port, infine, dispone di una porta di scrittura/lettura e di tre porte di lettura indipendenti.

…E REGISTRI A SCORRIMENTO

Oltre che come generatore di funzioni e memoria distribuita, una LUT nelle slice di tipo M può essere configurata anche come registro a scorrimento; la figura 4 ne mostra la struttura in tale configurazione.

Figura 4: LUT configurata come registro a scorrimento SRL16E (da [3]).

Figura 4: LUT configurata come registro a scorrimento SRL16E (da [3]).

Tale primitiva SRL16E dispone di un ingresso dati seriale, di una linea di clock con relativa abilitazione e di una porta di lettura asincrona che permette di accedere dinamicamente ad una qualunque della locazioni del registro. Il registro ha 16 locazioni ma strutture più lunghe possono essere al solito create concatenando diverse primitive all’interno della stessa slice (fino ad un massimo di 128 bit) o tra diverse CLB. La primitiva SRL16E supporta un ingresso di clock enable, come detto, ma non il segnale di reset. Pertanto, affinché il tool di sintesi possa inferire tale primitiva da una descrizione RTL di un registro a scorrimento, non deve essere previsto alcun segnale di reset asicrono. In caso contrario, il registro viene sintetizzato utilizzando i flip-flop delle slice. E’ solo il caso di osservare che, in generale, la pratica di rimuovere il segnale di reset dai circuiti nei quali non è necessario è fortemente raccomandata e può talvolta portare ad un riduzione del numero di risorse occupate di fino anche oltre il 10%. Come sempre, ridurre le risorse può significare la possibilità di utilizzare dispositivi di minore capacità logica con costi inferiori. Alcune delle applicazioni più interessanti delle primitive SRL16E riguardano linee di ritardo digitali per la compensazione dei ritardi nel flusso dati legati all’implementazione di una pipeline in una certa parta del circuito, registri di conversione serie-parallelo presenti nei più diffusi protocolli di trasmissione seriali, circuiti per il calcolo della media mobile, divisori di clock, generatori di segnali. Applicazioni più complesse includono filtri FIR e buffer FIFO. In [3] è mostrato, in particolare, come realizzare un ricevitore UART utilizzando pesantemente le primitive SRL16E per quasi tutte le parti del circuito. Il progetto occupa in totale soltanto 18 slice per un totale di 127 fliplop, con una densità, quindi, di 49 porte per slice; 13 LUT sono usate come SRL16E mentre le restanti sono configurate nella modalità logica standard.

UNA MATRICE DI CONNESSIONI CONFIGURABILE AD ALTE PRESTAZIONI

Come mostrato schematicamente in figura 5, le CLB sono connesse da una matrice di routing; ogni CLB può accedere a tale matrice di connessioni mediante una serie di switch locali.

Figura 5: la matrice di routing.

Figura 5: la matrice di routing.

Le interconnessioni rese disponibili sono di vario tipo. Le interconnessioni singole, ad esempio, connettono CLB contigue mentre quelle doppie consentono di connettere CLB una ogni due in direzione orizzontale e verticale e, in direzione diagonale, CLB contigue. Allo stesso modo, le connessioni quadruple connettono CLB una ogni tre in direzione orizzontale e verticale e una ogni due in direzione diagonale. Oltre che dalla lunghezza della linea, i ritardi di propagazione del segnale dipendono dal tipo e dal carico di questa, ovvero dal numero di destinazioni. Da questo punto vista, è interessante osservare come la disponibilità di due uscite indipendenti in ogni LUT permette di replicare una funzione senza consumare ulteriori risorse logiche e di usare quindi connessioni diverse per trasportare il segnale alle diverse destinazioni. Tale possibilità è in genere gestita in automatico dal tool di place&route.

2 Commenti

  1. Giordana Francesca Brescia Giordana Francesca Brescia 14 giugno 2019
  2. Alessandro Alessandro 18 giugno 2019

Scrivi un commento

EOS