Altifigence Academy

10 / 37 · Concetto

RTL combinatorio e assegnazioni complete

Esprimere la stessa funzione con operatore condizionale e always_comb e trovare omissioni che generano latch.

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.

SystemVerilog
always_comb begin
  y = a;
  if (sel) y = b;
end

L'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.

Due percorsi coperti dall’assegnazione predefinita

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.

SystemVerilog
always_comb begin
  next_y = sel ? b : a;
  inverted_y = ~next_y;
end

Un'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.

La scelta vale per questo browser. Puoi modificarla in qualsiasi momento dal piè di pagina.