Advertisement
kekellner

Lab10 - Ej02 - ALU y su Testbench

Nov 8th, 2021
1,944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module alu(
  2.     input [2:0] S,
  3.     input [3:0] A, B,
  4.     output [3:0] F,
  5.     input C, Z);
  6.  
  7.     reg [4:0] rF; // Tiene 1 bit adicional a propósito
  8.     reg rC, rZ;
  9.  
  10.     always @ (S or A or B)
  11.         case (S)
  12.             3'b000:// output F is port A.
  13.                 begin
  14.                     rF = 5'd0; // Borrar el reg rF por si el bit más significativo había quedado encendido
  15.                     rF = A;
  16.                 end
  17.  
  18.             3'b001:// compare port A & port B.
  19.                 begin
  20.                     rF = 5'd0;
  21.                     rF = A - B;
  22.                 end
  23.             3'b010: // output F is port B.
  24.                 begin
  25.                     rF = 5'd0;
  26.                     rF = B;;
  27.                 end
  28.             3'b011: // output F is A + B.
  29.                 begin
  30.                     rF = 5'd0;
  31.                     rF = A + B;
  32.                 end
  33.             3'b100: // output F is not(A and B) (NAND).
  34.                 begin
  35.                     rF = 5'd0;
  36.                     rF = ~(A & B);
  37.                 end
  38.             default: // default case => everything is ZERO
  39.                 rF = 5'd0;
  40.         endcase
  41.  
  42.     assign F = rF[3:0];
  43.     assign C = rF[4];
  44.     assign Z = rF[3:0] ? 1'b0 : 1'b1;
  45.  
  46. endmodule
  47.  
  48.  
  49. module testbench();
  50.     reg [2:0] S;
  51.     reg [3:0] A, B;
  52.     wire [3:0] F;
  53.     wire C, Z;
  54.  
  55.     alu DUT(.S(S), .A(A), .B(B), .F(F), .C(C), .Z(Z)); // DUT = Device Under Test
  56.  
  57.     initial
  58.     #100 $finish;
  59.  
  60.     initial
  61.         begin
  62.             $monitor("%d\t%d\t%d\t%d\t%d\t%d", S, A, B, F, C, Z); // Los valores están desplegados en decimal para facilitar la lectura
  63.  
  64.             // Test if A === B
  65.             #1
  66.             $display("\n\n------------ Test if A === B ------------");
  67.             $display("S:\tA:\tB:\tF:\tC:\tZ");
  68.             A = 4;
  69.             B = 4;
  70.             S = 0; $display("F = A");
  71.             #1 S = 1; $display("F = A - B / CPMX");
  72.             #1 S = 2; $display("F = B");
  73.             #1 S = 3; $display("F = A + B");
  74.             #1 S = 4; $display("F = not(A and B)");
  75.  
  76.  
  77.             // Test if A > B, no overflow
  78.             #1
  79.             $display("\n\n------- Test if A > B, no overflow ------");
  80.             $display("S:\tA:\tB:\tF:\tC:\tZ");
  81.             A = 4;
  82.             B = 2;
  83.             S = 0; $display("F = A");
  84.             #1 S = 1; $display("F = A - B / CPMX");
  85.             #1 S = 2; $display("F = B");
  86.             #1 S = 3; $display("F = A + B");
  87.             #1 S = 4; $display("F = not(A and B)");
  88.  
  89.  
  90.             // Test if A > B, with overflow
  91.             #1
  92.             $display("\n\n----- Test if A > B, with overflow ------");
  93.             $display("S:\tA:\tB:\tF:\tC:\tZ");
  94.             A = 10;
  95.             B = 9;
  96.             S = 0; $display("F = A");
  97.             #1 S = 1; $display("F = A - B / CPMX");
  98.             #1 S = 2; $display("F = B");
  99.             #1 S = 3; $display("F = A + B");
  100.             #1 S = 4; $display("F = not(A and B)");
  101.  
  102.  
  103.             // Test if A < B, no overflow
  104.             #1
  105.             $display("\n\n------- Test if A < B, no overflow ------");
  106.             $display("S:\tA:\tB:\tF:\tC:\tZ");
  107.             A = 2;
  108.             B = 4;
  109.             S = 0; $display("F = A");
  110.             #1 S = 1; $display("F = A - B / CPMX");
  111.             #1 S = 2; $display("F = B");
  112.             #1 S = 3; $display("F = A + B");
  113.             #1 S = 4; $display("F = not(A and B)");
  114.         end
  115. endmodule
  116.  
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement