3 / 37 · Concetto
Moduli, porte e istanze: collegamenti come contratti
Componi moduli combinatori con porte nominate e verifica driver unico e gerarchia.
Le lezioni sono gratuite. Iscriviti per salvare i progressi.
Un confine di modulo non è un confine di clock
Un modulo raggruppa porte e logica. Istanziarlo non crea automaticamente registro o ciclo. Moduli combinatori in serie restano un percorso combinatorio con ritardi fisici sommati. Un registro esplicito introduce memoria. Documenta direzione, larghezza, segno, driver e validità; le connessioni nominate evitano dipendenza dall'ordine posizionale.
module select_word #(parameter integer W = 8) (
input logic [W-1:0] a, b,
input logic select_b,
output logic [W-1:0] y
);
assign y = select_b ? b : a;
endmodule
module choose_and_increment (
input logic [7:0] a, b,
input logic select_b,
output logic [8:0] result
);
logic [7:0] chosen;
select_word #(.W(8)) select_u (
.a(a), .b(b), .select_b(select_b), .y(chosen)
);
assign result = {1'b0, chosen} + 9'd1;
endmoduleselect_word è il tipo di modulo, select_u il nome d'istanza. .a(a) collega la porta a del figlio al segnale a del padre. .W(8) configura l'elaborazione, non è ingresso dinamico.
Controllare entrambe le estremità
chosen è guidato solo da y del figlio ed è letto dal padre. Non assegnarlo anche in un altro processo; logic non autorizza conflitti di driver. result ha nove bit per 255+1=256 e allarga chosen prima della somma. a=255, b=9, select_b=0 dà 256; select_b=1 dà 10. Otto bit perderebbero la carry nel primo caso.
Gerarchia, file e top
Le definizioni possono stare insieme o separate, ma servono entrambe al compilatore. Il top è choose_and_increment; usare select_word cambia il confine verificato. Un file figlio assente riguarda l'elenco delle sorgenti, non dimostra errore logico. Collegamenti posizionali possono cambiare quando si modificano le porte. Un ingresso scollegato non è uno zero intenzionale: collega costanti o documenta uscite inutilizzate e rivedi le diagnosi. Segui dipendenze per evitare feedback combinatorio senza memoria; i moduli non interrompono il ciclo.
Esercizio: verificare indipendentemente la composizione
Per (a, b, select_b)=(0,255,0),(0,255,1),(255,0,0),(255,0,1), attendi 1,256,256,1. Percorri 256 valori selezionati con entrambi i select, lasciando diverso l'altro ingresso per rilevare inversioni. Il modello di riferimento sceglie a o b intero e aggiunge 1; confronta dopo stabilizzazione. Leggere chosen interno potrebbe condividere un errore di selezione. Aggiungi poi un registro d'uscita e definisci reset, validità e fronte d'ingresso corrispondente: il contratto temporale cambia anche con aritmetica identica.