Altifigence Academy

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.

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.

SystemVerilog
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;
endmodule

select_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.

Tu elección se aplica a este navegador. Puedes cambiarla en el pie de página.