Differenza tra If-else e Case case in VHDL


11

Voglio capire come diversi costrutti nel codice VHDL sono sintetizzati in RTL.

  • Qualcuno può dirmi la differenza tra costrutto If-Else e costrutti dell'istruzione Case di un processo in VHDL in termini di come il codice viene inferito nel circuito RTL dallo strumento di sintesi?
  • Prendi in considerazione il caso di più if-else nidificati e mescola le case case con il costrutto if-else all'interno di un processo.
  • Anche quando usare quale costrutto?

PS: Ho visto una domanda correlata "Dichiarazioni multiple if in corso in vhdl" ma che non risponde comunque alla mia domanda.


Non posso commentare come sarebbero configurate le porte fisiche, ma nella maggior parte dei compilatori che emettono assembly x86 un if-else di solito esiste come un singolo controllo con un salto condizionale (ad esempio jg, jl, jz, jnz, ecc.), mentre switch organizza i casi in ordine numerico e esegue istruzioni dec/ jzistruzioni, il che è molto più efficiente. Forse un'ottimizzazione simile viene applicata qui.
Polinomio

@Polynomial Il comportamento di If-else e case è significativamente diverso nei linguaggi hardware rispetto alla tipica programmazione lineare. Le ottimizzazioni del codice operativo non sono molto rilevanti poiché l'istruzione HDL viene eseguita "istantaneamente".
W5VO,

Risposte:


10

Qualcuno può dirmi la differenza tra costrutto If-Else e costrutti dell'istruzione Case di un processo in VHDL in termini di come il codice viene inferito nel circuito RTL dallo strumento di sintesi?

Il if-elsif-elsecostrutto genera una rete di routing prioritaria:

schematico

simula questo circuito - Schema creato usando CircuitLab

Questo corrisponde a

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

Il casecostrutto, d'altra parte, genera un grande vecchio mux:

inserisci qui la descrizione dell'immagine

Questo corrisponde a

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

Ovviamente si tratta di progetti molto semplificati con una sola espressione di valore, che genera un risultato.

Prendi in considerazione il caso di più if-else nidificati e mescola le case case con il costrutto if-else all'interno di un processo.

Come sopra, puoi vedere come si anniderebbero / mescolerebbero.

Anche quando usare quale costrutto?

Poiché if-elseattribuisce priorità, dovrebbe essere utilizzato quando potrebbero verificarsi più condizioni di input. L'uso case, tra l'altro, è appropriato quando gli input si escludono a vicenda.


Comprendo che la case statement funziona solo per una singola condizione di input e if-else può funzionare per più condizioni di input. Ma entrambi i costrutti generano essenzialmente mux (in assenza di clk). Non è possibile che la sintesi logica possa ottimizzare un singolo input if-else su un singolo grande mux invece che catena di mux? Inoltre, cos'è una rete di routing prioritaria ... non è semplicemente questa catena di mux invece di 1 grande mux?
Nurabha,

Inoltre, quando abbiamo un processo sensibile a un clock, if-else può generare elementi sequenziali come registri, latch ecc. Un'istruzione case può anche generare una logica sequenziale?
Nurabha,

Sì, una rete di routing prioritaria è esattamente questo: una catena di mux. La natura del if-elsecostrutto, tuttavia, è dove sorge quella catena. La prima condizione deve non riuscire per la seconda condizione da testare. Questo non è il caso, per, il casecostrutto, ed è per questo che if-elseun'istruzione non può essere sintetizzata come un unico grande mux.
Angelo Stavrow,

1
E sì, anche caseun'istruzione può generare una logica sequenziale. Ho trovato "Real World VHDL" , una serie di diapositive di lezione dell'Università di Glasgow, che potrebbero esserti utili.
Angelo Stavrow,

Questo è un buon riferimento.
Nurabha,

4

In questo vecchio post sul blog , l'autore ha scritto e sintetizzato due versioni funzionalmente equivalenti del codice VHDL. Uno usa if-else, l'altro usa case. Il risultato:

Ho sintetizzato questo codice e ho ottenuto i risultati esatti. Anche lo schema RTL era esattamente lo stesso per entrambi i programmi.

E la sua conclusione:

Ciò dimostra che le istruzioni 'case' e 'if ... elsif ... else' sono entrambe ugualmente efficienti, ma se si desidera scrivere un codice chiaro, allora è meglio usare 'case'. 'Case' è molto utile quando il l'output dipende da un gran numero di condizioni, ma se il numero di condizioni è molto piccolo (2 o 3), è possibile utilizzare 'if..elseif..else'.

Ci sono anche dozzine di post su questo argomento su Stack Overflow per ogni lingua immaginabile. La conclusione è generalmente la stessa, che non ci sono differenze dal punto di vista delle prestazioni. Occasionalmente, se esiste un gran numero di casi, un compilatore può essere abbastanza intelligente da creare una tabella di ricerca che produca prestazioni leggermente migliori.

Un sintetizzatore VHDL potrebbe essere in grado di fare qualcosa di simile. Ma avresti comunque bisogno di un gran numero di casi nel qual caso (gioco di parole intenzionale) probabilmente vorrai usare comunque un'istruzione case in quanto fornisce una migliore leggibilità in cui vi è un gran numero di opzioni.

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.