@@ -0,0 +1,580 @@ | |||||
module Alu (Instruction, Imm_Extension_E, Aluout, a,b, ZeroE,PC, PCTarget_E); | |||||
//Declaration of Inputs | |||||
input [31:0] Instruction; | |||||
input signed [31:0] Imm_Extension_E; | |||||
input [ 31:0] a,b; | |||||
input signed [31:0] PC; | |||||
//Declarations of Outputs | |||||
output reg signed [31:0] Aluout; | |||||
output reg ZeroE; | |||||
output reg signed [31:0] PCTarget_E; | |||||
//Declaring wires | |||||
wire signed [31:0]A = a; | |||||
wire signed [31:0]B = b; | |||||
//Declaration of Parameters | |||||
// Instruction Types | |||||
parameter [7:0] r_to_r = 7'b0110011, | |||||
r_to_imm = 7'b0010011, | |||||
ld = 7'b0000011, | |||||
store = 7'b0100011, | |||||
upperimm = 7'b0110111, | |||||
branch = 7'b1100011; | |||||
//CSR = 7'b1110011; | |||||
// REGISTER TO REGISTER TYPE | |||||
parameter [9:0] add = 10'b0000000_000, //Addition | |||||
sub = 10'b0100000_000, //Subtraction | |||||
slt = 10'b0000000_010, //Set if less than | |||||
sll = 10'b0000000_001, //Shift left logic | |||||
sltu = 10'b0000000_011, //Set if less than Unsigned | |||||
Xor = 10'b0000000_100, //Bitwise Xor | |||||
srl = 10'b0000000_101, //Shift right logic | |||||
sra = 10'b0100000_101, //Shift right arithmatic | |||||
Or = 10'b0000000_110, //Bitwise Or | |||||
And = 10'b0000000_111; //Bitwise And | |||||
// REGISTER TO IMMEDIATE TYPE | |||||
parameter [2:0] addi = 3'b000, //Addition | |||||
slli = 3'b001, //Set if less than | |||||
slti = 3'b010, //Shift left logic | |||||
sltui = 3'b011, //Set if less than Unsigned | |||||
Xori = 3'b100, //Bitwise Xor | |||||
srli = 3'b101, //Shift right logic | |||||
//srai = 3'b101, //Shift right arithmatic | |||||
Ori = 3'b110, //Bitwise Or | |||||
andi = 3'b111; //Bitwise And | |||||
// LOAD TYPE | |||||
parameter [2:0] LB = 3'b000, //Load Byte | |||||
LH = 3'b001, //Load Halfword | |||||
LW = 3'b010, //Load Word | |||||
LBU = 3'b100, //Load Byte Unsigned | |||||
LHU = 3'B101; //Load Halfword Unsigned | |||||
// STORE TYPE | |||||
parameter [2:0] SB = 3'b000, // STORE BYTE | |||||
SH = 3'b001, // STORE HALF WORD | |||||
SW = 3'b010; // STORE WORD | |||||
// UPPER IMMEDIATE TYPE | |||||
parameter [6:0] LUI = 7'b0110111, // LOAD UPPER IMMEDIATE | |||||
AUIPC = 7'b0010111; //ADD UPPER IMMEDIATE | |||||
// BRANCH TYPE | |||||
parameter [2:0] BEQ = 3'b000, // BRANCH EQUAL | |||||
BNE = 3'b001, // BRANCH NOT EQUAL | |||||
BLT = 3'b100, // BRANCH LESS THAN | |||||
BGE = 3'b101, // BRANCH GREATER THAN | |||||
BLTU = 3'b110, // BRANCH LESS THAN UNSINGNED | |||||
BGEU = 3'b111; // BRANCH GREATER THAN UNSINGED | |||||
// JUMP TYPE | |||||
parameter [6:0] JAL = 7'b1101111, //JUMP AND LINK | |||||
JALR = 7'b1100111; //JUMP AND LINK REGISTER | |||||
/* | |||||
// CSR Type | |||||
parameter [2:0] CSRRW = 3'b001, | |||||
CSRRS = 3'b010, | |||||
CSRRC = 3'b011, | |||||
CSRRWI = 3'b101, | |||||
CSRRSI = 3'b110, | |||||
CSRRCI = 3'b111; | |||||
*/ | |||||
always@(*) | |||||
begin | |||||
case(Instruction [6:0] ) | |||||
r_to_r : //Register to Register | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
Aluout = 32'b0; | |||||
case({Instruction [31:25] ,Instruction[14:12]}) //Funct7,Funct3 Values | |||||
add : Aluout = A + B; | |||||
sub : Aluout = A - B; | |||||
sll : Aluout = A << B[4:0]; | |||||
slt : begin | |||||
if(A < B) | |||||
Aluout = 1; | |||||
else | |||||
Aluout = 0; | |||||
end | |||||
sltu: begin | |||||
if(a < b) | |||||
Aluout = 1; | |||||
else | |||||
Aluout = 0; | |||||
end | |||||
Xor : Aluout = A ^ B; | |||||
srl : Aluout = A >> B[4:0]; | |||||
sra : Aluout = A >>> B[4:0]; | |||||
Or : Aluout = A || B; | |||||
And : Aluout = A && B; | |||||
default :begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
endcase | |||||
end | |||||
r_to_imm: | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
Aluout = 32'b0; | |||||
case(Instruction[14:12] ) //Funct3 values | |||||
addi : Aluout = A + B; | |||||
slli : Aluout = A << b; | |||||
slti : begin | |||||
if(A < B) | |||||
Aluout = 1; | |||||
else | |||||
Aluout = 0; | |||||
end | |||||
sltui: begin | |||||
if(a < b) | |||||
Aluout = 1; | |||||
else | |||||
Aluout = 0; | |||||
end | |||||
Xori : Aluout = A ^ B; | |||||
srli : begin | |||||
if(B[10] == 1) | |||||
Aluout = A >>> b; | |||||
else | |||||
Aluout = A >> b; | |||||
end | |||||
Ori : Aluout = A | B; | |||||
andi : Aluout = A & B; | |||||
default :begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
endcase | |||||
end | |||||
ld: | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
Aluout = A + B; | |||||
end | |||||
store: | |||||
begin | |||||
Aluout = A + B; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
branch: | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
Aluout = 32'b0; | |||||
case(Instruction [14:12]) | |||||
BEQ : begin | |||||
if(A == B) | |||||
begin | |||||
ZeroE = 1'b1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
end | |||||
BNE : begin | |||||
if(A != B) | |||||
begin | |||||
ZeroE = 1'b1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
end | |||||
BLT : begin | |||||
if(A < B) | |||||
begin | |||||
ZeroE = 1'b1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
end | |||||
BGE : begin | |||||
if(A >= B) | |||||
begin | |||||
ZeroE = 1'b1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
end | |||||
BLTU : begin | |||||
if(a < b) | |||||
begin | |||||
ZeroE = 1'b1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
end | |||||
BGEU : begin | |||||
if(a >= b) | |||||
begin | |||||
ZeroE = 1'b1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else | |||||
begin | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
end | |||||
default : begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
endcase | |||||
end | |||||
LUI: | |||||
begin | |||||
Aluout = B; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
AUIPC: | |||||
begin | |||||
Aluout = PC+B; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = 32'b0; | |||||
end | |||||
JAL: | |||||
begin | |||||
Aluout = PC+32'h00000004; | |||||
PCTarget_E = PC+B; | |||||
ZeroE = 1'b0; | |||||
end | |||||
JALR: | |||||
begin | |||||
Aluout = PC+32'h00000004; | |||||
PCTarget_E = ((PC+B)&32'hFFFFFFFE); | |||||
ZeroE = 1'b0; | |||||
end | |||||
/* CSR: | |||||
begin | |||||
case(Instruction [14:12]) | |||||
CSRRW || CSRRS || CSRRC || CSRRWI || CSRRSI || CSRRCI: | |||||
begin | |||||
Aluout <= {{20{1'b0}},Instruction [20:31]}; | |||||
PCTarget_E <= PCTarget_E; | |||||
end | |||||
endcase | |||||
end | |||||
*/ | |||||
default : begin | |||||
Aluout = 32'b0; | |||||
PCTarget_E = 32'b0; | |||||
ZeroE = 1'b0; | |||||
end | |||||
endcase | |||||
end | |||||
endmodule | |||||
/* | |||||
module Alu (Instruction, Imm_Extension_E, Aluout, A,B, ZeroE,PC, PCTarget_E); | |||||
input [31:0] Instruction; | |||||
input signed [31:0] Imm_Extension_E; | |||||
input signed [31:0] A,B; | |||||
input signed [31:0] PC; | |||||
output reg [31:0] Aluout; | |||||
output reg ZeroE; | |||||
output reg [31:0] PCTarget_E; | |||||
parameter [7:0] r_to_r = 7'b0110011, | |||||
r_to_imm = 7'b0010011, | |||||
ld = 7'b0000011, | |||||
store = 7'b0100011, | |||||
branch = 7'b1100011; | |||||
// REGISTER TO REGISTER TYPE | |||||
parameter [9:0] add = 10'b0000000_000, | |||||
sub = 10'b0100000_000, | |||||
slt = 10'b0000000_010, | |||||
sll = 10'b0000000_001, | |||||
sltu= 10'b0000000_011, | |||||
Xor = 10'b0000000_100, | |||||
srl = 10'b0000000_101, | |||||
sra = 10'b0100000_101, | |||||
Or = 10'b0000000_110, | |||||
And = 10'b0000000_111; | |||||
// REGISTER TO IMMEDIATE TYPE | |||||
parameter [2:0] addi = 3'b000, | |||||
slli = 3'b001, | |||||
slti = 3'b010, | |||||
sltui= 3'b011, | |||||
Xori = 3'b100, | |||||
srli = 3'b101, | |||||
//srai = 3'b101, | |||||
Ori = 3'b110, | |||||
andi = 3'b111; | |||||
//LOAD TYPE | |||||
parameter [2:0] LB = 3'b000, | |||||
LH = 3'b001, | |||||
LW = 3'b010, | |||||
LBU= 3'b100, | |||||
LHU= 3'B101; | |||||
//STORE TYPE | |||||
parameter [2:0] SB = 3'b000, // STORE BYTE | |||||
SH = 3'b001, // STORE HALF WORD | |||||
SW = 3'b010; // STORE WORD | |||||
// UPPER IMMEDIATE TYPE | |||||
parameter [6:0] LUI = 7'b0110111, // LOAD UPPER IMMEDIATE | |||||
AUIPC =7'b0010111; //ADD UPPER IMMEDIATE | |||||
// BRANCH TYPE | |||||
parameter [2:0] BEQ = 3'b000, // BRANCH EQUAL | |||||
BNE = 3'b001, // BRANCH NOT EQUAL | |||||
BLT = 3'b100, // BRANCH LESS THAN | |||||
BGE = 3'b101, // BRANCH GREATER THAN | |||||
BLTU= 3'b110, // BRANCH LESS THAN UNSINGNED | |||||
BGEU= 3'b111; // BRANCH GREATER THAN UNSINGED | |||||
//JUMP TYPE | |||||
parameter [6:0] JAL = 7'b1101111, | |||||
JALR = 7'b1100111; | |||||
always@(*) | |||||
begin | |||||
case(Instruction [6:0] ) | |||||
r_to_r : | |||||
begin | |||||
//ZeroE = 0; | |||||
//PCTarget_E = PCTarget_E; | |||||
case({Instruction [31:25] ,Instruction[14:12]}) | |||||
add : Aluout = A + B; | |||||
sub : Aluout = A - B; | |||||
sll : Aluout = A << B[4:0]; | |||||
slt : | |||||
begin | |||||
if( A < B) | |||||
Aluout <= 1; | |||||
else | |||||
Aluout <= 0; | |||||
end | |||||
sltu: | |||||
begin | |||||
if($unsigned(A) < $unsigned(B)) | |||||
Aluout = 1; | |||||
else | |||||
Aluout = 0; | |||||
end | |||||
Xor : Aluout = A ^ B; | |||||
srl : Aluout = A >> B[4:0]; | |||||
sra : Aluout = A >>> B[4:0]; | |||||
Or : Aluout = A || B; | |||||
And : Aluout = A && B; | |||||
default :begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = PCTarget_E; | |||||
end | |||||
endcase | |||||
end | |||||
r_to_imm: | |||||
begin | |||||
//ZeroE = 0; | |||||
//PCTarget_E = PCTarget_E; | |||||
case(Instruction[14:12] ) | |||||
addi : Aluout = A + B; | |||||
slli : Aluout = A << B; | |||||
slti : | |||||
begin | |||||
if(A < B) | |||||
Aluout = 1; | |||||
else | |||||
Aluout = 0; | |||||
end | |||||
sltui: | |||||
begin | |||||
if($unsigned(A) < $unsigned(B)) | |||||
Aluout = 1; | |||||
else | |||||
Aluout = 0; | |||||
end | |||||
Xori : Aluout = A ^ B; | |||||
srli : | |||||
begin | |||||
if(B[10] == 0) | |||||
Aluout = A >> B; | |||||
end | |||||
srai : | |||||
begin | |||||
if(B[10] == 1) | |||||
Aluout = A >>> B; | |||||
end | |||||
Ori : Aluout = A | B; | |||||
andi : Aluout = A & B; | |||||
default :begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = PCTarget_E; | |||||
end | |||||
endcase | |||||
end | |||||
ld: | |||||
begin | |||||
//ZeroE = 0; | |||||
//PCTarget_E = PCTarget_E; | |||||
case(Instruction [14:12]) | |||||
LB : Aluout = A + B; | |||||
LH : Aluout = A + B; | |||||
LW : Aluout = A + B; | |||||
LBU : Aluout = $unsigned(A) + $unsigned(B); | |||||
LHU : Aluout = $unsigned(A) + $unsigned(B); | |||||
default :begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = PCTarget_E; | |||||
end | |||||
endcase | |||||
end | |||||
store: | |||||
begin | |||||
//ZeroE = 1'b0; | |||||
//PCTarget_E = PCTarget_E; | |||||
case(Instruction [14:12]) | |||||
SB : Aluout = A +B; | |||||
SH : Aluout = A + B; | |||||
SW : Aluout = A + B; | |||||
default :begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = PCTarget_E; | |||||
end | |||||
endcase | |||||
end | |||||
branch: | |||||
begin | |||||
//Aluout = 32'b0; | |||||
case(Instruction [14:12]) | |||||
BEQ : | |||||
begin | |||||
if(A == B)begin | |||||
ZeroE = 1; | |||||
PCTarget_E = PC + Imm_Extension_E;end | |||||
else begin | |||||
ZeroE = 0; | |||||
PCTarget_E = PCTarget_E; end | |||||
end | |||||
BNE : | |||||
begin | |||||
if(A != B)begin | |||||
ZeroE = 1; | |||||
PCTarget_E = PC + Imm_Extension_E ;end | |||||
else begin | |||||
ZeroE = 0; | |||||
PCTarget_E = PCTarget_E; end | |||||
end | |||||
BLT : | |||||
begin | |||||
if(A < B)begin | |||||
ZeroE = 1; | |||||
PCTarget_E = PC + Imm_Extension_E; end | |||||
else begin | |||||
ZeroE = 0; | |||||
PCTarget_E = PCTarget_E; end | |||||
end | |||||
BGE : | |||||
begin | |||||
if(A >= B)begin | |||||
ZeroE = 1; | |||||
PCTarget_E = PC + Imm_Extension_E;end | |||||
else begin | |||||
ZeroE = 0; | |||||
PCTarget_E = PCTarget_E; end | |||||
end | |||||
BLTU : | |||||
begin | |||||
if($unsigned(A) < $unsigned(B))begin | |||||
ZeroE = 1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else begin | |||||
ZeroE = 0; | |||||
PCTarget_E = PCTarget_E; end | |||||
end | |||||
BGEU : | |||||
begin | |||||
if($unsigned(A) >= $unsigned(B)) | |||||
begin | |||||
ZeroE = 1; | |||||
PCTarget_E = PC + Imm_Extension_E; | |||||
end | |||||
else begin | |||||
ZeroE = 0; | |||||
PCTarget_E = PCTarget_E; end | |||||
end | |||||
default :begin | |||||
Aluout = 32'b0; | |||||
ZeroE = 1'b0; | |||||
PCTarget_E = PCTarget_E; | |||||
end | |||||
endcase | |||||
end | |||||
LUI: | |||||
begin | |||||
Aluout = B; | |||||
end | |||||
AUIPC: | |||||
begin | |||||
Aluout = PC+B; | |||||
end | |||||
JAL: | |||||
begin | |||||
Aluout = PC+32'h00000004; | |||||
PCTarget_E = PC+B; | |||||
end | |||||
JALR: | |||||
begin | |||||
Aluout = PC+32'h00000004; | |||||
PCTarget_E = ((PC+B)&32'hFFFFFFFE); | |||||
end | |||||
default:begin | |||||
ZeroE = ZeroE; | |||||
PCTarget_E = PCTarget_E; | |||||
end | |||||
endcase | |||||
end | |||||
endmodule | |||||
*/ |
@@ -0,0 +1,19 @@ | |||||
module Control_Unit(Opcode,RegWrite,MemWrite,Result_Select,Branch,Jump,Rs2_Select); | |||||
//Declaring Inputs and Outputs | |||||
input [6:0]Opcode; | |||||
output RegWrite,MemWrite,Result_Select,Branch,Jump,Rs2_Select; | |||||
assign RegWrite = (Opcode == 7'b0000011 || Opcode == 7'b0110011 || Opcode == 7'b0010011 || Opcode == 7'b0110111 || Opcode == 7'b0010111 || Opcode == 7'b1101111 || Opcode == 7'b1100111) ? 1'b1 : | |||||
1'b0 ; | |||||
assign MemWrite = (Opcode == 7'b0100011) ? 1'b1 : | |||||
1'b0 ; | |||||
assign Result_Select = (Opcode == 7'b0000011) ? 1'b1 : | |||||
1'b0 ; | |||||
assign Branch = (Opcode == 7'b1100011) ? 1'b1 : | |||||
1'b0 ; | |||||
assign Jump = (Opcode == 7'b1101111 || Opcode == 7'b1100111)? 1'b1 : 1'b0; | |||||
assign Rs2_Select = (Opcode == 7'b0010011 || Opcode == 7'b0000011 || Opcode == 7'b0100011 || Opcode == 7'b0110111 | | |||||
Opcode == 7'b0010111 || Opcode == 7'b1101111 || Opcode == 7'b1100111)? 1'b1 : 1'b0 ; | |||||
endmodule |
@@ -0,0 +1,21 @@ | |||||
module Data_Memory(clk,rst,WE,WD,A,RD); | |||||
input clk,rst,WE; | |||||
input [31:0]A,WD; | |||||
output [31:0]RD; | |||||
reg [31:0] mem [1023:0]; | |||||
always @ (posedge clk) | |||||
begin | |||||
if(WE) | |||||
mem[A] <= WD; | |||||
end | |||||
assign RD = (rst==1) ? 32'd0 : mem[A]; | |||||
initial begin | |||||
mem[0] = 32'h00000000; | |||||
end | |||||
endmodule |
@@ -0,0 +1,126 @@ | |||||
module Decode_cycle(clk, rst, clear, RegWrite_W, RD_W, Instruction_D, PC_D, Result_W, RegWrite_E, MemWrite_E, | |||||
Result_Select_E, Branch_E, Jump_E, Rs2_Select_E, RD1_E, RD2_E, Imm_Extension_E, RS1_E, RS2_E, RD_E, PC_E, Instruction_E); | |||||
// Declaring Inputs and Outputs | |||||
input clk, rst, clear, RegWrite_W; | |||||
input [4:0] RD_W; | |||||
input [31:0] Instruction_D, PC_D, Result_W; | |||||
output RegWrite_E, MemWrite_E, Result_Select_E, Branch_E, Jump_E, Rs2_Select_E; | |||||
output signed [31:0] RD1_E, RD2_E, Imm_Extension_E; | |||||
output [4:0] RS1_E, RS2_E, RD_E; | |||||
output [31:0] PC_E,Instruction_E; | |||||
// Declare Interim Wires | |||||
wire RegWrite_D, MemWrite_D, Result_Select_D, Branch_D, Jump_D, Rs2_Select_D; | |||||
wire signed [31:0] RD1_D, RD2_D, Imm_Extension_D; | |||||
wire [31:0] Instruction_D; | |||||
// Declaration of Interim Register | |||||
reg RegWrite_D_reg, MemWrite_D_reg, Result_Select_D_reg, Branch_D_reg, Jump_D_reg, Rs2_Select_D_reg; | |||||
reg [31:0] RD1_D_reg, RD2_D_reg, Imm_Extension_D_reg; | |||||
reg [4:0] RS1_D_reg, RS2_D_reg, RD_D_reg; | |||||
reg [31:0] PC_D_reg, Instruction_D_reg; | |||||
// Initiate the modules | |||||
// Control Unit | |||||
Control_Unit Control_Unit(.Opcode(Instruction_D[6:0]), | |||||
.RegWrite(RegWrite_D), | |||||
.MemWrite(MemWrite_D), | |||||
.Result_Select(Result_Select_D), | |||||
.Branch(Branch_D), | |||||
.Jump(Jump_D), | |||||
.Rs2_Select(Rs2_Select_D) | |||||
); | |||||
// Register File | |||||
Register_File Registers(.clk(clk), | |||||
.rst(rst), | |||||
.WE3(RegWrite_W), | |||||
.WD3(Result_W), | |||||
.A1(Instruction_D[19:15]), | |||||
.A2(Instruction_D[24:20]), | |||||
.A3(RD_W), | |||||
.RD1(RD1_D), | |||||
.RD2(RD2_D) | |||||
); | |||||
// Sign Extension | |||||
Sign_Extension Extension ( | |||||
.Instruction(Instruction_D[31:0]), | |||||
.Imm(Imm_Extension_D) | |||||
); | |||||
// Declaring Register Logic | |||||
always @(posedge clk or posedge rst) | |||||
begin | |||||
if(rst == 1'b1) | |||||
begin | |||||
RegWrite_D_reg <= 1'b0; | |||||
MemWrite_D_reg <= 1'b0; | |||||
Result_Select_D_reg <= 1'b0; | |||||
Branch_D_reg <= 1'b0; | |||||
Jump_D_reg <= 1'b0; | |||||
Rs2_Select_D_reg <= 1'b0; | |||||
RD1_D_reg <= 32'h00000000; | |||||
RD2_D_reg <= 32'h00000000; | |||||
Imm_Extension_D_reg <= 32'h00000000; | |||||
RD_D_reg <= 5'h00; | |||||
PC_D_reg <= 32'h00000000; | |||||
RS1_D_reg <= 5'h00; | |||||
RS2_D_reg <= 5'h00; | |||||
Instruction_D_reg <= 32'h00000000; | |||||
end | |||||
else if(clear) //NOP | |||||
begin | |||||
RegWrite_D_reg <= 1'b0; | |||||
MemWrite_D_reg <= 1'b0; | |||||
Result_Select_D_reg <= 1'b0; | |||||
Branch_D_reg <= 1'b0; | |||||
Jump_D_reg <= 1'b0; | |||||
Rs2_Select_D_reg <= 1'b0; | |||||
RD1_D_reg <= 32'h00000000; | |||||
RD2_D_reg <= 32'h00000000; | |||||
Imm_Extension_D_reg <= 32'h00000000; | |||||
RD_D_reg <= 5'h00; | |||||
PC_D_reg <= 32'hxxxxxxxx; | |||||
RS1_D_reg <= 5'h00; | |||||
RS2_D_reg <= 5'h00; | |||||
Instruction_D_reg <= 32'h00000033; | |||||
end | |||||
else | |||||
begin | |||||
RegWrite_D_reg <= RegWrite_D; | |||||
MemWrite_D_reg <= MemWrite_D; | |||||
Result_Select_D_reg <= Result_Select_D; | |||||
Branch_D_reg <= Branch_D; | |||||
Jump_D_reg <= Jump_D; | |||||
Rs2_Select_D_reg <= Rs2_Select_D; | |||||
RD1_D_reg <= RD1_D; | |||||
RD2_D_reg <= RD2_D; | |||||
Imm_Extension_D_reg <= Imm_Extension_D; | |||||
RD_D_reg <= Instruction_D[11:7]; | |||||
PC_D_reg <= PC_D; | |||||
RS1_D_reg <= Instruction_D[19:15]; | |||||
RS2_D_reg <= Instruction_D[24:20]; | |||||
Instruction_D_reg <= Instruction_D; | |||||
end | |||||
end | |||||
// Output asssign statements | |||||
assign RegWrite_E = RegWrite_D_reg; | |||||
assign MemWrite_E = MemWrite_D_reg; | |||||
assign Result_Select_E = Result_Select_D_reg; | |||||
assign Branch_E = Branch_D_reg; | |||||
assign Jump_E = Jump_D_reg; | |||||
assign Rs2_Select_E = Rs2_Select_D_reg; | |||||
assign RD1_E = RD1_D_reg; | |||||
assign RD2_E = RD2_D_reg; | |||||
assign Imm_Extension_E = Imm_Extension_D_reg; | |||||
assign RD_E = RD_D_reg; | |||||
assign PC_E = PC_D_reg; | |||||
assign RS1_E = RS1_D_reg; | |||||
assign RS2_E = RS2_D_reg; | |||||
assign Instruction_E = Instruction_D_reg; | |||||
endmodule |
@@ -0,0 +1,109 @@ | |||||
module Execute_cycle(clk, rst, RegWrite_E, MemWrite_E, Result_Select_E, Branch_E, Jump_E, Rs2_Select_E, | |||||
RD1_E, RD2_E, Imm_Extension_E, Instruction_E, RD_E, PC_E, Result_W, ForwardA_E, ForwardB_E, PC_Select_E, | |||||
RegWrite_M, MemWrite_M, Result_Select_M, RD_M, WriteData_M, Alu_Result_M, PCTarget_E, Operation_M); | |||||
// Declaration of Inputs and Outputs | |||||
input clk, rst, RegWrite_E,MemWrite_E,Result_Select_E,Branch_E,Jump_E,Rs2_Select_E; | |||||
input [31:0] RD1_E, RD2_E, Imm_Extension_E; | |||||
input [31:0] Instruction_E; | |||||
input [4:0] RD_E; | |||||
input [31:0] PC_E; | |||||
input [31:0] Result_W; | |||||
input [1:0] ForwardA_E, ForwardB_E; | |||||
output PC_Select_E, RegWrite_M, MemWrite_M, Result_Select_M; | |||||
output [4:0] RD_M; | |||||
output [31:0] WriteData_M; | |||||
output [31:0] Alu_Result_M; | |||||
output [31:0] PCTarget_E; | |||||
output [2:0] Operation_M; | |||||
// Declaration of Interim Wires | |||||
wire [31:0] A, B_temp; | |||||
wire [31:0] B; | |||||
wire [31:0] Alu_Result_E; | |||||
wire ZeroE; | |||||
wire [31:0] Store_extension; | |||||
// Declaration of Register | |||||
reg RegWrite_E_reg, MemWrite_E_reg, Result_Select_E_reg; | |||||
reg [4:0] RD_E_reg; | |||||
reg [31:0] WriteData_E_reg; | |||||
reg [31:0] Alu_Result_E_reg; | |||||
reg [2:0] Operation_E_reg; | |||||
// Declaration of Modules | |||||
// 3 by 1 Mux for A | |||||
mux3_1 mux_A(.a(RD1_E), | |||||
.b(Alu_Result_M), | |||||
.c(Result_W), | |||||
.s(ForwardA_E), | |||||
.y(A) | |||||
); | |||||
// 3 by 1 Mux for B_temp | |||||
mux3_1 mux_B_temp(.a(RD2_E), | |||||
.b(Alu_Result_M), | |||||
.c(Result_W), | |||||
.s(ForwardB_E), | |||||
.y(B_temp) | |||||
); | |||||
// Mux for B | |||||
mux2_1 mux_B(.a(B_temp), | |||||
.b(Imm_Extension_E), | |||||
.s(Rs2_Select_E), | |||||
.y(B) | |||||
); | |||||
// ALU Unit | |||||
Alu alu(.Instruction(Instruction_E), | |||||
.Imm_Extension_E(Imm_Extension_E), | |||||
.Aluout(Alu_Result_E), | |||||
.a(A), | |||||
.b(B), | |||||
.ZeroE(ZeroE), | |||||
.PC(PC_E), | |||||
.PCTarget_E(PCTarget_E) | |||||
); | |||||
Store_Extension Store(.WriteData_E_temp(B_temp), | |||||
.Operation(Instruction_E[14:12]), | |||||
.WriteData_E(Store_extension) | |||||
); | |||||
// Register Logic | |||||
always @(posedge clk or posedge rst) | |||||
begin | |||||
if(rst == 1'b1) | |||||
begin | |||||
RegWrite_E_reg <= 1'b0; | |||||
MemWrite_E_reg <= 1'b0; | |||||
Result_Select_E_reg <= 1'b0; | |||||
RD_E_reg <= 5'h00; | |||||
WriteData_E_reg <= 32'h00000000; | |||||
Alu_Result_E_reg <= 32'h00000000; | |||||
Operation_E_reg <= 3'b000; | |||||
end | |||||
else | |||||
begin | |||||
RegWrite_E_reg <= RegWrite_E; | |||||
MemWrite_E_reg <= MemWrite_E; | |||||
Result_Select_E_reg <= Result_Select_E; | |||||
RD_E_reg <= RD_E; | |||||
WriteData_E_reg <= Store_extension; | |||||
Alu_Result_E_reg <= Alu_Result_E; | |||||
Operation_E_reg <= Instruction_E[14:12]; | |||||
end | |||||
end | |||||
// Output Assignments | |||||
assign PC_Select_E = Jump_E|(ZeroE & Branch_E); | |||||
assign RegWrite_M = RegWrite_E_reg; | |||||
assign MemWrite_M = MemWrite_E_reg; | |||||
assign Result_Select_M = Result_Select_E_reg; | |||||
assign RD_M = RD_E_reg; | |||||
assign WriteData_M = WriteData_E_reg; | |||||
assign Alu_Result_M = Alu_Result_E_reg; | |||||
assign Operation_M = Operation_E_reg; | |||||
endmodule |
@@ -0,0 +1,82 @@ | |||||
//IF_ID_Stage | |||||
module Fetch_cycle(enable,clk, rst, enable, clear_d, PC_Select_E, PCTarget_E, Instruction_D, PC_D); | |||||
// Declare input & outputs | |||||
// input [31:0]instruction_fetch; | |||||
// input Instruction_enable; | |||||
input clk, rst; | |||||
input enable, clear_d; | |||||
input PC_Select_E; | |||||
input [31:0] PCTarget_E; | |||||
output [31:0] Instruction_D; | |||||
output [31:0] PC_D; | |||||
// Declaring interim wires | |||||
wire [31:0] PC_F, PCF, PCPlus4F; | |||||
wire [31:0] Instruction_F; | |||||
wire [31:0] PC_F_reg_temp = 0, Instruction_F_reg_temp = 0; | |||||
// Declaration of Register | |||||
reg [31:0] Instruction_F_reg; | |||||
reg [31:0] PC_F_reg; | |||||
// Initiation of Modules | |||||
// Declare PC Mux | |||||
mux2_1 PC_MUX (.a(PCPlus4F), | |||||
.b(PCTarget_E), | |||||
.s(PC_Select_E), | |||||
.y(PCF) | |||||
); | |||||
// Declare PC Counter | |||||
Program_Counter Program_Counter (.clk(clk), | |||||
.rst(rst), | |||||
.enable(enable), | |||||
.PC(PC_F), | |||||
.PC_Next(PCF) | |||||
); | |||||
// Declare Instruction Memory | |||||
Instruction_Memory IMem(//.clk(clk), | |||||
.rst(rst), | |||||
// .Instruction_enable(Instruction_enable), | |||||
// .instruction_fetch(instruction_fetch), | |||||
.A(PC_F), | |||||
.RD(Instruction_F) | |||||
); | |||||
// Declare PC adder | |||||
PC_Adder PC_adder(.a(PC_F), | |||||
.b(32'h00000004), | |||||
.y(PCPlus4F) | |||||
); | |||||
// Fetch Cycle Register Logic | |||||
always @(posedge clk or posedge rst) | |||||
begin | |||||
if(rst == 1'b1) | |||||
begin | |||||
Instruction_F_reg <= 32'h00000000; | |||||
PC_F_reg <= 32'h00000000; | |||||
end | |||||
else if(clear_d) //Control Hazard | |||||
begin | |||||
Instruction_F_reg <= 32'b0000000_00000_00000_000_00000_0110011; // dummy innstruction | |||||
PC_F_reg <= 10'bxxxxxxxxxx; // dummy instrction indicated by x - ( nop) | |||||
end | |||||
else if(enable) | |||||
begin | |||||
PC_F_reg <=PC_F_reg_temp; // loop back | |||||
Instruction_F_reg <= Instruction_F_reg_temp; // loop back | |||||
end | |||||
else | |||||
begin | |||||
Instruction_F_reg <= Instruction_F; | |||||
PC_F_reg <= PC_F; | |||||
end | |||||
end | |||||
// Assigning Registers Value to the Output port | |||||
assign Instruction_D = Instruction_F_reg; | |||||
assign PC_D = PC_F_reg; | |||||
endmodule |
@@ -0,0 +1,92 @@ | |||||
module Hazardunit(enable, clear, clear_d , ForwardA_E, ForwardB_E,opcode_D,opcode_E, RS1_D, RS2_D, RD_E, | |||||
RS1_E,RS2_E, RD_M, RD_W, RegWrite_M, RegWrite_W, Result_Select_E, PC_Select_E); | |||||
input [6:0] opcode_D,opcode_E; | |||||
input [4:0] RS1_E, RS2_E,RD_E, RD_M,RD_W, RS1_D,RS2_D; | |||||
input RegWrite_M, RegWrite_W,Result_Select_E, PC_Select_E; | |||||
output reg enable, clear,clear_d; | |||||
output reg [1:0] ForwardA_E, ForwardB_E; | |||||
parameter [6:0]r_to_r = 7'b0110011, | |||||
r_to_imm = 7'b0010011, | |||||
ld = 7'b0000011, | |||||
store = 7'b010001, | |||||
branch = 7'b1100011, | |||||
lui = 7'b0110111, | |||||
auipc = 7'b0010111, | |||||
jal = 7'b1101111, | |||||
jalr = 7'b1100111; | |||||
always @(*) | |||||
begin | |||||
// control hazard used for fulsing the ooperation | |||||
if(PC_Select_E) | |||||
begin | |||||
clear <= 1'b1; | |||||
clear_d <= 1'b1;//control hazard | |||||
enable <=1'b0; | |||||
ForwardA_E <= 2'b00; | |||||
ForwardB_E <= 2'b00; | |||||
end | |||||
//DATA HAZARD WHEN THERE IS A LOAD TYPE INSTRUCTION | |||||
else if( ( RS1_D == RD_E && opcode_D !=lui && opcode_D != auipc && opcode_D != jal) && Result_Select_E == 1'b1) | |||||
begin | |||||
enable <= 1'b1; | |||||
clear <= 1'b1; | |||||
clear_d <= 1'b0; | |||||
ForwardA_E <= 2'b00; | |||||
ForwardB_E <= 2'b00; | |||||
end | |||||
else if( ((RS2_D == RD_E )&& (opcode_D == store || opcode_D == branch || opcode_D == r_to_r)) && Result_Select_E == 1'b1) | |||||
begin | |||||
enable <= 1'b1; | |||||
clear <= 1'b1; | |||||
clear_d <= 1'b0; | |||||
ForwardA_E <= 2'b00; | |||||
ForwardB_E <= 2'b00; | |||||
end | |||||
else if( ( (RS1_E == RD_M) && RegWrite_M) && opcode_E !=lui && opcode_E != auipc && opcode_E != jal ) | |||||
begin | |||||
enable <= 1'b0; | |||||
ForwardA_E <= 2'b01; | |||||
ForwardB_E <= 2'b00; | |||||
clear <= 1'b0; | |||||
clear_d <= 1'b0; | |||||
end | |||||
else if( ( (RS1_E == RD_W) && RegWrite_W) && opcode_E !=lui && opcode_E != auipc && opcode_E != jal) | |||||
begin | |||||
enable <= 1'b0; | |||||
ForwardA_E <= 2'b10; | |||||
ForwardB_E <= 2'b00; | |||||
clear <= 1'b0; | |||||
clear_d <= 1'b0; | |||||
end | |||||
else if(( (RS2_E == RD_M) && RegWrite_M) && (opcode_E == store || opcode_E == branch || opcode_E == r_to_r)) | |||||
begin | |||||
enable <= 1'b0; | |||||
ForwardA_E <= 2'b00; | |||||
ForwardB_E <= 2'b01; | |||||
clear <= 1'b0; | |||||
clear_d <= 1'b0; | |||||
end | |||||
else if (( (RS2_E == RD_W) && RegWrite_W) && (opcode_E == store || opcode_E == branch || opcode_E == r_to_r)) | |||||
begin | |||||
enable <= 1'b0; | |||||
ForwardA_E <= 2'b00; | |||||
ForwardB_E <= 2'b10; | |||||
clear <= 1'b0; | |||||
clear_d <= 1'b0; | |||||
end | |||||
else | |||||
begin | |||||
enable <= 1'b0; | |||||
ForwardA_E <= 2'b00; | |||||
ForwardB_E <= 2'b00; | |||||
clear <= 1'b0; | |||||
clear_d <= 1'b0; | |||||
end | |||||
end | |||||
endmodule |
@@ -0,0 +1,22 @@ | |||||
module Instruction_Memory(rst,A,RD); | |||||
input rst;//clk; | |||||
input [31:0]A; | |||||
output [31:0]RD; | |||||
//input Instruction_enable; | |||||
//input [31:0] instruction_fetch; | |||||
//Memory Creation | |||||
reg [31:0] Mem [1023:0]; | |||||
//reg [31:0] Mem [2^32:0]; | |||||
/* | |||||
always@(posedge clk) | |||||
begin | |||||
if(Instruction_enable) | |||||
begin | |||||
Mem[A] <= instruction_fetch; | |||||
end | |||||
end | |||||
*/ | |||||
assign RD = (rst == 1'b1) ? 32'b0 : Mem[A]; | |||||
endmodule |
@@ -0,0 +1,11 @@ | |||||
module Load_Extension(ReadData_M_temp,Operation,ReadData_M); | |||||
input [31:0] ReadData_M_temp; | |||||
input [2:0]Operation; | |||||
output [31:0] ReadData_M; | |||||
assign ReadData_M = (Operation == 3'b000)?{{24{ReadData_M_temp[7]}},ReadData_M_temp[7:0]} : | |||||
(Operation == 3'b001)?{{16{ReadData_M_temp[15]}},ReadData_M_temp[15:0]} : | |||||
(Operation == 3'b010)? ReadData_M_temp : | |||||
(Operation == 3'b100)?{{24'b0},ReadData_M_temp[7:0]} : | |||||
(Operation == 3'b101)?{{16'b0},ReadData_M_temp[15:0]} : 32'hxxxxxxxx; | |||||
endmodule |
@@ -0,0 +1,62 @@ | |||||
module Memory_cycle(clk, rst, RegWrite_M, MemWrite_M, Result_Select_M, RD_M, WriteData_M, | |||||
Alu_Result_M, Operation_M, RegWrite_W, Result_Select_W, RD_W, Alu_Result_W, ReadData_W); | |||||
// Declaration of I/Os | |||||
input clk, rst, RegWrite_M, MemWrite_M, Result_Select_M; | |||||
input [4:0] RD_M; | |||||
input [31:0] WriteData_M, Alu_Result_M; | |||||
input [2:0] Operation_M; | |||||
output RegWrite_W, Result_Select_W; | |||||
output [4:0] RD_W; | |||||
output [31:0] Alu_Result_W, ReadData_W; | |||||
// Declaration of Intermediate Wires | |||||
wire [31:0] ReadData_M,ReadData_M_temp ; | |||||
// Declaration of Intermediate Registers | |||||
reg RegWrite_M_reg, Result_Select_M_reg; | |||||
reg [4:0] RD_M_reg; | |||||
reg [31:0] Alu_Result_M_reg, ReadData_M_reg; | |||||
// Declaration of Module Initiation | |||||
Data_Memory Data_Memory(.clk(clk), | |||||
.rst(rst), | |||||
.WE(MemWrite_M), | |||||
.WD(WriteData_M), | |||||
.A(Alu_Result_M), | |||||
.RD(ReadData_M_temp) | |||||
); | |||||
Load_Extension Load(.ReadData_M_temp(ReadData_M_temp), | |||||
.Operation(Operation_M), | |||||
.ReadData_M(ReadData_M) | |||||
); | |||||
// Memory Stage Register Logic | |||||
always @(posedge clk or posedge rst) | |||||
begin | |||||
if (rst == 1'b1) | |||||
begin | |||||
RegWrite_M_reg <= 1'b0; | |||||
Result_Select_M_reg <= 1'b0; | |||||
RD_M_reg <= 5'b00000; | |||||
Alu_Result_M_reg <= 32'h00000000; | |||||
ReadData_M_reg <= 32'h00000000; | |||||
end | |||||
else | |||||
begin | |||||
RegWrite_M_reg <= RegWrite_M; | |||||
Result_Select_M_reg <= Result_Select_M; | |||||
RD_M_reg <= RD_M; | |||||
Alu_Result_M_reg <= Alu_Result_M; | |||||
ReadData_M_reg <= ReadData_M; | |||||
end | |||||
end | |||||
// Declaration of output assignments | |||||
assign RegWrite_W = RegWrite_M_reg; | |||||
assign Result_Select_W = Result_Select_M_reg; | |||||
assign RD_W = RD_M_reg; | |||||
assign Alu_Result_W = Alu_Result_M_reg; | |||||
assign ReadData_W = ReadData_M_reg; | |||||
endmodule |
@@ -0,0 +1,8 @@ | |||||
module PC_Adder (a,b,y); | |||||
input [31:0]a,b; | |||||
output [31:0]y; | |||||
assign y = a + b; | |||||
endmodule |
@@ -0,0 +1,157 @@ | |||||
/* | |||||
`include "Fetch_cycle.v" | |||||
`include "Decode_cycle.v" | |||||
`include "Execute_cycle.v" | |||||
`include "Memory_cycle.v" | |||||
`include "Writeback_cycle.v" | |||||
`include "Hazardunit.v" | |||||
`include "Program_Counter.v" | |||||
`include "PC_Adder.v" | |||||
`include "mux2_1.v" | |||||
`include "mux3_1.v" | |||||
`include "Instruction_Memory.v" | |||||
`include "Control_Unit.v" | |||||
`include "Register_File.v" | |||||
`include "Sign_Extension.v" | |||||
`include "Alu.v" | |||||
`include "Data_Memory.v" | |||||
`include "Load_Extension.v" | |||||
`include "Store_Extension.v" | |||||
*/ | |||||
module Pipeline(clk, rst,PC_D,Imm_Extension_E,RD1_E,RD2_E,Instruction_D,ReadData_W, Result_W); | |||||
// Declaration of Inputs | |||||
input clk, rst; | |||||
input [31:0]PC_D,Imm_Extension_E;//Instruction_enable; | |||||
output [31:0] Instruction_D,ReadData_W,Result_W; | |||||
// input [31:0] instruction_fetch; | |||||
wire enable, clear, clear_d; | |||||
wire [31:0] PC_E; | |||||
wire [31:0]Instruction_E; | |||||
wire [4:0]RS1_E,RS2_E,RD_E,RD_M,RD_W; | |||||
input [31:0]RD1_E,RD2_E; | |||||
wire RegWrite_E,RegWrite_M,RegWrite_W; | |||||
wire MemWrite_E,MemWrite_M; | |||||
wire Result_Select_E,Result_Select_M,Result_Select_W; | |||||
wire Branch_E, Jump_E, Rs2_Select_E, PC_Select_E; | |||||
wire [31:0]PCTarget_E; | |||||
wire [31:0]Alu_Result_M,Alu_Result_W; | |||||
wire [31:0]WriteData_M; | |||||
wire [1:0] ForwardA_E, ForwardB_E; | |||||
wire [2:0] Operation_M; | |||||
// Module Initiation | |||||
// Fetch Stage | |||||
Fetch_cycle Fetch(.clk(clk), | |||||
.rst(rst), | |||||
.enable(enable), | |||||
.clear_d(clear_d), | |||||
.PC_Select_E(PC_Select_E), | |||||
.PCTarget_E(PCTarget_E), | |||||
.Instruction_D(Instruction_D), | |||||
.PC_D(PC_D) | |||||
// .instruction_fetch(instruction_fetch), | |||||
// .Instruction_enable(Instruction_enable) | |||||
); | |||||
// Decode Stage | |||||
Decode_cycle Decode(.clk(clk), | |||||
.rst(rst), | |||||
.clear(clear), | |||||
.RegWrite_W(RegWrite_W), | |||||
.RD_W(RD_W), | |||||
.Instruction_D(Instruction_D), | |||||
.PC_D(PC_D), | |||||
.Result_W(Result_W), | |||||
.RegWrite_E(RegWrite_E), | |||||
.MemWrite_E(MemWrite_E), | |||||
.Result_Select_E(Result_Select_E), | |||||
.Branch_E(Branch_E), | |||||
.Jump_E(Jump_E), | |||||
.Rs2_Select_E(Rs2_Select_E), | |||||
.RD1_E(RD1_E), | |||||
.RD2_E(RD2_E), | |||||
.Imm_Extension_E(Imm_Extension_E), | |||||
.RS1_E(RS1_E), | |||||
.RS2_E(RS2_E), | |||||
.RD_E(RD_E), | |||||
.PC_E(PC_E), | |||||
.Instruction_E(Instruction_E) | |||||
); | |||||
// Execute Stage | |||||
Execute_cycle Execute(.clk(clk), | |||||
.rst(rst), | |||||
.RegWrite_E(RegWrite_E), | |||||
.MemWrite_E(MemWrite_E), | |||||
.Result_Select_E(Result_Select_E), | |||||
.Branch_E(Branch_E), | |||||
.Jump_E(Jump_E), | |||||
.Rs2_Select_E(Rs2_Select_E), | |||||
.RD1_E(RD1_E), | |||||
.RD2_E(RD2_E), | |||||
.Imm_Extension_E(Imm_Extension_E), | |||||
.Instruction_E(Instruction_E), | |||||
.RD_E(RD_E), | |||||
.PC_E(PC_E), | |||||
.Result_W(Result_W), | |||||
.ForwardA_E(ForwardA_E), | |||||
.ForwardB_E(ForwardB_E), | |||||
.PC_Select_E(PC_Select_E), | |||||
.RegWrite_M(RegWrite_M), | |||||
.MemWrite_M(MemWrite_M), | |||||
.Result_Select_M(Result_Select_M), | |||||
.RD_M(RD_M), | |||||
.WriteData_M(WriteData_M), | |||||
.Alu_Result_M(Alu_Result_M), | |||||
.PCTarget_E(PCTarget_E), | |||||
.Operation_M(Operation_M) | |||||
); | |||||
// Memory Stage | |||||
Memory_cycle Memory(.clk(clk), | |||||
.rst(rst), | |||||
.RegWrite_M(RegWrite_M), | |||||
.MemWrite_M(MemWrite_M), | |||||
.Result_Select_M(Result_Select_M), | |||||
.RD_M(RD_M), | |||||
.WriteData_M(WriteData_M), | |||||
.Alu_Result_M(Alu_Result_M), | |||||
.RegWrite_W(RegWrite_W), | |||||
.Result_Select_W(Result_Select_W), | |||||
.RD_W(RD_W), | |||||
.Alu_Result_W(Alu_Result_W), | |||||
.ReadData_W(ReadData_W), | |||||
.Operation_M(Operation_M) | |||||
); | |||||
// Write Back Stage | |||||
Writeback_cycle WriteBack( | |||||
.Result_Select_W(Result_Select_W), | |||||
.Alu_Result_W(Alu_Result_W), | |||||
.ReadData_W(ReadData_W), | |||||
.Result_W(Result_W) | |||||
); | |||||
// Hazard Detection Unit | |||||
Hazardunit Hazard_Detection_Unit(.clear(clear), | |||||
.clear_d(clear_d), | |||||
.enable(enable), | |||||
.ForwardA_E(ForwardA_E), | |||||
.ForwardB_E(ForwardB_E), | |||||
.opcode_D(Instruction_D[6:0]), | |||||
.opcode_E(Instruction_E[6:0]), | |||||
.RS1_E(RS1_E), | |||||
.RS2_E(RS2_E), | |||||
.RD_E(RD_E), | |||||
.RD_M(RD_M), | |||||
.RD_W(RD_W), | |||||
.RS1_D(Instruction_D[19:15]), | |||||
.RS2_D(Instruction_D[24:20]), | |||||
.RegWrite_M(RegWrite_M), | |||||
.RegWrite_W(RegWrite_W), | |||||
.Result_Select_E(Result_Select_E), | |||||
.PC_Select_E(PC_Select_E) | |||||
); | |||||
endmodule |
@@ -0,0 +1,179 @@ | |||||
module Pipeline_tb(); | |||||
reg clk, rst; | |||||
integer k,l; | |||||
Pipeline riscv(.clk(clk),.rst(rst)); | |||||
initial | |||||
begin | |||||
rst= 1; | |||||
#2 rst = 0; | |||||
repeat (20) | |||||
begin | |||||
#5 clk=0;#5 clk=1; | |||||
end | |||||
end | |||||
initial | |||||
begin | |||||
for (k=0; k<31; k=k+1) | |||||
begin | |||||
riscv.Decode.Registers.Register[k] = k; | |||||
end | |||||
for (l = 0; l <1024 ; l = l+1) | |||||
begin | |||||
riscv.Memory.Data_Memory.mem[l] = l; | |||||
end | |||||
end | |||||
initial begin | |||||
/* | |||||
//Control and data | |||||
//riscv.PC_Reg = 10'b0; | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00208AB3; // ADD X21 X1 X2 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h00B08113; // ADDI X2 X1 11 | |||||
riscv.Fetch.IMem.Mem[8] = 32'h015A49B3; // XOR X19 X20 X21 | |||||
riscv.Fetch.IMem.Mem[12] = 32'hFE059AE3; // BNE X13 X0 -12 | |||||
riscv.Fetch.IMem.Mem[16] = 32'h41078733; // SUB X14, X15, X16 | |||||
*/ | |||||
/* | |||||
//Signed and Unsigned | |||||
riscv.Fetch.IMem.Mem[0] = 32'hFFF4A513; // SLTI X10,X9,-1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'hFFF4B513; // SLTUI X10,X9,-1 | |||||
*/ | |||||
/* | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00158693; // ADDI X13, X11,1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h41078733; // SUB X14, X15, X16 | |||||
riscv.Fetch.IMem.Mem[8] = 32'hC2211363; // BEQ X0, X0, 0 | |||||
riscv.Fetch.IMem.Mem[12] = 32'h0128F833; // AND X16, X17, X18 | |||||
riscv.Fetch.IMem.Mem[16] = 32'h015A49B3; // XOR X19, X20, X21 | |||||
*/ | |||||
/* | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00108113; // ADDI X2,X1,1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h00508167; // JALR X2,X1,5 | |||||
*/ | |||||
/* | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00108113; // ADDI X2,X1,1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h22200CEF; // JAL X25,0X00000111 | |||||
*/ | |||||
/* | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00108113; // ADDI X2,X1,1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h12346B17; // AUIPC X22,12346 | |||||
*/ | |||||
/* | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00108113; // ADDI X2,X1,1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h12345B37; // LUI X22,12345 | |||||
/* | |||||
//Store, R, Load | |||||
//riscv.PCF = 32'h00000000; | |||||
riscv.Fetch.IMem.Mem[0] = 32'h01508123; // SB X21,X1,2 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h01619223; // SH X22,X3,4 | |||||
riscv.Fetch.IMem.Mem[8] = 32'h0172A323; // SW X23,X5,6 | |||||
riscv.Fetch.IMem.Mem[12] = 32'h0083AC33; // SLT X24,X7,8 | |||||
riscv.Fetch.IMem.Mem[16] = 32'h00A4BCB3; // SLTU X25,X9,10 | |||||
riscv.Fetch.IMem.Mem[20] = 32'h00C5CD33; // XOR X26,X11,12 | |||||
riscv.Fetch.IMem.Mem[24] = 32'h00E6DDB3; // SRL X27,X13,14 | |||||
riscv.Fetch.IMem.Mem[28] = 32'h4107DE33; // SRA X28,X15,16 | |||||
riscv.Fetch.IMem.Mem[32] = 32'h0128EEB3; // OR X29,X17,18 | |||||
riscv.Fetch.IMem.Mem[36] = 32'h0149FF33; // AND X30,X19,20 | |||||
riscv.Fetch.IMem.Mem[40] = 32'h00110083; // LB X1,X2,1 | |||||
riscv.Fetch.IMem.Mem[44] = 32'h00321183; // LH X3,X4,3 | |||||
riscv.Fetch.IMem.Mem[48] = 32'h00532283; // LW X5,X6,5 | |||||
*/ | |||||
/* | |||||
//LOAD TYPE | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00110083; // LB X1,X2,1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h00121183; // LH X3,X4,1 | |||||
riscv.Fetch.IMem.Mem[8] = 32'h00132283; // LW X5,X6,1 | |||||
riscv.Fetch.IMem.Mem[12] = 32'h00144383; // LBU X7,X8,1 | |||||
riscv.Fetch.IMem.Mem[16] = 32'h00155483; // LHU X9,X10,1 | |||||
*/ | |||||
/* | |||||
//STORE TYPE | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00110023; // SB X2,X1,0 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h00321123; // SH X4,X3,2 | |||||
riscv.Fetch.IMem.Mem[8] = 32'h005321A3; // SW X6,X5,3 | |||||
*/ | |||||
//REGISTER TYPE | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00208AB3; // ADD X21,X1,2 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h40418B33; // SUB X22,X3,4 | |||||
riscv.Fetch.IMem.Mem[8] = 32'h00629BB3; // SLL X23,X5,6 | |||||
riscv.Fetch.IMem.Mem[12] = 32'h0083AC33; // SLT X24,X7,8 | |||||
riscv.Fetch.IMem.Mem[16] = 32'h00A4BCB3; // SLTU X25,X9,10 | |||||
riscv.Fetch.IMem.Mem[20] = 32'h00C5CD33; // XOR X26,X11,12 | |||||
riscv.Fetch.IMem.Mem[24] = 32'h00E6DDB3; // SRL X27,X13,14 | |||||
riscv.Fetch.IMem.Mem[28] = 32'h4107DE33; // SRA X28,X15,16 | |||||
riscv.Fetch.IMem.Mem[32] = 32'h0128EEB3; // OR X29,X17,18 | |||||
riscv.Fetch.IMem.Mem[36] = 32'h0149FF33; // AND X30,X19,20 | |||||
/* | |||||
//IMMEDIATE INSTRUCTIONS | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00108113; // ADDI X2,X1,1 | |||||
riscv.Fetch.IMem.Mem[4] = 32'h00219213; // SLLI X4,X3,2 | |||||
riscv.Fetch.IMem.Mem[8] = 32'h0032A313; // SLTI X6,X5,3 | |||||
riscv.Fetch.IMem.Mem[12] = 32'h8003B413; // SLTUI X8,X7,'h800 | |||||
riscv.Fetch.IMem.Mem[16] = 32'h0054C513; // XORI X10,X9,5 | |||||
riscv.Fetch.IMem.Mem[20] = 32'h0065D613; // SRLI X12,X11,6 | |||||
riscv.Fetch.IMem.Mem[24] = 32'h0076D713; // SRAI X14,X13,7 | |||||
riscv.Fetch.IMem.Mem[28] = 32'h0087E813; // ORI X16,X15,8 | |||||
riscv.Fetch.IMem.Mem[32] = 32'h0098F913; // ANDI X18,X17,9 | |||||
*/ | |||||
/* | |||||
riscv.Fetch.IMem.Mem[0] = 32'h00200193; // ADDI X3,X0,2 | |||||
riscv.Fetch.IMem.Mem[4] = 32'hFFE00193; // ADDI X3,X0,-2 | |||||
*/ | |||||
/* | |||||
//control hazard | |||||
riscv.PC_Reg = 10'b0; | |||||
riscv.Instructionmemory.IMem[0] = 32'h00158693; // ADDI X13, X11,1 | |||||
riscv.Instructionmemory.IMem[4] = 32'h41078733; // SUB X14, X15, X16 | |||||
riscv.Instructionmemory.IMem[8] = 32'hFE0698E3; // BNE X13, X0, -8 | |||||
// riscv.Instructionmemory.IMem[8] = 32'h00069063; // BNE X13, X0, 0 | |||||
riscv.Instructionmemory.IMem[12] = 32'h0128F833; // AND X16, X17, X18 | |||||
riscv.Instructionmemory.IMem[16] = 32'h015A49B3; // XOR X19, X20, X21 | |||||
*/ | |||||
/* | |||||
riscv.PC_Reg = 10'b0; | |||||
riscv.Instructionmemory.IMem[0] = 32'h00A08113; // ADDI X2, X1,10 | |||||
riscv.Instructionmemory.IMem[4] = 32'h00B18233; // ADD X4, X3,X11 | |||||
riscv.Instructionmemory.IMem[8] = 32'h00C2E333; // OR X6, X5,X12 | |||||
riscv.Instructionmemory.IMem[12] = 32'h015822A3; // STORE OPERATION SW X8, X21, 5 | |||||
riscv.Instructionmemory.IMem[16] = 32'h00A3A403; // LOAD OPERATION LW X8, X7, 10 | |||||
riscv.Instructionmemory.IMem[20] = 32'h00D49533; // SLL X10, X9, X13 | |||||
riscv.Instructionmemory.IMem[24] = 32'hFEF718E3; // BNE X14, X15,8 | |||||
riscv.Instructionmemory.IMem[28] = 32'h00000013; // ADD1 X0, X0 0 | |||||
*/ | |||||
/*riscv.Instructionmemory.IMem[4] = 32'h00A18213; | |||||
riscv.Instructionmemory.IMem[8] = 32'h00A28313; | |||||
riscv.Instructionmemory.IMem[12] = 32'h00A38413; | |||||
riscv.Instructionmemory.IMem[16] = 32'h00A48513; | |||||
riscv.Instructionmemory.IMem[20] = 32'h00A58613; | |||||
riscv.Instructionmemory.IMem[24] = 32'h00000013; | |||||
riscv.Instructionmemory.IMem[28] = 32'h00A18113; | |||||
riscv.Instructionmemory.IMem[32] = 32'h00A10213; | |||||
riscv.Instructionmemory.IMem[36] = 32'h00000013; | |||||
riscv.Instructionmemory.IMem[40] = 32'h00A08113; | |||||
riscv.Instructionmemory.IMem[32] = 32'h00000013; | |||||
riscv.Instructionmemory.IMem[36] = 32'h00000013; | |||||
riscv.Instructionmemory.IMem[40] = 32'h00000013; | |||||
riscv.Instructionmemory.IMem[44] = 32'h00000013; | |||||
riscv.Instructionmemory.IMem[48] = 32'h00000013; | |||||
riscv.Instructionmemory.IMem[0] = 32'h00A08113; | |||||
riscv.Instructionmemory.IMem[4] = 32'h00F18213; | |||||
riscv.Instructionmemory.IMem[8] = 32'h00B28333; | |||||
riscv.Instructionmemory.IMem[12] = 32'h40C38433; | |||||
riscv.Instructionmemory.IMem[16] = 32'h00D4F533; | |||||
*/ | |||||
end | |||||
initial begin | |||||
#200 $finish; | |||||
end | |||||
endmodule |
@@ -0,0 +1,19 @@ | |||||
module Program_Counter(clk,rst,enable,PC,PC_Next); | |||||
input clk, rst, enable; | |||||
input [31:0]PC_Next; | |||||
output reg [31:0]PC; | |||||
wire [31:0]PC_temp; | |||||
assign PC_temp = PC; | |||||
always@(posedge clk or posedge enable or posedge rst) | |||||
begin | |||||
if(rst==1) | |||||
PC <= 32'h00000000; | |||||
else if(enable == 1) // for Data Hazard | |||||
PC <= PC_temp; | |||||
else | |||||
PC <= PC_Next; | |||||
end | |||||
endmodule |
@@ -0,0 +1,21 @@ | |||||
module Register_File(clk,rst,WE3,WD3,A1,A2,A3,RD1,RD2); | |||||
input clk,rst,WE3; | |||||
input [4:0]A1,A2,A3; | |||||
input [31:0]WD3; | |||||
output [31:0]RD1,RD2; | |||||
reg [31:0] Register [31:0]; | |||||
always @ (posedge clk) | |||||
begin | |||||
if(WE3 & (A3 != 5'b00000)) | |||||
Register[A3] <= WD3; | |||||
end | |||||
assign RD1 = (rst==1'b1) ? 32'h00000000 : Register[A1]; | |||||
assign RD2 = (rst==1'b1) ? 32'h00000000 : Register[A2]; | |||||
initial begin | |||||
Register[0] = 32'h00000000; | |||||
end | |||||
endmodule |
@@ -0,0 +1,22 @@ | |||||
module Sign_Extension(Instruction, Imm); | |||||
input [31:0] Instruction; | |||||
output [31:0]Imm; | |||||
parameter [6:0]r_to_imm = 7'b0010011, | |||||
ld = 7'b0000011, | |||||
store = 7'b0100011, | |||||
// upperimm = 7'b0110111, | |||||
// upperjump = 7'b1101111, | |||||
branch = 7'b1100011, | |||||
lui = 7'b0110111, | |||||
Auipc = 7'b0010111, | |||||
jal = 7'b1101111, | |||||
jalr = 7'b1100111; | |||||
assign Imm = (Instruction[6:0] == r_to_imm || Instruction[6:0] == ld || Instruction[6:0] == jalr) ? {{20{Instruction [31]}}, Instruction[31:20]} : | |||||
(Instruction[6:0] == store) ? {{20{Instruction [31]}}, Instruction[31:25], Instruction [11:7]}: | |||||
(Instruction[6:0] == branch) ? {{19{Instruction [31]}}, Instruction[31], Instruction [7], Instruction[30:25], Instruction [11:8],1'b0} : | |||||
(Instruction[6:0] == lui || Instruction[6:0] == Auipc) ? {Instruction[31:12], {12'b0}} : | |||||
(Instruction[6:0] == jal) ? {{12{Instruction[31]}}, Instruction[19:12], Instruction[20], Instruction[30:21],1'b0}: 32'b0; | |||||
endmodule |
@@ -0,0 +1,9 @@ | |||||
module Store_Extension(WriteData_E_temp,Operation,WriteData_E); | |||||
input [31:0] WriteData_E_temp; | |||||
input [2:0]Operation; | |||||
output [31:0] WriteData_E; | |||||
assign WriteData_E = (Operation == 3'b000)? WriteData_E_temp[7:0] : | |||||
(Operation == 3'b001)? WriteData_E_temp[15:0]: | |||||
(Operation == 3'b010)? WriteData_E_temp : 32'hxxxxxxxx; | |||||
endmodule |
@@ -0,0 +1,15 @@ | |||||
module Writeback_cycle(Result_Select_W, Alu_Result_W, ReadData_W, Result_W); | |||||
// Declaration of Inputs and Outputs | |||||
input Result_Select_W; | |||||
input [31:0] Alu_Result_W, ReadData_W; | |||||
output [31:0] Result_W; | |||||
// Declaration of Module | |||||
mux2_1 result_mux(.a(Alu_Result_W), | |||||
.b(ReadData_W), | |||||
.s(Result_Select_W), | |||||
.y(Result_W) | |||||
); | |||||
endmodule |
@@ -0,0 +1,6 @@ | |||||
module mux2_1(y,s,a,b); | |||||
input [31:0]a,b; | |||||
input s; | |||||
output [31:0]y; | |||||
assign y = (s==0)?a:b; | |||||
endmodule |
@@ -0,0 +1,8 @@ | |||||
module mux3_1(a,b,c,s,y); | |||||
input [31:0] a,b,c; | |||||
input [1:0] s; | |||||
output [31:0] y; | |||||
assign y = (s == 2'b00) ? a: | |||||
(s == 2'b01) ? b: | |||||
(s == 2'b10) ? c: 32'hxxxxxxxx; | |||||
endmodule |