// Behavioral implementation of MIPS ALU module alu (ALUctl,A,B,ALUOut,Zero,Overflow); input [3:0] ALUctl; input [31:0] A,B; output reg [31:0] ALUOut; output Zero, Overflow; always @(ALUctl, A, B) // reevaluate if these change case (ALUctl) 4'b0000: ALUOut <= A & B; 4'b0001: ALUOut <= A | B; 4'b0010: ALUOut <= A + B; 4'b0110: ALUOut <= A - B; 4'b0111: ALUOut <= A < B ? 1:0; 4'b1100: ALUOut <= ~A & ~B; 4'b1101: ALUOut <= ~A | ~B; endcase assign Zero = (ALUOut==0); // Zero is true if ALUOut is 0 assign Overflow = (A[31]==0 && B[31]==0 && ALUOut[31]==1 || A[31]==1 && B[31]==1 && ALUOut[31]==0); endmodule // Test module module test (); reg signed [31:0] a, b; reg [3:0] op; wire signed [31:0] result; wire zero, overflow; alu alu1 (op,a,b,result,zero,overflow); initial begin $display ("Op A B Result Zero Overflow"); $monitor ("%b %h (%d) %h (%d) %h (%d) %b %b",op,a,a,b,b,result,result,zero,overflow); op = 4'b0000; a = 32'hF0F0F0F0; b = 32'h0F0F0F0F; // AND #1 op = 4'b0001; a = 32'hF0F0F0F0; b = 32'h0F0F0F0F; // OR #1 op = 4'b0010; a = 55; b = 66; // ADD #1 op = 4'b0010; a = -15; b = 16; // ADD #1 op = 4'b0010; a = 32'h7FFFFFFF; b = 1; // ADD #1 op = 4'b0110; a = 55; b = 16; // SUB #1 op = 4'b0110; a = 16; b = -1; // SUB #1 op = 4'b0110; a = -1; b = 32'h80000000; // SUB #1 op = 4'b0111; a = 55; b = 16; // SLT #1 op = 4'b0111; a = -2; b = -1; // SLT #1 op = 4'b0111; a = 15; b = 16; // SLT #1 op = 4'b1100; a = 32'hF0F0F0F0; b = 32'h0F0F0F0F; // NOR #1 op = 4'b1101; a = 32'hF0F0F0F0; b = 32'h0F0F0F0F; // NAND end endmodule /* Output Op A B Result Zero Overflow 0000 f0f0f0f0 ( -252645136) 0f0f0f0f ( 252645135) 00000000 ( 0) 1 0 0001 f0f0f0f0 ( -252645136) 0f0f0f0f ( 252645135) ffffffff ( -1) 0 0 0010 00000037 ( 55) 00000042 ( 66) 00000079 ( 121) 0 0 0010 fffffff1 ( -15) 00000010 ( 16) 00000001 ( 1) 0 0 0010 7fffffff ( 2147483647) 00000001 ( 1) 80000000 (-2147483648) 0 1 0110 00000037 ( 55) 00000010 ( 16) 00000027 ( 39) 0 0 0110 00000010 ( 16) ffffffff ( -1) 00000011 ( 17) 0 0 0110 ffffffff ( -1) 80000000 (-2147483648) 7fffffff ( 2147483647) 0 1 0111 00000037 ( 55) 00000010 ( 16) 00000000 ( 0) 1 0 0111 fffffffe ( -2) ffffffff ( -1) 00000001 ( 1) 0 1 0111 0000000f ( 15) 00000010 ( 16) 00000001 ( 1) 0 0 1100 f0f0f0f0 ( -252645136) 0f0f0f0f ( 252645135) 00000000 ( 0) 1 0 1101 f0f0f0f0 ( -252645136) 0f0f0f0f ( 252645135) ffffffff ( -1) 0 0 */