EE 471 Group12 Lab3 Report
EE 471 Group12 Lab3 Report
Designing an ALU
Working with an SRAM, Reg File, I/O,
and C Stuff Cont.
GROUP 12
Nguyn c Phc
L Trung Hiu
Trn Anh Hng Nga
I. Abstract:
II. Introduction:
In this third project, we will build upon some of the things thatwe have learned in the
second one then add some new ideas. Our initial objective will be to design, implement, and test
a simplified arithmetic and logic unit ALU. The ALU will support the arithmetic operations
addition and subtraction and the logical operations shift, comparison, AND, OR, and exclusive
OR. We will then integrate the ALU with the SRAM and register file subsystems.
Finally, we will continue to grow our knowledge of the C language by working with variables
and their addresses. We will see that our earlier work with the SRAM carries directly to our
studies of C variables and their addresses.
A. VERILOG CODE
1. Module NOP
//NOP
module Nop(nop,negative_nop,zero_nop);
output wire [31:0]nop;
output wire negative_nop,zero_nop;
buf buf0(nop[0],1'b0);
buf buf1(nop[1],1'b0);
buf buf2(nop[2],1'b0);
buf buf3(nop[3],1'b0);
buf buf4(nop[4],1'b0);
buf buf5(nop[5],1'b0);
buf buf6(nop[6],1'b0);
buf buf7(nop[7],1'b0);
buf buf8(nop[8],1'b0);
buf buf9(nop[9],1'b0);
buf buf10(nop[10],1'b0);
buf buf11(nop[11],1'b0);
buf buf12(nop[12],1'b0);
buf buf13(nop[13],1'b0);
buf buf14(nop[14],1'b0);
buf buf15(nop[15],1'b0);
buf buf16(nop[16],1'b0);
buf buf17(nop[17],1'b0);
buf buf18(nop[18],1'b0);
buf buf19(nop[19],1'b0);
buf buf20(nop[20],1'b0);
buf buf21(nop[21],1'b0);
buf buf22(nop[22],1'b0);
buf buf23(nop[23],1'b0);
buf buf24(nop[24],1'b0);
buf buf25(nop[25],1'b0);
buf buf26(nop[26],1'b0);
buf buf27(nop[27],1'b0);
buf buf28(nop[28],1'b0);
buf buf29(nop[29],1'b0);
buf buf30(nop[30],1'b0);
buf buf31(nop[31],1'b0);
buf buf32(negative_nop,1'b0);
buf buf33(zero_nop,1'b0);
endmodule
2. Module FULLADDER
// Fulladder
module fulladder(s, c, x, y, c0);
output s, c;
input x, y, c0;
parameter delay = 0;
xor #delay xor1(s, x, y, c0);
and #delay and1(z1, x, y);
and #delay and2(z2, x, c0);
and #delay and3(z3, y, c0);
or #delay or1(c, z1, z2, z3);
endmodule
3. Module MUX_2TO1
// MUX_2TO1
module MUX_2to1(f,a,b,sel);
input a,b,sel;
output f;
parameter delay = 0;
not #delay not1(nsel,sel);
and #delay and1(f1,a,nsel);
and #delay and2(f2,b,sel);
or #delay or1(f,f1,f2);
endmodule
4. Module ADD_SUB1BIT
// ADD_SUB1BIT
// fulladder(add_sub) each bit
// To select Addition or Subtraction operation
// sel=0-->add=A+B+0, sel=1-->sub=A+notB+1
module Add_Sub1bit(sum, Cout, x, y, Cin, sel);
input x, y, Cin, sel;
output sum, Cout;
parameter delay = 0;
not #delay not1(noty, y);
wire result;
MUX_2to1 mymux(result,y,noty,sel);
fulladder myfulladder (sum, Cout, x, result, Cin);
endmodule
5. Module ADD_SUB32BIT
// ADD_SUB32BIT
module Add_Sub32bit(sum, Cout, overflow, negative, zero, x, y, control);
input [31:0] x,y;
input control;
output [31:0]sum;
output Cout,zero,overflow,negative;
parameter delay = 0;
Add_Sub1bit bit0(sum[0], Cout0, x[0], y[0], control, control);
Add_Sub1bit bit1(sum[1], Cout1, x[1], y[1], Cout0, control);
Add_Sub1bit bit2(sum[2], Cout2, x[2], y[2], Cout1, control);
Add_Sub1bit bit3(sum[3], Cout3, x[3], y[3], Cout2, control);
Add_Sub1bit bit4(sum[4], Cout4, x[4], y[4], Cout3, control);
Add_Sub1bit bit5(sum[5], Cout5, x[5],y[5],Cout4, control);
Add_Sub1bit bit6(sum[6], Cout6, x[6],y[6],Cout5, control);
Add_Sub1bit bit7(sum[7], Cout7, x[7],y[7],Cout6, control);
Add_Sub1bit mybit8(sum[8],Cout8,x[8],y[8],Cout7, control);
Add_Sub1bit mybit9(sum[9],Cout9,x[9],y[9],Cout8, control);
Add_Sub1bit mybit10(sum[10],Cout10,x[10],y[10],Cout9, control);
Add_Sub1bit mybit11(sum[11],Cout11,x[11],y[11],Cout10, control);
Add_Sub1bit mybit12(sum[12],Cout12,x[12],y[12],Cout11, control);
Add_Sub1bit mybit13(sum[13],Cout13,x[13],y[13],Cout12, control);
Add_Sub1bit mybit14(sum[14],Cout14,x[14],y[14],Cout13, control);
Add_Sub1bit mybit15(sum[15],Cout15,x[15],y[15],Cout14, control);
Add_Sub1bit bit16(sum[16],Cout16,x[16],y[16],Cout15, control);
Add_Sub1bit bit17(sum[17],Cout17,x[17],y[17],Cout16, control);
Add_Sub1bit bit18(sum[18],Cout18,x[18],y[18],Cout17, control);
Add_Sub1bit bit19(sum[19],Cout19,x[19],y[19],Cout18, control);
Add_Sub1bit bit20(sum[20],Cout20,x[20],y[20],Cout19, control);
Add_Sub1bit bit21(sum[21],Cout21,x[21],y[21],Cout20, control);
Add_Sub1bit bit22(sum[22],Cout22,x[22],y[22],Cout21, control);
Add_Sub1bit bit23(sum[23],Cout23,x[23],y[23],Cout22, control);
Add_Sub1bit bit24(sum[24],Cout24,x[24],y[24],Cout23, control);
Add_Sub1bit bit25(sum[25],Cout25,x[25],y[25],Cout24, control);
Add_Sub1bit bit26(sum[26],Cout26,x[26],y[26],Cout25, control);
Add_Sub1bit bit27(sum[27],Cout27,x[27],y[27],Cout26, control);
Add_Sub1bit bit28(sum[28],Cout28,x[28],y[28],Cout27, control);
Add_Sub1bit bit29(sum[29],Cout29,x[29],y[29],Cout28, control);
Add_Sub1bit bit30(sum[30],Cout30,x[30],y[30],Cout29, control);
Add_Sub1bit bit31(sum[31],Cout, x[31],y[31],Cout30, control);
xor #delay xor1(overflow,Cout30,Cout);
7. Module SLT
// SLT
module slt(Less,zero_slt,negative_slt, x, y); //////underconstruction
output wire [31:0] Less;
input[31:0] x, y;
output wire negative_slt,zero_slt;
parameter delay = 0;
wire [31:0] sum;
wire Cout, Overflow,zero,negative;
assign Less[31:1] = 0;
Add_Sub32bit my1(sum, Cout, Overflow, negative,zero, x, y, 1);//Subtraction
xor #delay xor1(Less[0], sum[31], Overflow);
and #delay and1(negative_slt,1,Less[31]);//NEGATIVE DETECTION
zero myzero(zero_slt,Less);//ZERO DETECTION
endmodule
8. Module XOR
// XOR
module XOR_function(result_xor, zero_xor, negative_xor, x, y);
input [31:0] x,y;
output [31:0] result_xor;
output zero_xor, negative_xor;
parameter delay = 0;
xor #delay xor0(result_xor[0],x[0],y[0]);
xor #delay xor1(result_xor[1],x[1],y[1]);
xor #delay xor2(result_xor[2],x[2],y[2]);
xor #delay xor3(result_xor[3],x[3],y[3]);
xor #delay xor4(result_xor[4],x[4],y[4]);
xor #delay xor5(result_xor[5],x[5],y[5]);
xor #delay xor6(result_xor[6],x[6],y[6]);
xor #delay xor7(result_xor[7],x[7],y[7]);
xor #delay xor8(result_xor[8],x[8],y[8]);
xor #delay xor9(result_xor[9],x[9],y[9]);
xor #delay xor10(result_xor[10],x[10],y[10]);
xor #delay xor11(result_xor[11],x[11],y[11]);
xor #delay xor12(result_xor[12],x[12],y[12]);
xor #delay xor13(result_xor[13],x[13],y[13]);
xor #delay xor14(result_xor[14],x[14],y[14]);
xor #delay xor15(result_xor[15],x[15],y[15]);
xor #delay xor16(result_xor[16],x[16],y[16]);
xor #delay xor17(result_xor[17],x[17],y[17]);
xor #delay xor18(result_xor[18],x[18],y[18]);
xor #delay xor19(result_xor[19],x[19],y[19]);
xor #delay xor20(result_xor[20],x[20],y[20]);
xor #delay xor21(result_xor[21],x[21],y[21]);
xor #delay xor22(result_xor[22],x[22],y[22]);
xor #delay xor23(result_xor[23],x[23],y[23]);
xor #delay xor24(result_xor[24],x[24],y[24]);
xor #delay xor25(result_xor[25],x[25],y[25]);
xor #delay xor26(result_xor[26],x[26],y[26]);
xor #delay xor27(result_xor[27],x[27],y[27]);
xor #delay xor28(result_xor[28],x[28],y[28]);
xor #delay xor29(result_xor[29],x[29],y[29]);
xor #delay xor30(result_xor[30],x[30],y[30]);
xor #delay xor31(result_xor[31],x[31],y[31]);
and #delay and1(negative_xor,1,result_xor[31]);//NEGATIVE DETECTION
9. Module AND
// AND
module AND_function(result_and, zero_and, negative_and, x, y);
input [31:0] x,y;
output [31:0] result_and;
output zero_and, negative_and;
parameter delay = 0;
and #delay and0(result_and[0],x[0],y[0]);
and #delay and1(result_and[1],x[1],y[1]);
and #delay and2(result_and[2],x[2],y[2]);
and #delay and3(result_and[3],x[3],y[3]);
and #delay and4(result_and[4],x[4],y[4]);
and #delay and5(result_and[5],x[5],y[5]);
and #delay and6(result_and[6],x[6],y[6]);
and #delay and7(result_and[7],x[7],y[7]);
and #delay and8(result_and[8],x[8],y[8]);
and #delay and9(result_and[9],x[9],y[9]);
and #delay and10(result_and[10],x[10],y[10]);
and #delay and11(result_and[11],x[11],y[11]);
and #delay and12(result_and[12],x[12],y[12]);
and #delay and13(result_and[13],x[13],y[13]);
and #delay and14(result_and[14],x[14],y[14]);
and #delay and15(result_and[15],x[15],y[15]);
and #delay and16(result_and[16],x[16],y[16]);
and #delay and17(result_and[17],x[17],y[17]);
and #delay and18(result_and[18],x[18],y[18]);
and #delay and19(result_and[19],x[19],y[19]);
and #delay and20(result_and[20],x[20],y[20]);
and #delay and21(result_and[21],x[21],y[21]);
and #delay and22(result_and[22],x[22],y[22]);
and #delay and23(result_and[23],x[23],y[23]);
and #delay and24(result_and[24],x[24],y[24]);
and #delay and25(result_and[25],x[25],y[25]);
and #delay and26(result_and[26],x[26],y[26]);
and #delay and27(result_and[27],x[27],y[27]);
and #delay and28(result_and[28],x[28],y[28]);
and #delay and29(result_and[29],x[29],y[29]);
10. Module OR
// OR
module OR_function(result_or, zero_or, negative_or, x, y);
input [31:0] x,y;
output [31:0] result_or;
output zero_or, negative_or;
parameter delay = 0;
or #delay or0(result_or[0],x[0],y[0]);
or #delay or1(result_or[1],x[1],y[1]);
or #delay or2(result_or[2],x[2],y[2]);
or #delay or3(result_or[3],x[3],y[3]);
or #delay or4(result_or[4],x[4],y[4]);
or #delay or5(result_or[5],x[5],y[5]);
or #delay or6(result_or[6],x[6],y[6]);
or #delay or7(result_or[7],x[7],y[7]);
or #delay or8(result_or[8],x[8],y[8]);
or #delay or9(result_or[9],x[9],y[9]);
or #delay or10(result_or[10],x[10],y[10]);
or #delay or11(result_or[11],x[11],y[11]);
or #delay or12(result_or[12],x[12],y[12]);
or #delay or13(result_or[13],x[13],y[13]);
or #delay or14(result_or[14],x[14],y[14]);
or #delay or15(result_or[15],x[15],y[15]);
or #delay or16(result_or[16],x[16],y[16]);
or #delay or17(result_or[17],x[17],y[17]);
or #delay or18(result_or[18],x[18],y[18]);
or #delay or19(result_or[19],x[19],y[19]);
or #delay or20(result_or[20],x[20],y[20]);
or #delay or21(result_or[21],x[21],y[21]);
or #delay or22(result_or[22],x[22],y[22]);
or #delay or23(result_or[23],x[23],y[23]);
or #delay or24(result_or[24],x[24],y[24]);
or #delay or25(result_or[25],x[25],y[25]);
or #delay or26(result_or[26],x[26],y[26]);
10
or #delay or27(result_or[27],x[27],y[27]);
or #delay or28(result_or[28],x[28],y[28]);
or #delay or29(result_or[29],x[29],y[29]);
or #delay or30(result_or[30],x[30],y[30]);
or #delay or31(result_or[31],x[31],y[31]);
and #delay and1(negative_or,1,result_or[31]);//NEGATIVE DETECTION
zero myzero(zero_or,result_or);//ZERO DETECTION
endmodule
11
12
buf buf22(shifta[9],a[8]);
buf buf23(shifta[8],a[7]);
buf buf24(shifta[7],a[6]);
buf buf25(shifta[6],a[5]);
buf buf26(shifta[5],a[4]);
buf buf27(shifta[4],a[3]);
buf buf28(shifta[3],a[2]);
buf buf29(shifta[2],a[1]);
buf buf30(shifta[1],a[0]);
buf buf31(shifta[0],0);
endmodule
13
14
mux8to1 bit24(out[24],nop[24],add[24],Xor[24],And[24],Or[24],sub[24],slt[24],sll[24],s2,s1,s0);
mux8to1 bit25(out[25],nop[25],add[25],Xor[25],And[25],Or[25],sub[25],slt[25],sll[25],s2,s1,s0);
mux8to1 bit26(out[26],nop[26],add[26],Xor[26],And[26],Or[26],sub[26],slt[26],sll[26],s2,s1,s0);
mux8to1 bit27(out[27],nop[27],add[27],Xor[27],And[27],Or[27],sub[27],slt[27],sll[27],s2,s1,s0);
mux8to1 bit28(out[28],nop[28],add[28],Xor[28],And[28],Or[28],sub[28],slt[28],sll[28],s2,s1,s0);
mux8to1 bit29(out[29],nop[29],add[29],Xor[29],And[29],Or[29],sub[29],slt[29],sll[29],s2,s1,s0);
mux8to1 bit30(out[30],nop[30],add[30],Xor[30],And[30],Or[30],sub[30],slt[30],sll[30],s2,s1,s0);
mux8to1 bit31(out[31],nop[31],add[31],Xor[31],And[31],Or[31],sub[31],slt[31],sll[31],s2,s1,s0);
endmodule
B. TESTBENCH
module ALUStimulus();
parameter ClockDelay = 10;
reg [31:0] BussA, BussB;
reg [2:0] ALUControl;
reg [1:0] SelectCode;
wire [31:0] Output;
wire Zero, Overflow, Carryout, Negative;
alu myalu(Output,Carryout, Zero, Overflow, Negative, BussA, BussB, ALUControl, SelectCode);
initial
begin
$monitor($time, " Output=%h, Carryout=%b, BussA=%h, BussB=%h,
ALUControl=%b, Zero=%b, Overflow=%b, Negative=%b",
Output, Carryout, BussA, BussB, ALUControl, Zero, Overflow, Negative);
/* No Operation */
ALUControl=000;
BussA=32'h00000DEF; BussB=32'h00000ABC;
#(ClockDelay);
BussA=32'h00001234; BussB=32'h00000105;
#(ClockDelay);
BussA=32'h7FFFFFFF; BussB=32'h00000001;
#(ClockDelay);
BussA='h0;BussB='h0;
/* Addition unit testing */
ALUControl=001;
BussA=32'h00000DEF; BussB=32'h00000ABC; // Should output 000018AB
#(ClockDelay);
BussA=32'h00001234; BussB=32'h00000105; // Should output 00001339
#(ClockDelay);
BussA=32'h7FFFFFFF; BussB=32'h00000001; // Should output 80000000,
overflow, negative
#(ClockDelay);
15
BussA='h0;BussB='h0;
// Should output 0, zero
#(ClockDelay);
BussA='hffffffff;BussB='hffffffff; // Should output 'hfffffffe, negative
#(ClockDelay);
BussA='h1;BussB='hffffffff;
// Should output 0, zero
#(ClockDelay);
BussA='h0;BussB='hffffffff;
// Should output 'hffffffff, negative
#(ClockDelay);
/* Subtraction unit testing */
ALUControl=010;
BussA=32'h00000DEF; BussB=32'h00000ABC; // Should output 00000333
#(ClockDelay);
BussA=32'h00001234; BussB=32'h00000105; // Should output 0000112F
#(ClockDelay);
BussA=32'h80000000; BussB=32'h00000001; // Should output 7FFFFFFF, overflow
#(ClockDelay);
BussA=32'h1; BussB=32'h80000000; // Should output 80000001, overflow
#(ClockDelay);
BussA='h1;BussB='h1;
#(ClockDelay);
BussA='h0;BussB='h0;
#(ClockDelay);
BussA='hffffffff;BussB='hfffffffe;
#(ClockDelay);
BussA='hfffffffe;BussB='hffffffff;
#(ClockDelay);
BussA='hf;BussB='he;
#(ClockDelay);
BussA='he;BussB='hf;
#(ClockDelay);
BussA='h0;BussB='hf;
#(ClockDelay);
BussA='hf;BussB='h0;
#(ClockDelay);
/* and */
ALUControl=011;
#(ClockDelay);
BussA='h0ff0;BussB='hf00f;
#(ClockDelay);
BussA='h0ff0;BussB='hff00;
#(ClockDelay);
BussA='hffffffff;BussB='h0;
/* or */
ALUControl=100;
#(ClockDelay);
BussA='h0ff0;BussB='hf00f;
#(ClockDelay);
16
BussA='h0ff0;BussB='hff00;
#(ClockDelay);
BussA='hffffffff;BussB='h0;
/* xor */
ALUControl=101;
#(ClockDelay);
BussA='h0ff0;BussB='hf00f;
#(ClockDelay);
BussA='h0ff0;BussB='hff00;
#(ClockDelay);
BussA='hffffffff;BussB='h0;
/* slt */
ALUControl=110;
#(ClockDelay);
BussA='h0ff0;BussB='hf00f;
#(ClockDelay);
BussA='h0ff0;BussB='hff00;
#(ClockDelay);
BussA='h0;BussB='h0;
#(ClockDelay);
BussA='hffffffff;BussB='hfffffffe;
#(ClockDelay);
BussA='hf;BussB='he;
#(ClockDelay);
BussA='he;BussB='hf;
#(ClockDelay);
BussA='h0;BussB='hf;
#(ClockDelay);
BussA='hf;BussB='h0;
#(ClockDelay);
/* sll */
ALUControl=111;
SelectCode=00;
#(ClockDelay);
BussA='h0ff0;BussB='hf00f;
#(ClockDelay);
BussA='b01;BussB='b11;
#(ClockDelay);
BussA='h0;BussB='h0;
#(ClockDelay);
BussA='hffffffff;BussB='hfffffffe;
#(ClockDelay);
BussA='hfffffffe;BussB='hffffffff;
#(ClockDelay);
BussA='hf;BussB='he;
#(ClockDelay);
BussA='he;BussB='hf;
#(ClockDelay);
17
BussA='h0;BussB='hf;
#(ClockDelay);
BussA='hf;BussB='h0;
#(ClockDelay);
SelectCode=01;
#(ClockDelay);
BussA='h0ff0;BussB='hf00f;
#(ClockDelay);
BussA='b01;BussB='b11;
#(ClockDelay);
BussA='h0;BussB='h0;
#(ClockDelay);
BussA='hffffffff;BussB='hfffffffe;
#(ClockDelay);
BussA='hfffffffe;BussB='hffffffff;
#(ClockDelay);
BussA='hf;BussB='he;
#(ClockDelay);
BussA='he;BussB='hf;
#(ClockDelay);
BussA='h0;BussB='hf;
#(ClockDelay);
BussA='hf;BussB='h0;
#(ClockDelay);
#(ClockDelay);
end
endmodule
C. SIMULATION ON MODELSIM
1. ALUControl = 000 : NOP
18
19
5. ALUControl = 100 : OR
20
D. SIGNALTAP
21
22
23