# Lab 10 and 11 ``` module full_adder( input a, b, cin, output sum, cout ); assign {sum, cout} = {a^b^cin, ((a & b) | (b & cin) | (a & cin))}; endmodule module ripple_carry_adder_subtractor #(parameter SIZE = 4) ( input [SIZE-1:0] A, B, input CTRL, output [SIZE-1:0] S, Cout); bit [SIZE-1:0] Bc; genvar g; assign Bc[0] = B[0] ^ CTRL; full_adder fa0(A[0], Bc[0], CTRL, S[0], Cout[0]); generate for(g = 1; g<SIZE; g++) begin assign Bc[g] = B[g] ^ CTRL; full_adder fa(A[g], Bc[g], Cout[g-1], S[g], Cout[g]); end endgenerate endmodule module halfadder(a,b,out,carry); input a,b; output out,carry; assign out=a^b; and (carry,a,b); endmodule module fulladder(a,b,c,out,carry); input a,b,c; output out,carry; wire w1,w2,w3; halfadder h1 (a,b,w1,w2); halfadder h2 (w1,c,out,w3); or (carry,w2,w3); endmodule module rippleadder( input [31:0] a, b, input c, output [31:0] out, output carry ); wire [31:0] w; wire [31:0] w_temp; assign w_temp = c ^ b; assign w[0] = c^b[0]; assign w[1] = c^ b[1]; assign w[2] = c^ b[2]; assign w[3] = c^ b[3]; assign w[4] = c^ b[4]; assign w[5] = c^ b[5]; assign w[6] = c^ b[6]; assign w[7] = c^ b[7]; assign w[8] = c^ b[8]; assign w[9] = c^ b[9]; assign w[10] = c ^ b[10]; assign w[11] = c^ b[11]; assign w[12] = c ^ b[12]; assign w[13] = c^ b[13]; assign w[14] = c ^ b[14]; assign w[15] = c ^ b[15]; assign w[16] =c^ b[16]; assign w[17] = c ^ b[17]; assign w[18] = c^ b[18]; assign w[19] = c^ b[19]; assign w[20] = c^ b[20]; assign w[21] = c ^ b[21]; assign w[22] = c^ b[22]; assign w[23] = c^ b[23]; assign w[24] = c^ b[24]; assign w[25] = c^ b[25]; assign w[26] = c ^ b[26]; assign w[27] = c^ b[27]; assign w[28] = c^ b[28]; assign w[29] = c ^ b[29]; assign w[30] = c ^ b[30]; assign w[31] = c ^ b[31]; fulladder f1(a[0], w[0], c, out[0], w1); fulladder f2(a[1], w[1], w1, out[1], w2); fulladder f3(a[2], w[2], w2, out[2], w3); fulladder f4(a[3], w[3], w3, out[3], w4); fulladder f5(a[4], w[4], w4, out[4], w5); fulladder f6(a[5], w[5], w5, out[5], w6); fulladder f7(a[6], w[6], w6, out[6], w7); fulladder f8(a[7], w[7], w7, out[7], w8); fulladder f9(a[8], w[8], w8, out[8], w9); fulladder f10(a[9], w[9], w9, out[9], w10); fulladder f11(a[10], w[10], w10, out[10], w11); fulladder f12(a[11], w[11], w11, out[11], w12); fulladder f13(a[12], w[12], w12, out[12], w13); fulladder f14(a[13], w[13], w13, out[13], w14); fulladder f15(a[14], w[14], w14, out[14], w15); fulladder f16(a[15], w[15], w15, out[15], w16); fulladder f17(a[16], w[16], w16, out[16], w17); fulladder f18(a[17], w[17], w17, out[17], w18); fulladder f19(a[18], w[18], w18, out[18], w19); fulladder f20(a[19], w[19], w19, out[19], w20); fulladder f21(a[20], w[20], w20, out[20], w21); fulladder f22(a[21], w[21], w21, out[21], w22); fulladder f23(a[22], w[22], w22, out[22], w23); fulladder f24(a[23], w[23], w23, out[23], w24); fulladder f25(a[24], w[24], w24, out[24], w25); fulladder f26(a[25], w[25], w25, out[25], w26); fulladder f27(a[26], w[26], w26, out[26], w27); fulladder f28(a[27], w[27], w27, out[27], w28); fulladder f29(a[28], w[28], w28, out[28], w29); fulladder f30(a[29], w[29], w29, out[29], w30); fulladder f31(a[30], w[30], w30, out[30], w31); fulladder f32(a[31], w[31], w31, out[31], carry); endmodule module alu ( input [31:0] a, b, input [31:0] s, output [31:0] out ); wire [31:0] i1, i2, i3, i4, i5, i6, i7, i8, i9, i10; wire w; assign w = 1'b0; rippleadder utt(a, b, w, i1, w3); rippleadder utt1(a, b, 1'b1, i2, w4); assign i3 = a | b; // Bitwise OR assign i4 = a & b; // Bitwise AND assign i5 = a ^ b; // XOR assign i6 = a << b; // Shift Left Logical assign i7 = a >> b; // Shift Right Logical assign i8 = a >>> b; // Shift Right Arithmetic assign i9 = (a < b) ? 1 : 0; // Set Less Than assign i10 = (a < b) ? 1 : 0; // Set Less Than (U) assign out = !s[0] ? (!s[1] ? i1 : i3) : (!s[1] ? i2 : i4); endmodule module alu_tb; ``` Test bench ``` reg [31:0] a, b; reg [31:0] s; wire [31:0] out; alu uut ( .a(a), .b(b), .s(s), .out(out) ); initial begin a = 32'd10; b = 32'd5; s = 32'b00000000000000000000000000000001; // For addition $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000000011; // For subtraction $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000000010; // For bitwise OR $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000000011; // For bitwise AND $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); // Additional instructions testing s = 32'b00000000000000000000000000000100; // XOR $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000000101; // Shift Left Logical $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000000110; // Shift Right Logical $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000000111; // Shift Right Arithmetic $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000001000; // Set Less Than $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 32'b00000000000000000000000000001001; // Set Less Than (U) $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); $finish; end endmodule ``` Process verilog code ``` module alu ( input logic [31:0] a, b, input logic [3:0] s, output logic [31:0] out ); always_comb begin case(s) 4'b0001: out = a + b; // Addition 4'b0010: out = a - b; // Subtraction 4'b0011: out = a | b; // Bitwise OR 4'b0100: out = a & b; // Bitwise AND 4'b0101: out = a ^ b; // XOR 4'b0110: out = a << b; // Shift Left Logical 4'b0111: out = a >>> b; // Shift Right Arithmetic 4'b1000: out = (a < b) ? 32'h1 : 32'h0; // Set Less Than (signed) 4'b1001: out = ($unsigned(a) < $unsigned(b)) ? 32'h1 : 32'h0; // Set Less Than (unsigned) default: out = 32'h0; // Default behavior endcase end endmodule module alu_tb; logic [31:0] a, b; logic [3:0] s; logic [31:0] out; alu uut ( .a(a), .b(b), .s(s), .out(out) ); initial begin a = 32'd10; b = 32'd5; s = 4'b0001; // For addition $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 4'b0010; // For subtraction $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); // Additional instructions testing s = 4'b0011; // For bitwise OR $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 4'b0100; // For bitwise AND $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 4'b0101; // XOR $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 4'b0110; // Shift Left Logical $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 4'b0111; // Shift Right Arithmetic $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 4'b1000; // Set Less Than (signed) $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); s = 4'b1001; // Set Less Than (unsigned) $display("a = %d, b = %d, s = %b, out = %d", a, b, s, out); $finish; end endmodule ```