`timescale 1ns / 1ps

module tb_top_uart_rx_tx;

    parameter CLK_FREQ = 27_000_000;
    parameter BAUD_RATE = 115200;

    // Signaux
    reg clk = 0;
    reg start = 0;
    reg [7:0] data_in = 0;
    wire [7:0] data_out;
    wire valid;
    wire tx;
    wire rx;  // On connecte tx directement à rx pour le test

    // Instance du module à tester
    top_uart_rx_tx #(
        .CLK_FREQ(CLK_FREQ),
        .BAUD_RATE(BAUD_RATE)
    ) uut (
        .clk(clk),
        .start(start),
        .data_in(data_in),
        .rx(rx),
        .data_out(data_out),
        .valid(valid),
        .tx(tx)
    );

    // Boucle le tx sur rx
    assign rx = tx;

    // Clock à 50 MHz (20 ns période)
    always #10 clk = ~clk;

    // Simulation principale
    initial begin
        $display("Début de la simulation");
        $dumpfile("uart_loopback.vcd"); // Pour GTKWave
        $dumpvars(0, tb_top_uart_rx_tx);

        // Attendre un peu
        #(20 * 10);

        // Envoi d'une valeur
        data_in = 8'hA5;  // Exemple de data
        start = 1;
        #20;
        start = 0;

        // Attendre la réception (valeur valid = 1)
        wait(valid == 1);

        // Affichage des résultats
        $display("Data envoyee : 0x%h", data_in);
        $display("Data recue   : 0x%h", data_out);

        if (data_out == data_in)
            $display("Test reussi !");
        else
            $display("Test echoue...");

        // Fin de simulation
        #(20 * 10);
        $finish;
    end

endmodule