Solo puede tener una instancia del "Módulo de nivel superior" en un diseño, es esta única instancia de módulo la que será su hardware. Lo mismo ocurre con la simulación: tiene un único módulo de banco de pruebas que su herramienta de simulación utiliza para construir la jerarquía.
Si lo piensas bien, ¿cómo sabrían las herramientas de síntesis qué puerto es cuál si pudieras solicitar varias instancias? Tendría varios puertos llamados A
, varios llamados B
, etc. Si no están conectados al mismo pin, necesitaría alguna forma de diferenciarlos.
Si desea que varias instancias de su módulo formen el nivel superior, deberá crear un contenedor que ejemplifique la cantidad de instancias que necesita. La forma más sencilla de hacer esto si desea poder cambiar fácilmente el número de instancias y no desea volver a declarar muchos puertos, es utilizar la generación de bucles:
test Sen1(A,B,C,D,E,F,CLK);
test Sen2(A,B,C,D,E,F,CLK);
test Sen3(A,B,C,D,E,F,CLK);
podría convertirse en:
module #(
parameter instances = 3 //Change this value to set number of instances
) SenTop (
... [instances-1:0] A,
... [instances-1:0] B,
...
... [instances-1:0] F,
input CLK,
);
genvar i;
generate for (i = 0; i < instances; i=i+1) begin : inst_loop
test Sen(A[i],B[i],C[i],D[i],E[i],F[i],CLK);
end endgenerate
end
También puede conectar el mismo pin input
o inout
a varias instancias si es necesario (por ejemplo, CLK
podría ser de un solo bit y conectarse a todas las instancias).
Si alguno de los pines en la instancia del módulo es multi-bit, tendría que tener algo de desempaquetado en su bucle. Por ejemplo, si digamos que A
era un bus de 2 bits en el submódulo, podría tener algo como:
module #(
parameter instances = 3 //Change this value to set number of instances
) SenTop (
... [instances*2-1:0] A,
... [instances -1:0] B,
...
input CLK,
);
genvar i;
generate for (i = 0; i < instances; i=i+1) begin : inst_loop
localparam j = 2 * i;
test Sen(A[j+:2],B[i], ... ,CLK);
end endgenerate
end