Quiero deshabilitar un bloque utilizando una condición if fuera de ese bloque. Estoy recibiendo un error:
UNEXPECTED DISABLE EXPECTING ASSERT
Quiero deshabilitar un bloque utilizando una condición if fuera de ese bloque. Estoy recibiendo un error:
UNEXPECTED DISABLE EXPECTING ASSERT
Respuesta corta: no, especialmente si quieres un Verilog sintetizable.
Respuesta larga: 'deshabilitar' es para tareas y bloques con nombre, no módulos. Tiene una semántica ligeramente sorprendente: consulte enlace ; Algo similar a 'romper'. No es un verilog muy idiomático.
Si estás tratando de construir un bloque lógico computacional normal que tenga una señal de habilitación, envuelve toda tu lógica en if (enabled) begin ... end
.
Un uso común para disable
en su verilog testbench podría ser:
fork : wait_or_timeout
begin : timeout
#10_000; //#10ms
$display("Timeout");
$finish();
disable wait_for_signal;
end
begin :wait_for_signal
@(posedge SIGNAL);
disable timeout;
end
join
Aquí comenzamos 2 procesos paralelos, el simulador no ejecutará ningún otro código hasta que ambos se completen. Al usar deshabilitar, el primero en completar desactiva el otro.
Para mejorar la modularidad y la reutilización del código, se pueden utilizar generar declaraciones . Sin embargo, estas son constantes de tiempo de compilación, no deshabilitan ni apagan el hardware, hacen que el hardware exista o no exista en función de las opciones de configuración constante antes de ejecutar su sim o síntesis.
Para las técnicas de ahorro de energía, el uso de habilita en sus flip-flops con opciones de selección automática del reloj para la síntesis puede resultar en un buen ahorro de energía.
always @(posedge clk or negedge reset_n) begin
if (~reset_n) begin
//reset
end
else if (enabled) begin
//<= nextvalue;
end
// no final else, if not enabled hold value
// this allows clk to be stopped
end
Lea otras preguntas en las etiquetas verilog