Verilog: señal de entrada como parámetro
Frecuentes
Visto 2,197 equipos
1
Mi pregunta puede ser rudamental, no estoy seguro de si una señal de entrada podría usarse como parámetro en verilog.
Mi pregunta se basa en la necesidad de seleccionar una de las dos instancias que están disponibles según la señal de entrada. Esta señal sería post síntesis estática.
module DUT (signal1 ....)
input signal1; // this signal to be used as parameter
`ifdef signal1
X U1
`else
Y U1
`endif
endmodule
Aquí X e Y son dos módulos diferentes. También hay sugerencias alternativas disponibles para implementar lo mismo.
Saludos
Explicación adicional:
Quiero solo uno de los dos bloques de hardware después de la síntesis. Quiero una sintaxis que permita la configuración del hardware controlada por una señal, que va a tener un valor estático. Signal1 estaría conectado a 0 o 1 en alguna otra parte del diseño. Sé que este parece ser un método incorrecto de hacer las cosas, pero es un diseño de varios módulos y no tengo control sobre el otro bloque.
3 Respuestas
3
Si realmente quiere evitar el uso de parámetros y quiere usar señales, dependiendo de su herramienta de síntesis, puede puede consigue lo que quieres
Debe asegurarse de que la señal 1 fuerce la salida del módulo que no desea no me importa. Si sus herramientas de síntesis son lo suficientemente inteligentes (que la mayoría de ellas lo son), optimizará ese módulo.
Aquí hay un ejemplo:
module DUT (signal1, out....)
input signal1; // this signal to be used as parameter
X U1 (in,out_x)
Y U2 (in,out_y)
assign out = (signal1) ? out_x : out_y;
endmodule
Si durante la elaboración, la herramienta de síntesis ve que la señal1 siempre es 1, puede optimizar el módulo Y.
Como otros mencionaron, esta no es una práctica común/recomendada.
Además, no puede lograr esto usando `ifdef, porque se procesan en tiempo de compilación. El valor de las señales y el hecho de que si una señal es estáticamente 1 o 0 se procesa en el momento de la elaboración.
Respondido 12 Feb 14, 22:02
1
Como sugiere Morgan, puedes usar parameters
con un generate
bloquear para hacer lo que quieras en su lugar. Ejemplo de trabajo aquí: http://www.edaplayground.com/x/2w2
module X();
initial begin
$display("%m is module X!");
end
endmodule
module Y();
initial begin
$display("%m is module Y!");
end
endmodule
module top();
parameter USE_X_NOT_Y = 1'b0;
generate
if(USE_X_NOT_Y == 1'b1) begin
X U1();
end
else begin
Y U1();
end
endgenerate
endmodule
Luego, cuando crea una instancia de este módulo, puede anular el parámetro para obtener el comportamiento que desea:
top #(.USE_X_NOT_Y(1)) top_inst ();
Respondido 12 Feb 14, 20:02
0
No. Las instancias son bloques de hardware implícitos. No puedes crear y destruir hardware sobre la marcha, a menos que seas un robot malvado.
Lo que puede hacer es usar una señal de entrada como habilitar/deshabilitar ambos bloques para que solo 1 esté activo, luego OR
los resultados juntos o implican un mux, para seleccionar la salida que desea.
module DUT (
input signal1, //sel_x
output tx
);
reg x_tx;
reg y_tx;
X U1(.en(signal1), .out(x_tx) ... );
Y U1(.en(~signal1), .out(y_tx) ... );
assign tx = (signal1) ? x_tx : y_tx ;
endmodule
Respondido 12 Feb 14, 08:02
Morgan, creo que puedo haber explicado mal el requisito. Quiero solo uno de los dos bloques de hardware después de la síntesis. Quiero una sintaxis que pueda configurarse mediante una señal, que tendrá un valor estático. Signal1 estaría conectado a 0 o 1 en alguna otra parte del diseño. - user1495523
Entonces, ¿no puede usar un parámetro? Las señales solo son válidas en tiempo de ejecución, por lo que puede usarlas para esto. Debe haber alguna lógica estática que se utilice para definir signal1
, solo necesita definirse como un parámetro en su lugar. - Morgan
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas verilog or haz tu propia pregunta.
No puede cambiar el hardware en tiempo de ejecución. Su pregunta sugiere que tiene un concepto erróneo fundamental acerca de cómo verilog y HDL en general se utilizan para diseñar hardware. - user1619508
Aclaró esto: la señal 1 será una constante, por lo que quiere que el sintetizador reconozca que es constante y eligió el módulo para instanciar en función de esto. - nguthrie