//Testbench: jk-ff
//Autor: M. Erdem
//Mat.-Nr.: 8757524
//Datum: 21.02.2024

//Einstellung der Zeitskalierung
`timescale 1ns/1ps

module tb_jk_ff();

//Definition globaler Pins
reg clk;
reg res;
reg en;

//Definition der Ein- und Ausgänge vom dut
reg dut_j;
reg dut_k;

wire dut_q;

//Zählervariable i
integer i;

//Zu Beginn werden alle Pins auf 0 gesetzt.
initial begin
    clk = 1'b0;
    res = 1'b0;
    en = 1'b0;
    dut_j = 1'b0;
    dut_k = 1'b0;
end

//Starten eines Clocks mit 50 kHz
always begin
    #10 clk = ~clk;
end

//Ablauf des Testszenarios
initial begin

    //Warte 4 Clock-Zyklen
    for (i=0;i<4;i=i+1) begin
        @ (negedge clk);
    end
   
   //Reset ein und aus
    res = ~res;
    #40
    res = ~res;
    
    //Alle Schaltmöglichkeiten für JK probieren
    //Es wird immer auf eine neg. Flanke des clk gewartet, damit das Signal bei einer pos. Flanke bereits anliegt.
    @ (negedge clk);
    dut_j = 1'b0;
    dut_k = 1'b1;
    @ (negedge clk);
    dut_j = 1'b1;
    dut_k = 1'b0;
    @ (negedge clk);
    dut_j = 1'b1;
    dut_k = 1'b1;
    @ (negedge clk);
    dut_j = 1'b0;
    dut_k = 1'b0;
    
    //Enable Eingang aktivieren
    en = 1'b1;

    //Alle Schaltmöglichkeiten für JK probieren
    @ (negedge clk);
    dut_j = 1'b0;
    dut_k = 1'b1;
    @ (negedge clk);
    dut_j = 1'b1;
    dut_k = 1'b0;
    @ (negedge clk);
    dut_j = 1'b1;
    dut_k = 1'b1;
    @ (negedge clk);
    dut_j = 1'b0;
    dut_k = 1'b0;
    #20;
end

//Instanziierung des jk-ff
jk_ff dut(
    .R(res),
    .CLK(clk),
    .EN(en),
    .J(dut_j),
    .K(dut_k),
    .Q(dut_q)
);

endmodule