SystemVerilog en ModelSim ignora negedge / posedge al monitorear

0

Al usar SystemVerilog y ModelSim, quiero monitorear los valores de algunas señales en mi diseño cuando el reloj está en su borde negativo. Extrañamente, el código responde en ambos bordes (positivo y negativo). Aquí hay un ejemplo de trabajo mínimo:

'timescale 1 ns / 100 ps
module tb_ex;
logic clk;

always
   begin
     clk = 1;
     #5;
     clk = 0;
     #5;
   end

always @(negedge clk)
   begin
      $monitor($time, "-> clk = %b", clk); 
   end 

endmodule 

que da como resultado

VSIM 40> run
#                    5-> clk = 0
#                   10-> clk = 1
#                   15-> clk = 0
#                   20-> clk = 1
#                   25-> clk = 0
#                   30-> clk = 1
#                   35-> clk = 0

Parecequealways@(negedgeclk)nosecumple.Inclusosipongounifdentrodeesebloque,

always@(negedgeclk)beginif(clk==0)begin$monitor($time,"-> clk = %b", clk); 
      end 
   end 

el resultado sigue siendo el mismo. ¿Cómo puedo hacer que funcione como se espera? Gracias!

    
pregunta fajar

1 respuesta

1

IEEE Std 1800-2012 § 21.2.3 Monitoreo continuo :

  

Cuando se invoca una tarea $monitor con uno o más argumentos, el simulador configura un mecanismo mediante el cual cada vez que una variable o una expresión en la lista de argumentos cambia de valor, con la excepción de $time , $stime o funciones de sistema $realtime : la lista de argumentos completa se muestra al final del paso de tiempo como si la tarea $display lo informara. Si dos o más argumentos cambian de valor al mismo tiempo, solo se produce una pantalla que muestra los nuevos valores.

     

Solo una lista de visualización $monitor puede estar activa al mismo tiempo; sin embargo, una nueva tarea $monitor con una nueva lista de visualización puede emitirse cualquier cantidad de veces durante la simulación.

En otras palabras, se ejecuta una tarea $monitor , crea un proceso único que muestra el valor de las variables enumeradas al final del paso de tiempo cuando alguna de esas variables cambia.

Para su propósito, debe usar $display o $strobe en lugar de $monitor .

$display imprime el valor inmediato de las variables, mientras que $strobe imprime el valor final en el paso del tiempo. Tampoco se inicia un proceso de activación automática como $monitor . Para obtener más información, consulte IEEE Std 1800-2012 § 21.2.1 La pantalla y la escritura tareas y § 21.2.2 Strobed Monitoring

    
respondido por el Greg

Lea otras preguntas en las etiquetas