3 / 37 · Concepto
Módulos, puertos e instancias: conexiones como contratos
Compón módulos con conexiones por nombre, comprobando controlador único y límites de jerarquía.
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
Un límite de módulo no es un límite de reloj
Un módulo agrupa puertos y lógica. Instanciarlo no crea automáticamente un registro ni añade un ciclo. Dos módulos combinacionales en serie siguen formando una ruta combinacional, con retardos físicos acumulados. El registro con reloj es un límite explícito de almacenamiento. Documenta dirección, anchura, signo, controlador y validez; los nombres evitan memorizar posiciones.
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 es el tipo de módulo y select_u el nombre de instancia. .a(a) conecta el puerto hijo a con la señal padre a. .W(8) se fija durante elaboración, no viaja por un puerto en tiempo de ejecución.
Revisa ambos extremos
chosen tiene un solo controlador: y del hijo; el padre lo lee. No lo asignes también en otro procedimiento. logic no permite conflictos. result tiene nueve bits para representar 255+1=256; la concatenación extiende chosen antes de sumar. Con a=255, b=9, select_b=0 produce 256 y con select_b=1 produce 10. Ocho bits perderían el acarreo del primer caso.
Jerarquía, archivos y top
Las definiciones pueden compartir archivo o estar separadas, pero el compilador necesita ambas. El top es choose_and_increment; seleccionar select_word comprueba otra frontera. Un archivo hijo ausente es un fallo de lista de fuentes, no prueba de lógica incorrecta. Las conexiones posicionales pueden cambiar silenciosamente al editar puertos. Una entrada sin conectar no equivale a 0: conecta constantes o documenta salidas sin usar y revisa diagnósticos. Sigue dependencias a través de la jerarquía para evitar lazos combinacionales sin almacenamiento; los módulos no los cortan.
Práctica: verifica la composición independientemente
Para (a, b, select_b)=(0,255,0),(0,255,1),(255,0,0),(255,0,1), espera 1,256,256,1. Recorre los 256 valores seleccionados con ambos select y mantén diferente la entrada no seleccionada. Así una selección invertida no se oculta. El modelo elige a o b como entero, suma uno y compara tras estabilizarse la ruta; no leas chosen interno, pues compartirías una selección errónea. Después añade un registro de salida y define reinicio, validez y flanco de entrada correspondiente: cambia el contrato temporal aunque la suma sea idéntica.