Hay presencia de ruido (Alta frecuencia) en la simulación (post-síntesis y post-implementación)

Estoy usando verilog en la herramienta de diseño VIVADO (XILINX), en la simulación (possíntesis y posimplementación) de mi diseño, recibo un ruido ( alta frecuencia , incluso mayor que el reloj real de la placa) cerca de ambos bordes de mi derivado ( lento) reloj. ¿Alguien puede decirme cómo eliminar este ruido no deseado?

la instantánea de la simulación de la siguiente manera:ingrese la descripción de la imagen aquí

El código verilog para esto de la siguiente manera:

module counter(
input clk,            //Actual clock(100Mhz ->Artix-7)
input rst,
output reg[7:0] out, 
output reg nc         //New clock(slow)     
);

reg [25:0]temp;
reg slow;

             initial
                       begin
                           temp=26'd0;
                           slow=1'b0;
                           out=0;
                       end

    always@(posedge clk)
        temp<=temp+1;
    always @(temp)
    begin
       if(temp==26'b10111110101111000010000000)//clock divided by 50Mhz
        slow<=slow+1;
     end

     always @(slow)
             begin
               nc<=slow;
             end 

    always @(posedge slow)
    begin
      if(rst==1'b1)
       out<=0;
    else 

       out<=out+1;
     end
 endmodule
¿Tienes un código para nosotros?
Es probable que tenga un bucle combinacional, pero podría haber otras cosas como la meta inestabilidad de la violación del tiempo de configuración/espera. Es difícil decir qué está mal o cómo solucionarlo sin ver el código.
He agregado el código verilog arriba. Además, no hubo holgura negativa (infracciones de tiempo de configuración/retención) en el informe de resumen de tiempo.

Respuestas (1)

Su problema radica en las siguientes líneas de código:

always @(temp)
begin
   if(temp==26'b10111110101111000010000000)//clock divided by 50Mhz
    slow<=slow+1;
 end

Lo cual es equivalente a:

assign slow = (temp==...) ? slow + 1 : slow;

Eso hará slowque se incremente de forma asincrónica tan rápido como lo permita el paso de tiempo de simulación una vez que el tempvalor alcance su valor de comparación.

En un bloque siempre combinacional (es decir, sin sensibilidad de borde), nunca debe asignar a la variable x(o el nombre que sea) un valor que se deriva de x(por ejemplo x <= x + 1), ya que esto es, por definición, un bucle combinacional.

Su lógica para la división del reloj también es defectuosa porque no restablece el valor de tempa cero cuando ocurre la comparación, lo que significa que el valor de la división es básicamente el rango completo de un contador de 26 bits.

Lo siguiente funcionará sincrónicamente y se restablecerá tempen el momento correcto:

always@(posedge clk)
    if(temp==26'b10111110101111000001111111) begin //clock divided by 50Mhz
        slow<=slow+1;
        temp<=1'b0
    end else begin
        temp<=temp+1;
    end
end