el registro de salida permanece x en la forma de onda incluso cuando cambia el reloj?

0

Estoy usando ISE para escribir mi primer código de verilog.

escribí un contador:

'timescale 1ns / 1ps

module my_counter( input clk , output reg [3:0] out);

 always @(posedge clk) begin

 out <= out+1 ;

 end

 endmodule

luego usé ISE para hacer un banco de pruebas (¡añadí clk!):

'timescale 1ns / 1ps

module mycounter_test;

// Inputs
reg clk;

// Outputs
wire [3:0] out;

// Instantiate the Unit Under Test (UUT)
my_counter uut (
    .clk(clk), 
    .out(out)
);

initial begin
    // Initialize Inputs
    clk = 0;

    // Wait 100 ns for global reset to finish
    #100;

    // Add stimulus here

end

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

endmodule

ahora cuando uso el modo de simulación ISE.

la forma de onda es como:

paraobtenerlaformadeondacorrecta,primeroestablezcolahora.

luegohagaclicenelbotón"reiniciar" y luego "ejecutar durante el tiempo especificado en la barra de herramientas".

¿Por qué la salida es todavía X después de varios ciclos del reloj?

¿Tiene algo que ver con el comentario "Espere 100 ns para que finalice el reinicio global"

(También intenté ejecutar el contador durante 120 ns, pero obtuve el mismo resultado)

    
pregunta kiyarash

2 respuestas

1

El valor inicial (en el momento 0) del tipo reg en Verilog es X. En la primera posición de clk, se agrega 1 a X, lo que da como resultado X. Por lo tanto, la señal out permanece en X A lo largo de la simulación. Tienes dos opciones:

  1. Inicialice out en un bloque initial (a 0, por ejemplo), o

  2. Use una señal de reinicio para inicializar out

respondido por el toolic
0

Aquí hay algo básico que me gustaría compartir es que el valor inicial del registro de contador no es cero por defecto, es xx, ya que el contador en sí mismo está formado por flipflops que tienen tres estados 0, 1 y x. Para que su código funcione, debe agregar una señal de restablecimiento que restablecería el registro del contador y lo establecería en el valor inicial como cero

modifique el diseño de acuerdo con este fragmento de código: -

    ////////////////////Code snippet start
    always @ (posedge clk or posedge rst) 
    begin
      if(rst)
        counter <= 4'd0;
      else
        counter <= 4'd1;
    end
    /////////////////Code snippet end

modifique el banco de pruebas según este fragmento de código

    //////////////////Code snippet start
    initial begin
    clk = 0;
    rst = 0;
    #10
    rst = 1;
    #17
    rst = 0;
    end
    //Code snippet end

también es una buena práctica generar el reloj como se muestra a continuación en un bloque de inicio inicial separado

    //////////Code Snippet start
    initial begin
    always #5 clk = ~ clk;
    end
    ///////////Code Snippet end
    
respondido por el K.Rami

Lea otras preguntas en las etiquetas