`timescale 1ns/1ps
module uart_loopback_tb;

   // CLK = 12 MHz
	parameter   CLK_PERIOD_NS  = 83;

   // BAUD = 9600
   parameter   SAMPLE_TB      = 104167;     // SAMPLE_TB   = 1e9       / BAUDRATE
	
	reg	i_clk;
	reg	i_nrst;
   reg   i_rx;
   wire  o_tx;

	uart_loopback uart_loopback(
      .i_clk   (i_clk   ),
      .i_nrst  (i_nrst  ),
      .i_rx    (i_rx    ),
      .o_tx    (o_tx    )
	);

	initial begin
		while(1) begin
			#(CLK_PERIOD_NS/2) i_clk = 0;
			#(CLK_PERIOD_NS/2) i_clk = 1;
		end
	end

	initial begin
		$dumpfile("uart_loopback.vcd");
	   $dumpvars(0,uart_loopback_tb);	
		$display("                  TIME    nRst");		$monitor("%tps       %d",$time,i_nrst);
	end
   
   task uart_send;
      input [7:0] send;
      integer i;
      begin
         i_rx = 0;
         for(i=0;i<=7;i=i+1) begin
            #SAMPLE_TB  i_rx = send[i];
         end
         #SAMPLE_TB  i_rx = 1;
      end
   endtask

   integer i;

	initial begin
                  i_rx     = 1;
	   #100        i_nrst   = 1;
		#170		   i_nrst   = 0;
		#170		   i_nrst   = 1;	
      for(i=0;i<256;i=i+1) begin
         #100000 uart_send(i); 
      end      
      $finish;
	end

endmodule