10 / 37 · Concetto
RTL combinatorio e assegnazioni complete
Esprimere la stessa funzione con operatore condizionale e always_comb e trovare omissioni che generano latch.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
L'uscita combinatoria dipende dagli ingressi attuali
La forma diretta del MUXMultiplexer Circuito combinatorio che collega un ingresso all’uscita secondo la selezione. Va specificata la corrispondenza fra bit di selezione e ingressi. Approfondisci è assign y = sel ? b : a;. Per calcolare più uscite insieme si può usare always_comb.
always_comb begin
y = a;
if (sel) y = b;
endL'assegnazione predefinita iniziale definisce anche sel=0. Lasciando solo if (sel) y = b;, con sel=0 y dovrebbe conservare il passato e non sarebbe una funzione puramente combinatoria. Non ignorate gli avvisi dello strumento né fidatevi della sola parola always_comb.
Porre y=a per default e scegliere b solo con sel=1 realizza la stessa funzione 0/1 del circuito seguente. Anche con sel=0 l'uscita deve essere definita.
y = sel ? b : a
Non leggere la sintassi procedurale solo come software
Nei blocchi combinatori si usa normalmente = bloccante per i risultati intermedi. Se una formula successiva legge un risultato appena assegnato, tale dipendenza forma un cammino combinatorio. Distinguetelo da <= non bloccanteNonblocking Assegnazione RTL sequenziale con <=. Valuta il membro destro e pianifica l’aggiornamento, permettendo ai registri dello stesso fronte di usare lo stato precedente. Approfondisci per aggiornare registriRegistro Memorizza uno stato di più bit. I registri sincroni del corso acquisiscono gli ingressi specificati al fronte di clock. Approfondisci.
always_comb begin
next_y = sel ? b : a;
inverted_y = ~next_y;
endUn'altra regola fondamentale è un solo driver per uscita. Anche dividendo il progetto in moduli, tracciate chi pilota esclusivamente ogni segnale.
Allineare prima larghezze diverse
Scegliendo fra otto e dodici bit, esplicitate larghezza di y ed estensione del segno. Definite i campi d'ingresso nel progetto, invece di scoprire casualmente in simulazione che l'estensione implicita coincide con l'intenzione. Con sel=X l'operatore condizionale può differire da un semplice if: i risultati a due stati del corso non si generalizzano all'intero modello a quattro stati.
Prova tu
In always_comb compare solo if(en) y=d;. Come ottenere logica combinatoria che dia 0 senza enable?
Leggi la spiegazione
Assegnate prima y=0 e sovrascrivete con d se en è attivo, oppure usate una forma di assign y = en ? d : 0 con larghezze esplicite. Mantenere il valore con en=0 è una specifica separata di registro/latch, diversa dall’uscita 0.