1
0

test_ALU.v 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. `timescale 1ns / 1ps
  2. module test_ALU;
  3. // Inputs
  4. reg [31:0] a;
  5. reg [31:0] b;
  6. reg [3:0] opcode;
  7. // Outputs
  8. wire [31:0] y;
  9. // Expected output
  10. reg [31:0] expected_y;
  11. // Instantiate the ALU
  12. ALU uut (
  13. .a(a),
  14. .b(b),
  15. .opcode(opcode),
  16. .y(y)
  17. );
  18. initial begin
  19. // Initialize Inputs
  20. a = 0;
  21. b = 0;
  22. opcode = 0;
  23. expected_y = 0;
  24. // Wait 100 ns for global reset to finish
  25. #100;
  26. // Test OR
  27. a = 32'hA5A5A5A5;
  28. b = 32'h5A5A5A5A;
  29. opcode = 4'b0000;
  30. expected_y = a | b;
  31. #10;
  32. if (y !== expected_y) $display("Test OR failed: y = %h, expected = %h", y, expected_y);
  33. // Test AND
  34. a = 32'hA5A5A5A5;
  35. b = 32'h5A5A5A5A;
  36. opcode = 4'b0001;
  37. expected_y = a & b;
  38. #10;
  39. if (y !== expected_y) $display("Test AND failed: y = %h, expected = %h", y, expected_y);
  40. // Test XOR
  41. a = 32'hA5A5A5A5;
  42. b = 32'h5A5A5A5A;
  43. opcode = 4'b0010;
  44. expected_y = a ^ b;
  45. #10;
  46. if (y !== expected_y) $display("Test XOR failed: y = %h, expected = %h", y, expected_y);
  47. // Test ADD
  48. a = 32'h00000001;
  49. b = 32'h00000001;
  50. opcode = 4'b0011;
  51. expected_y = a + b;
  52. #10;
  53. if (y !== expected_y) $display("Test ADD failed: y = %h, expected = %h", y, expected_y);
  54. // Test SUB
  55. a = 32'h00000002;
  56. b = 32'h00000001;
  57. opcode = 4'b0100;
  58. expected_y = a - b;
  59. #10;
  60. if (y !== expected_y) $display("Test SUB failed: y = %h, expected = %h", y, expected_y);
  61. // Test SHIFTL
  62. a = 32'h00000001;
  63. b = 32'h00000002;
  64. opcode = 4'b0101;
  65. expected_y = a << b;
  66. #10;
  67. if (y !== expected_y) $display("Test SHIFTL failed: y = %h, expected = %h", y, expected_y);
  68. // Test SHIFTR
  69. a = 32'h00000004;
  70. b = 32'h00000001;
  71. opcode = 4'b0110;
  72. expected_y = a >> b;
  73. #10;
  74. if (y !== expected_y) $display("Test SHIFTR failed: y = %h, expected = %h", y, expected_y);
  75. // Test NOTA
  76. a = 32'hFFFFFFFF;
  77. b = 32'h00000000;
  78. opcode = 4'b0111;
  79. expected_y = ~a;
  80. #10;
  81. if (y !== expected_y) $display("Test NOTA failed: y = %h, expected = %h", y, expected_y);
  82. // Test MULTS
  83. a = 32'h00000002;
  84. b = 32'h00000003;
  85. opcode = 4'b1000;
  86. expected_y = $signed(a) * $signed(b);
  87. #10;
  88. if (y !== expected_y) $display("Test MULTS failed: y = %h, expected = %h", y, expected_y);
  89. // Test MULTU
  90. a = 32'h00000002;
  91. b = 32'h00000003;
  92. opcode = 4'b1009;
  93. expected_y = a * b;
  94. #10;
  95. if (y !== expected_y) $display("Test MULTU failed: y = %h, expected = %h", y, expected_y);
  96. // Test SLT
  97. a = 32'h00000001;
  98. b = 32'h00000002;
  99. opcode = 4'b1010;
  100. expected_y = ($signed(a) < $signed(b)) ? 1 : 0;
  101. #10;
  102. if (y !== expected_y) $display("Test SLT failed: y = %h, expected = %h", y, expected_y);
  103. // Test SLTU
  104. a = 32'h00000001;
  105. b = 32'h00000002;
  106. opcode = 4'b1011;
  107. expected_y = (a < b) ? 1 : 0;
  108. #10;
  109. if (y !== expected_y) $display("Test SLTU failed: y = %h, expected = %h", y, expected_y);
  110. // Test LOAD
  111. a = 32'h00000000;
  112. b = 32'h12345678;
  113. opcode = 4'b1100;
  114. expected_y = b;
  115. #10;
  116. if (y !== expected_y) $display("Test LOAD failed: y = %h, expected = %h", y, expected_y);
  117. // Test LOADHI
  118. a = 32'h00001234;
  119. b = 32'h56780000;
  120. opcode = 4'b1101;
  121. expected_y = a | b;
  122. #10;
  123. if (y !== expected_y) $display("Test LOADHI failed: y = %h, expected = %h", y, expected_y);
  124. // Test SHIFTRS
  125. a = 32'h80000000;
  126. b = 32'h00000001;
  127. opcode = 4'b1110;
  128. expected_y = $signed(a) >>> b;
  129. #10;
  130. if (y !== expected_y) $display("Test SHIFTRS failed: y = %h, expected = %h", y, expected_y);
  131. // Test FPMULTS
  132. a = 32'h00010000; // 1.0 in 16.16 fixed point
  133. b = 32'h00020000; // 2.0 in 16.16 fixed point
  134. opcode = 4'b1111;
  135. expected_y = (a * b) >> 16;
  136. #10;
  137. if (y !== expected_y) $display("Test FPMULTS failed: y = %h, expected = %h", y, expected_y);
  138. // Finish simulation
  139. $finish;
  140. end
  141. endmodule