Estoy intentando generar una puerta de entrada múltiple para la cual se pueden seleccionar las entradas cuando se elabora el diseño.
Déjame dar un ejemplo para (con suerte) aclarar esto:
module selectable_xor(input [7:0] in, output out);
parameter [7:0] SELECT = 8'b10010100;
// this should be generated for the default value of SELECT:
assign out = in[7] ^ in[4] ^ in[2]
endmodule
Entonces, out
debería ser la salida de una puerta XOR que tiene esos bits de in
como entrada para la cual se establece el bit correspondiente en SELECT
.
Estoy intentando algo como lo siguiente:
generate
genvar gen_i;
assign out = 1'b0;
for (gen_i = 0; gen_i < 8; gen_i = gen_i + 1)
if (SELECT[gen_i])
assign out = out ^ in[gen_i];
endgenerate
Pero esto produce valores no definidos para la señal out
.
¿Hay alguna buena manera de generar una puerta con un número variable de entradas en Verilog?
PS: Sobre el caso de uso: estoy intentando implementar un LFSR para el cual el polinomio es un parámetro.
Editar: El consenso parece ser que debo usar la siguiente expresión equivalente y confiar en el sintetizador para optimizarlo al circuito que quiero:
assign out = ^(in & SELECT);
Aunque sí confío en que cualquier sintetizador decente podrá hacer esto, me gustaría saber si Verilog puede codificar este circuito en realidad en una forma en que Verilog pueda hacerlo.
Considere que, en lugar de la puerta XOR anterior, quería codificar una puerta OR. La expresión equivalente es:
assign out = |(in & SELECT);
Ok, eso es prácticamente lo mismo que para la puerta XOR. Para una puerta AND, sin embargo, la expresión es diferente:
assign out = &(in | ~SELECT);
Mi punto es que para cada tipo de puerta, podría tener que encontrar una expresión equivalente diferente. Prefiero tener una forma general de codificar una puerta para la cual se puedan parametrizar las entradas porque entonces puedo usar la misma técnica para cualquier tipo de puerta.
Editar 2: Como mi recompensa vence mañana, editaré esta pregunta una vez más para eliminarla. Este es un comentario que dejé para explicar lo que quiero, que espero sea más visible en el cuerpo de la pregunta:
Lo que quiero no tiene nada que ver con los recursos físicos. Cuando hablo sobre "puertas" me refiero al concepto Verilog. Quiero ser capaz de definir Una puerta con entradas en función de algún parámetro. Más específicamente, yo desea que esta puerta tenga
in[i]
como entrada si se estableceSELECT[i]
. yo no desea una expresión equivalente que podría estar optimizada para la puerta que deseo. Como he dicho antes, esta expresión equivalente podría así como implementarse como 8 puertas AND y una puerta XOR de 8 entradas porque eso es lo que realmente está codificado . Espero que esto aclare las cosas :-)