Come vengono implementate le dichiarazioni "sempre" di Verilog nell'hardware?


8

La alwaysdichiarazione di Verilog , vale a dire

always @(/* condition */)
    /* block of code */

esegue block of codeogni volta che conditionè soddisfatto. Come viene alwaysimplementato un tale blocco nell'hardware?


Penso che dipenda fortemente da ciò che block of codeè ...
m.,

1
E se la condizione è posedge xo solox
Giustino il

@Justin: supponiamo che non ci sia posedge.
Randomblue,

Risposte:


16

Innanzitutto, nota che non tutti i design di Verilog sono sintetizzabili. Di solito, solo un sottoinsieme molto specifico di costrutti può essere utilizzato in un progetto che deve essere realizzato in hardware.

Un'importante restrizione che si apre è che ogni regvariabile può essere assegnata al massimo in una sola alwaysistruzione. In altre parole, regs ha affinità con i alwaysblocchi.

I seguenti tipi di alwaysblocchi possono essere generalmente utilizzati.

always @(*) begin
    // combinational
end

always @(posedge clk) begin
    // sequential
end

Nel primo caso, *indica che il blocco deve essere eseguito ogni volta che cambia qualsiasi segnale utilizzato nel blocco o, equivalentemente, che il blocco deve essere eseguito continuamente. Pertanto, gli regs che hanno affinità con i alwaysblocchi combinatori sono implementati come segnali calcolati da altri segnali usando la logica combinatoria, cioè le porte.

I registri che hanno affinità con i alwaysblocchi di quest'ultimo tipo, d'altra parte, sono uscite di infradito D che sono sincronizzate sul fronte di salita di clk(fronte di discesa se negedgeusato). Gli input per le infradito sono, di nuovo, calcolati con la logica combinatoria da altri segnali.

Considera il seguente esempio in qualche modo inventato.

reg out, out_n;
always @(*) begin
    out_n = !out;
end
always @(posedge clk) begin
    out <= !out;
end

Qui, out_nè associato al primo alwaysblocco, outal secondo. out_nsarà implementato con un singolo gate NOT che guiderà out_ne sarà guidato da out(si noti che è una logica combinatoria pura). D'altra parte, outsarà guidato da un infradito con clock clk. L'input per il flip-flop verrà nuovamente calcolato da un gate NOT da out(che è guidato dal summenzionato flip-flop). L'ottimizzazione dei sintetizzatori combinerà le due porte NOT e utilizzerà una porta NOT e una flip-flop.

A seconda dell'hardware disponibile, è possibile utilizzare altri tipi di costrutti. Ad esempio, se le infradito hanno ripristini asincroni, anche il seguente costrutto è sintetizzabile.

always @(posedge clk or posedge rst) begin
    if (rst)
        // reset
    else
        // sequential
end

Grazie. Per quanto riguarda *, ho pensato che indicasse che il blocco dovrebbe essere eseguito ogni volta che cambia qualsiasi segnale nel blocco (al contrario del design ).
Randomblue,

@Randomblue, hai ragione, riparerò la risposta. Si noti, tuttavia, che i due hanno un comportamento equivalente.
avakar,

Vero; giusto!
Randomblue,

2

Un alwaysblocco è comunemente usato per descrivere un flip-flop, un latch o un multiplexer. Il codice verrebbe implementato con un flip-flop, un latch o un multiplexer.

In un FPGA un flip-flop e un latch sono generalmente solo due diverse configurazioni di un dispositivo di registro più generico. Un multiplexer verrebbe costruito da uno o più elementi logici di uso generale (LUT).

In generale, ci sono due modi per progettare con Verilog:

  1. Visualizza la logica desiderata in termini di porte e registri, quindi scopri come descriverla in Verilog. Le guide di sintesi dei distributori FPGA o dei distributori di strumenti di sintesi forniscono una piastra di caldaia per le strutture più comuni con cui potresti voler lavorare.

  2. Scrivi Verilog e non preoccuparti di come appare l'hardware sottostante. Tuttavia, anche se lo fai, devi ancora sapere cosa è e cosa non è sintetizzabile. Quindi, guarderai alla piastra della caldaia fornita dal tuo fornitore di utensili e la adatterai alla tua applicazione.

MODIFICARE

La risposta di Avakar è molto migliore per la tua domanda, ma questo ha stimolato alcune interessanti discussioni sulle differenze tra Xilinx e Altera, quindi non lo eliminerò.


"flip-flop e un latch sono generalmente solo due diverse configurazioni" Lo sono? Mi aspetto che i latch vengano implementati con i LUT (con attenzione se i LUT non sono privi di problemi).
avakar,

@avakar, so che in tutti gli FPGA Xilinx (o almeno in quelli remoti recenti) i latch utilizzano lo stesso hardware di un flip-flop, differendo di un solo bit nel flusso di configurazione. Non sono sicuro di altri marchi.
Kevin Cathcart,

Hmm. Alcuni vecchi progetti Altera avevano percorsi di feedback che avrebbero consentito l'utilizzo di LUT per implementare i latch. Sembra quasi che il routing principale potrebbe essere necessario per implementare i fermi nei progetti più recenti. Ciò non sorprende, tuttavia, poiché nel moderno design RTL i dispositivi di chiusura reali (anziché le infradito) sono raramente desiderati.
Kevin Cathcart,

@avakar, ho più familiarità con Xilinx, in cui il dispositivo di registrazione può essere configurato come flip-flop o latch. Se ciò non fosse possibile in Altera o in qualche altro fornitore, renderebbe ancora più forte il consiglio generale "non progettare con fermi".
The Photon

@KevinCathcart e Photon: vedo, non ho familiarità con Xilinx, solo con la serie Altera Cyclone, che non ha circuiti di aggancio dedicati.
avakar,

0

Come è stato detto, non sempre tutti i blocchi sono sintetizzabili. Ci sono anche alcuni blocchi che gli strumenti di sintesi accetteranno ma che produrranno risultati diversi da quelli che produrrà un simulatore.

Prima di tutto dalla lista della sensibilità. La regola abituale è che deve contenere solo costrutti di rilevamento dei bordi (e di solito esiste una selezione limitata di possibili combinazioni) oppure deve contenere (possibilmente mediante l'uso di * o il comando always_comb di systemverilog) tutti i segnali utilizzati come input per il blocco. Chiamiamo il primo un blocco combinatorio e il secondo un blocco sequenziale o. In genere, se si include solo un sottoinsieme di input in strumenti di sintesi di un blocco combinatorio, si ignorerà e si comporterà come se fosse stato specificato l'elenco completo (creando disallineamenti di simulazione / sintesi)

Secondo blocco rispetto a incarichi noblock. In un blocco combinatorio la differenza non ha molta importanza, ma in un blocco sequenziale conta molto.

In un blocco sequenziale di assegnazioni non bloccanti modellare un registro in modo abbastanza diretto mentre si bloccano le variabili del modello di assegnazioni (che possono o meno implicare registri a seconda dell'ordine di impostazione e lettura). Di norma un set "reg" che utilizza le assegnazioni di blocco in un blocco sequenziale deve essere letto solo nello stesso blocco e le asserzioni di blocco e non bloccanti non devono essere mescolate sullo stesso "reg".

La miscelazione di assegnazioni di blocco e non di blocco allo stesso elemento può causare errori di sintesi. Effettuare una valutazione di blocco in un blocco e leggerlo in un altro può causare disallineamenti di simulazione / sintesi (e possibilmente anche disallineamenti tra le diverse esecuzioni di simulazione).

Ora abbiamo le regole di base fuori dal modo in cui possiamo considerare come il compilatore trasforma il codice in logica.

Il primo passo è srotolare tutti i loop. Ciò significa che i loop devono avere un conteggio di iterazioni massimo che può essere determinato al momento della sintesi o si otterrà un errore di sintesi.

Quindi lo strumento può analizzare il flusso di controllo del blocco e trasformarlo in un flusso di dati. Ogni variabile diventa uno o più segnali. Ogni istruzione if o costrutto simile diventa uno o più multiplexer selezionando quale set di risultati verrà effettivamente utilizzato.

Lo strumento proverà quindi ad applicare alcune optmisations.

In quartus puoi vedere i risultati di questo processo dopo aver creato il tuo progetto andando in "strumenti-> visualizzatori netlist-> visualizzatore rtl".

Dopo aver generato questa rappresentazione strutturale in termini di elementi logici astratti, lo strumento passerà quindi a mappare quegli elementi astratti sulle risorse effettivamente presenti nel chip.

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.