`timescale 1ns / 1ps

module down_counter_tb;

    // Parameter für die Simulation
    parameter CLOCK_DIVIDER = 5;

    // Registrier und Drähte für die Testbench
    reg CLK;
    reg RESETn;
    wire [$clog2(CLOCK_DIVIDER)-1:0] Q;
    wire SYNC;

    // Erzeugung des Taktsignals
    initial begin
        CLK = 0;
        forever #10 CLK = ~CLK; // 50 MHz Taktfrequenz
    end

    // Testsequenz
    initial begin
        // Anfangszustand
        RESETn = 1;
        @(posedge CLK);
        @(negedge CLK);
        RESETn = 0; // Reset aktivieren
        @(posedge CLK);
        @(negedge CLK);
        RESETn = 1; // Reset deaktivieren

        // Warte genug Zeit, um den Zähler vollständig herunterzuzählen
        #((CLOCK_DIVIDER + 1) * 20);

        // Reset erneut aktivieren und deaktivieren, um die Reaktion zu prüfen
        @(posedge CLK);
        @(negedge CLK);
        RESETn = 0;
        @(posedge CLK);
        @(negedge CLK);
        RESETn = 1;

        // Simulation für weitere Zählzyklen fortsetzen
        #100;
    end

     // Instanziierung des down_counter Moduls
    down_counter #(
        .CLOCK_DIVIDER(CLOCK_DIVIDER)
    ) uut (
        .CLK(CLK),
        .RESETn(RESETn),
        .Q(Q),
        .SYNC(SYNC)
    );

endmodule
