// Diseņo Multiplicador secuencial 4x4
// Descripcion: Testbench para multiplicador 4x4
// Rev: 4, 2022 

`timescale 1ns / 1ps

module test();

 reg [3:0] A; // Numero A
 reg [3:0] B; // Numero B
 reg xs;
 reg clk=0;
 reg reset=0;
 wire fin;
 wire [7:0] RESUL;

 reg [8:0] n;
 reg [3:0] a_vec[0:9]; // Vector de 10 elementos de prueba
 reg [3:0] b_vec[0:9]; // Vector de 10 elementos de prueba

 // Multiplicador
 
 multiplicador U_MUL(
   .A(A),.B(B),.clk(clk),
   .xs(xs),.reset(reset),
   .fin(fin),.RESUL(RESUL)
   );

 // Reloj 50 Mhz
 always
   #10 clk = ~clk;

 // Contenido del test

 initial 
   begin
    $dumpfile("test.vcd"); // Esto permite usar Icarus
    $dumpvars(0, test);
    
    /* Inicializacion del array de valores del test
       se puede leer desde un fichero de texto, pero
       por no complicarlo mas prefiero hacerlo asi
    */
    {a_vec[0],b_vec[0]}=8'h00; // 0*0
    {a_vec[1],b_vec[1]}=8'h22; // 2*2
    {a_vec[2],b_vec[2]}=8'h57; // 5*7
    {a_vec[3],b_vec[3]}=8'hAA; // 10*10
    {a_vec[4],b_vec[4]}=8'hFF; // 15*15
    {a_vec[5],b_vec[5]}=8'hA0; // 10*0
    {a_vec[6],b_vec[6]}=8'h0A; // 0*10
    {a_vec[7],b_vec[7]}=8'hB1; // 11*1  
    {a_vec[8],b_vec[8]}=8'h1B; // 1*11
    {a_vec[9],b_vec[9]}=8'h2D; // 2*13


    reset=1;
    xs=0;
    #25 reset=0;
    // Salida para gtkwaves, se puede simular con Icarus o con Xilinx
    for(n=0;n<10;n=n+1)
     begin
       A=a_vec[n];
       B=b_vec[n];
       @(negedge clk);
       xs=1; 
       @(negedge clk);
       xs=0;

       /* Lo mas correcto es esperar el final de fin con

          @(negedge fin); 

          pero si la unidad esta mal este test se bloquea
          por lo que es preferible esperar 500ns
       */
       #500;
       if((RESUL)!=A*B)
        $display("Error en el resultado de la multiplicacion %x x %x",A,B);
      end
     $finish;
   end
endmodule



