| @@ -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 | |||