VLSI ALU Verilog
VLSI ALU Verilog
VLSI ALU Verilog
ASSIGNMENT 2
MIPS Single Cycle Processor
ABUTURAB MOHAMMADI
ID-2013A8PS437G
TIME SPENT
6 to 7 hours
TABLE
Cycle
reset
pc
instr
branch
srca
srcb
aluresult
zero
pcsrc
0
write
data
x
mem
write
0
read
data
0
00
04
08
12
0C
addi $2,$0,5
20020005
addi $7,$0,3
20070003
addi $3,$0,0xc
2003000c
or $4, $7, $2
00e22025
12
12
10
14
18
47
4C
10a70008
8
1C
20
10
28
11
2C
0064302a
beq
$6,
around
$0,
10c00001
slt $6, $7, $2
00e2302a
add $7, $6, $5
00c53820
12
30
00e23822
13
34
14
3C
j end
0800000f
sw $7, 71($2)
ac470047
What address will the final sw instruction write to and what value will it write?
The sw instruction will store the value of reg $7 in address 4C i.e the 12th data register.
CODE
module ctrlCkt(input [5:0] op, input [5:0] funct, output reg RegWrite, output reg RegDst, output reg ALUSrc, output reg Branch,
output reg MemWrite, output reg MemToReg, output reg Jump, output reg [2:0] ALUControl);
always @(op or funct)
begin
case(op)
6'b001000:begin
RegWrite=1;
RegDst=0;
Jump=0;
Branch=0;
MemWrite=0;
MemToReg=0;
ALUSrc=1;
ALUControl=3'b010;
end
6'b000000: begin
RegWrite=1;
RegDst=1;
ALUSrc=0;
MemToReg=0;
MemWrite=0;
Branch=0;
Jump=0;
case(funct)
6'b100000:ALUControl=3'b010;
6'b100010:ALUControl=3'b110;
6'b100100:ALUControl=3'b000;
6'b100101:ALUControl=3'b001;
6'b101010:ALUControl=3'b111;
endcase
end
6'b101011: begin
RegWrite=0;
ALUSrc=1;
MemWrite=1;
Branch=0;
Jump=0;
ALUControl=3'b010;
end
6'b100011: begin
RegDst=0;
RegWrite=1;
ALUSrc=1;
MemWrite=0;
MemToReg=1;
Jump=0;
Branch=0;
ALUControl=3'b010;
end
6'b000100: begin
RegWrite=0;
ALUSrc=0;
MemWrite=0;
Branch=1;
Jump=0;
ALUControl=3'b110;
end
6'b000010: begin
RegWrite=0;
MemWrite=0;
Jump=1;
end
endcase
end
endmodule
module D_ff(input d, input clk, input regWrite, input reset, output reg q);
always @(posedge clk)
begin
if(reset)
q<=1'b0;
else
begin
if(regWrite)
begin
q<=d;
end
end
end
endmodule
module register32bit(input clk, input reset, input regwrite, input [31:0] writedata, output [31:0] Rout );
D_ff d0(writedata[0],clk,regwrite,reset,Rout[0]);
D_ff d1(writedata[1],clk,regwrite,reset,Rout[1]);
D_ff d2(writedata[2],clk,regwrite,reset,Rout[2]);
D_ff d3(writedata[3],clk,regwrite,reset,Rout[3]);
D_ff d4(writedata[4],clk,regwrite,reset,Rout[4]);
D_ff d5(writedata[5],clk,regwrite,reset,Rout[5]);
D_ff d6(writedata[6],clk,regwrite,reset,Rout[6]);
D_ff d7(writedata[7],clk,regwrite,reset,Rout[7]);
D_ff d8(writedata[8],clk,regwrite,reset,Rout[8]);
D_ff d9(writedata[9],clk,regwrite,reset,Rout[9]);
D_ff d10(writedata[10],clk,regwrite,reset,Rout[10]);
D_ff d11(writedata[11],clk,regwrite,reset,Rout[11]);
D_ff d12(writedata[12],clk,regwrite,reset,Rout[12]);
D_ff d13(writedata[13],clk,regwrite,reset,Rout[13]);
D_ff d14(writedata[14],clk,regwrite,reset,Rout[14]);
D_ff d15(writedata[15],clk,regwrite,reset,Rout[15]);
D_ff d16(writedata[16],clk,regwrite,reset,Rout[16]);
D_ff d17(writedata[17],clk,regwrite,reset,Rout[17]);
D_ff d18(writedata[18],clk,regwrite,reset,Rout[18]);
D_ff d19(writedata[19],clk,regwrite,reset,Rout[19]);
D_ff d20(writedata[20],clk,regwrite,reset,Rout[20]);
D_ff d21(writedata[21],clk,regwrite,reset,Rout[21]);
D_ff d22(writedata[22],clk,regwrite,reset,Rout[22]);
D_ff d23(writedata[23],clk,regwrite,reset,Rout[23]);
D_ff d24(writedata[24],clk,regwrite,reset,Rout[24]);
D_ff d25(writedata[25],clk,regwrite,reset,Rout[25]);
D_ff d26(writedata[26],clk,regwrite,reset,Rout[26]);
D_ff d27(writedata[27],clk,regwrite,reset,Rout[27]);
D_ff d28(writedata[28],clk,regwrite,reset,Rout[28]);
D_ff d29(writedata[29],clk,regwrite,reset,Rout[29]);
D_ff d30(writedata[30],clk,regwrite,reset,Rout[30]);
D_ff d31(writedata[31],clk,regwrite,reset,Rout[31]);
endmodule
module decoder4to16(input [3:0] DstReg, output reg [15:0] decOut);
always@(DstReg)
case(DstReg)
4'b0000: decOut=16'b0000000000000001;
4'b0001: decOut=16'b0000000000000010;
4'b0010: decOut=16'b0000000000000100;
4'b0011: decOut=16'b0000000000001000;
4'b0100: decOut=16'b0000000000010000;
4'b0101: decOut=16'b0000000000100000;
4'b0110: decOut=16'b0000000001000000;
4'b0111: decOut=16'b0000000010000000;
4'b1000: decOut=16'b0000000100000000;
4'b1001: decOut=16'b0000001000000000;
4'b1010: decOut=16'b0000010000000000;
4'b1011: decOut=16'b0000100000000000;
4'b1100: decOut=16'b0001000000000000;
4'b1101: decOut=16'b0010000000000000;
4'b1110: decOut=16'b0100000000000000;
4'b1111: decOut=16'b1000000000000000;
endcase
endmodule
module mux16to1( input [31:0]
outR0,outR1,outR2,outR3,outR4,outR5,outR6,outR7,outR8,outR9,outR10,outR11,outR12,outR13,outR14,outR15, input [3:0] Sel, output reg
[31:0] outBus );
always@(outR0 or outR1 or outR2 or outR3 or outR4 or outR5 or outR6 or outR7 or outR8 or outR9 or outR10 or outR11 or outR12
or outR13 or outR14 or outR15 or Sel)
case (Sel)
4'b0000: outBus=outR0;
4'b0001: outBus=outR1;
4'b0010: outBus=outR2;
4'b0011: outBus=outR3;
4'b0100: outBus=outR4;
4'b0101: outBus=outR5;
4'b0110: outBus=outR6;
4'b0111: outBus=outR7;
4'b1000: outBus=outR8;
4'b1001: outBus=outR9;
4'b1010: outBus=outR10;
4'b1011: outBus=outR11;
4'b1100: outBus=outR12;
4'b1101: outBus=outR13;
4'b1110: outBus=outR14;
4'b1111: outBus=outR15;
endcase
endmodule
module regFile(input clk, input reset, input [4:0] A1,A2,A3, input WE3, input [31:0] WD3, output [31:0] RD1, RD2);
wire[15:0] wr;
wire [31:0] Rd0,Rd1,Rd2,Rd3,Rd4,Rd5,Rd6,Rd7,Rd8,Rd9,Rd10,Rd11,Rd12,Rd13,Rd14,Rd15;
decoder4to16 dec1(A3[3:0],wr);
register32bit r0(clk,reset,1'b0,WD3,Rd0);
register32bit r1(clk,reset,wr[1]&WE3,WD3,Rd1);
register32bit r2(clk,reset,wr[2]&WE3,WD3,Rd2);
register32bit r3(clk,reset,wr[3]&WE3,WD3,Rd3);
register32bit r4(clk,reset,wr[4]&WE3,WD3,Rd4);
register32bit r5(clk,reset,wr[5]&WE3,WD3,Rd5);
register32bit r6(clk,reset,wr[6]&WE3,WD3,Rd6);
register32bit r7(clk,reset,wr[7]&WE3,WD3,Rd7);
register32bit r8(clk,reset,wr[8]&WE3,WD3,Rd8);
register32bit r9(clk,reset,wr[9]&WE3,WD3,Rd9);
register32bit r10(clk,reset,wr[10]&WE3,WD3,Rd10);
register32bit
register32bit
register32bit
register32bit
register32bit
r11(clk,reset,wr[11]&WE3,WD3,Rd11);
r12(clk,reset,wr[12]&WE3,WD3,Rd12);
r13(clk,reset,wr[13]&WE3,WD3,Rd13);
r14(clk,reset,wr[14]&WE3,WD3,Rd14);
r15(clk,reset,wr[15]&WE3,WD3,Rd15);
mux16to1 m1(Rd0,Rd1,Rd2,Rd3,Rd4,Rd5,Rd6,Rd7,Rd8,Rd9,Rd10,Rd11,Rd12,Rd13,Rd14,Rd15,A1[3:0],RD1);
mux16to1 m2(Rd0,Rd1,Rd2,Rd3,Rd4,Rd5,Rd6,Rd7,Rd8,Rd9,Rd10,Rd11,Rd12,Rd13,Rd14,Rd15,A2[3:0],RD2);
endmodule
module dff(input clk, input reset, input d, output reg q);
always@(posedge clk)
begin
q<=d;
if(reset)
q<=1'b0;
end
endmodule
module PCReg(input clk, input reset, input [31:0] PCin, output [31:0] PCout);
dff df0(clk,reset,PCin[0],PCout[0]);
dff df1(clk,reset,PCin[1],PCout[1]);
dff df2(clk,reset,PCin[2],PCout[2]);
dff df3(clk,reset,PCin[3],PCout[3]);
dff df4(clk,reset,PCin[4],PCout[4]);
dff df5(clk,reset,PCin[5],PCout[5]);
dff df6(clk,reset,PCin[6],PCout[6]);
dff df7(clk,reset,PCin[7],PCout[7]);
dff df8(clk,reset,PCin[8],PCout[8]);
dff df9(clk,reset,PCin[9],PCout[9]);
dff df10(clk,reset,PCin[10],PCout[10]);
dff df11(clk,reset,PCin[11],PCout[11]);
dff df12(clk,reset,PCin[12],PCout[12]);
dff df13(clk,reset,PCin[13],PCout[13]);
dff df14(clk,reset,PCin[14],PCout[14]);
dff df15(clk,reset,PCin[15],PCout[15]);
dff df16(clk,reset,PCin[16],PCout[16]);
dff df17(clk,reset,PCin[17],PCout[17]);
dff df18(clk,reset,PCin[18],PCout[18]);
dff df19(clk,reset,PCin[19],PCout[19]);
dff df20(clk,reset,PCin[20],PCout[20]);
dff df21(clk,reset,PCin[21],PCout[21]);
dff df22(clk,reset,PCin[22],PCout[22]);
dff df23(clk,reset,PCin[23],PCout[23]);
dff df24(clk,reset,PCin[24],PCout[24]);
dff df25(clk,reset,PCin[25],PCout[25]);
dff df26(clk,reset,PCin[26],PCout[26]);
dff df27(clk,reset,PCin[27],PCout[27]);
dff df28(clk,reset,PCin[28],PCout[28]);
dff df29(clk,reset,PCin[29],PCout[29]);
dff df30(clk,reset,PCin[30],PCout[30]);
dff df31(clk,reset,PCin[31],PCout[31]);
endmodule
module SignExt(input [15:0] in, output [31:0] out);
wire [31:0] wout;
genvar i;
for(i=0;i<16;i=i+1)
assign wout[i]=in[i];
for(i=16;i<32;i=i+1)
assign wout[i]=in[15];
assign out=wout;
endmodule
module mux2to1(input [31:0] a,b, input sel, output reg [31:0] out);
always@(a or b or sel)
begin
case(sel)
1'b0:out=a;
1'b1:out=b;
endcase
end
endmodule
module mux2to1_5bit(input [4:0] a,b, input sel, output reg [4:0] out);
always@(a or b or sel)
begin
case(sel)
1'b0:out=a;
1'b1:out=b;
endcase
end
endmodule
module D_ff_IM(input reset, input d, output reg q);
always@(reset)
if(reset)
q<=d;
endmodule
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
Dff_DM
endmodule
dMem18(clk,reset,MW,init[18],d_in[18],q_out[18]);
dMem19(clk,reset,MW,init[19],d_in[19],q_out[19]);
dMem20(clk,reset,MW,init[20],d_in[20],q_out[20]);
dMem21(clk,reset,MW,init[21],d_in[21],q_out[21]);
dMem22(clk,reset,MW,init[22],d_in[22],q_out[22]);
dMem23(clk,reset,MW,init[23],d_in[23],q_out[23]);
dMem24(clk,reset,MW,init[24],d_in[24],q_out[24]);
dMem25(clk,reset,MW,init[25],d_in[25],q_out[25]);
dMem26(clk,reset,MW,init[26],d_in[26],q_out[26]);
dMem27(clk,reset,MW,init[27],d_in[27],q_out[27]);
dMem28(clk,reset,MW,init[28],d_in[28],q_out[28]);
dMem29(clk,reset,MW,init[29],d_in[29],q_out[29]);
dMem30(clk,reset,MW,init[30],d_in[30],q_out[30]);
dMem31(clk,reset,MW,init[31],d_in[31],q_out[31]);
6'b100: outBus=outR4;
6'b101: outBus=outR5;
6'b110: outBus=outR6;
6'b111: outBus=outR7;
6'b1000: outBus=outR8;
6'b1001: outBus=outR9;
6'b1010: outBus=outR10;
6'b1011: outBus=outR11;
6'b1100: outBus=outR12;
6'b1101: outBus=outR13;
6'b1110: outBus=outR14;
6'b1111: outBus=outR15;
6'b10000: outBus=outR16;
6'b10001: outBus=outR17;
6'b10010: outBus=outR18;
6'b10011: outBus=outR19;
6'b10100: outBus=outR20;
6'b10101: outBus=outR21;
6'b10110: outBus=outR22;
6'b10111: outBus=outR23;
6'b11000: outBus=outR24;
6'b11001: outBus=outR25;
6'b11010: outBus=outR26;
6'b11011: outBus=outR27;
6'b11100: outBus=outR28;
6'b11101: outBus=outR29;
6'b11110: outBus=outR30;
6'b11111: outBus=outR31;
6'b100000: outBus=outR32;
6'b100001: outBus=outR33;
6'b100010: outBus=outR34;
6'b100011: outBus=outR35;
6'b100100: outBus=outR36;
6'b100101: outBus=outR37;
6'b100110: outBus=outR38;
6'b100111: outBus=outR39;
6'b101000: outBus=outR40;
6'b101001: outBus=outR41;
6'b101010: outBus=outR42;
6'b101011: outBus=outR43;
6'b101100: outBus=outR44;
6'b101101: outBus=outR45;
6'b101110: outBus=outR46;
6'b101111: outBus=outR47;
6'b110000: outBus=outR48;
6'b110001: outBus=outR49;
6'b110010:
6'b110011:
6'b110100:
6'b110101:
6'b110110:
6'b110111:
6'b111000:
6'b111001:
6'b111010:
6'b111011:
6'b111100:
6'b111101:
6'b111110:
6'b111111:
outBus=outR50;
outBus=outR51;
outBus=outR52;
outBus=outR53;
outBus=outR54;
outBus=outR55;
outBus=outR56;
outBus=outR57;
outBus=outR58;
outBus=outR59;
outBus=outR60;
outBus=outR61;
outBus=outR62;
outBus=outR63;
endcase
endmodule
module Data_Mem(input clk, input reset, input MemW, input [31:0] Address, input [31:0] WData, output [31:0] RData);
wire [63:0] decOut;
wire [31:0] Qout0, Qout1, Qout2, Qout3, Qout4, Qout5, Qout6, Qout7, Qout8, Qout9, Qout10, Qout11, Qout12, Qout13, Qout14,
Qout15, Qout16, Qout17, Qout18, Qout19, Qout20, Qout21, Qout22, Qout23, Qout24, Qout25, Qout26, Qout27, Qout28, Qout29, Qout30,
Qout31, Qout32, Qout33, Qout34, Qout35, Qout36, Qout37, Qout38, Qout39, Qout40, Qout41, Qout42, Qout43, Qout44, Qout45, Qout46,
Qout47, Qout48, Qout49, Qout50, Qout51, Qout52, Qout53, Qout54, Qout55, Qout56, Qout57, Qout58, Qout59, Qout60, Qout61, Qout62,
Qout63;
decoder6to64 decO(Address[5:0], decOut);
register_DM r0(clk,reset, MemW & decOut[0], 32'b0, WData, Qout0);
register_DM r1(clk,reset, MemW & decOut[1], 32'b0, WData, Qout1);
register_DM r2(clk,reset, MemW & decOut[2], 32'b0, WData, Qout2);
register_DM r3(clk,reset, MemW & decOut[3], 32'b0, WData, Qout3);
register_DM r4(clk,reset, MemW & decOut[4], 32'b0, WData, Qout4);
register_DM r5(clk,reset, MemW & decOut[5], 32'b0, WData, Qout5);
register_DM r6(clk,reset, MemW & decOut[6], 32'b0, WData, Qout6);
register_DM r7(clk,reset, MemW & decOut[7], 32'b0, WData, Qout7);
register_DM r8(clk,reset, MemW & decOut[8], 32'b0, WData, Qout8);
register_DM r9(clk,reset, MemW & decOut[9], 32'b0, WData, Qout9);
register_DM r10(clk,reset, MemW & decOut[10], 32'b0, WData, Qout10);
register_DM r11(clk,reset, MemW & decOut[11], 32'b0, WData, Qout11);
register_DM r12(clk,reset, MemW & decOut[12], 32'b0, WData, Qout12);
register_DM r13(clk,reset, MemW & decOut[13], 32'b0, WData, Qout13);
register_DM r14(clk,reset, MemW & decOut[14], 32'b0, WData, Qout14);
register_DM r15(clk,reset, MemW & decOut[15], 32'b0, WData, Qout15);
register_DM r16(clk,reset, MemW & decOut[16], 32'b0, WData, Qout16);
register_DM r17(clk,reset, MemW & decOut[17], 32'b0, WData, Qout17);
register_DM r18(clk,reset, MemW & decOut[18], 32'b0, WData, Qout18);
register_DM r19(clk,reset, MemW & decOut[19], 32'b0, WData, Qout19);
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
register_DM
r20(clk,reset,
r21(clk,reset,
r22(clk,reset,
r23(clk,reset,
r24(clk,reset,
r25(clk,reset,
r26(clk,reset,
r27(clk,reset,
r28(clk,reset,
r29(clk,reset,
r30(clk,reset,
r31(clk,reset,
r32(clk,reset,
r33(clk,reset,
r34(clk,reset,
r35(clk,reset,
r36(clk,reset,
r37(clk,reset,
r38(clk,reset,
r39(clk,reset,
r40(clk,reset,
r41(clk,reset,
r42(clk,reset,
r43(clk,reset,
r44(clk,reset,
r45(clk,reset,
r46(clk,reset,
r47(clk,reset,
r48(clk,reset,
r49(clk,reset,
r50(clk,reset,
r51(clk,reset,
r52(clk,reset,
r53(clk,reset,
r54(clk,reset,
r55(clk,reset,
r56(clk,reset,
r57(clk,reset,
r58(clk,reset,
r59(clk,reset,
r60(clk,reset,
r61(clk,reset,
r62(clk,reset,
r63(clk,reset,
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
MemW
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
&
decOut[20],
decOut[21],
decOut[22],
decOut[23],
decOut[24],
decOut[25],
decOut[26],
decOut[27],
decOut[28],
decOut[29],
decOut[30],
decOut[31],
decOut[32],
decOut[33],
decOut[34],
decOut[35],
decOut[36],
decOut[37],
decOut[38],
decOut[39],
decOut[40],
decOut[41],
decOut[42],
decOut[43],
decOut[44],
decOut[45],
decOut[46],
decOut[47],
decOut[48],
decOut[49],
decOut[50],
decOut[51],
decOut[52],
decOut[53],
decOut[54],
decOut[55],
decOut[56],
decOut[57],
decOut[58],
decOut[59],
decOut[60],
decOut[61],
decOut[62],
decOut[63],
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
32'b0,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
WData,
Qout20);
Qout21);
Qout22);
Qout23);
Qout24);
Qout25);
Qout26);
Qout27);
Qout28);
Qout29);
Qout30);
Qout31);
Qout32);
Qout33);
Qout34);
Qout35);
Qout36);
Qout37);
Qout38);
Qout39);
Qout40);
Qout41);
Qout42);
Qout43);
Qout44);
Qout45);
Qout46);
Qout47);
Qout48);
Qout49);
Qout50);
Qout51);
Qout52);
Qout53);
Qout54);
Qout55);
Qout56);
Qout57);
Qout58);
Qout59);
Qout60);
Qout61);
Qout62);
Qout63);
Qout5, Qout6, Qout7, Qout8, Qout9, Qout10, Qout11, Qout12, Qout13, Qout14,
Qout22, Qout23, Qout24, Qout25, Qout26, Qout27, Qout28, Qout29, Qout30,
Qout38, Qout39, Qout40, Qout41, Qout42, Qout43, Qout44, Qout45, Qout46,
Qout54, Qout55, Qout56, Qout57, Qout58, Qout59, Qout60, Qout61, Qout62,
module SingleCycleTester;
reg clk;
reg reset;
wire [31:0] Result;
SingleCycle run(.clk(clk), .reset(reset), .Result(Result));
always
#20 clk=~clk;
initial
begin
clk=0; reset=1;
#73 reset=0;
end
endmodule
SIMULATION WAVEFORMS