P5 - Verilog流水線CPU
阿新 • • 發佈:2018-12-31
1 module mips( 2 input clk, 3 input reset 4 ); 5 6 //F級 7 wire [31:0] NewPC; 8 wire [31:0] PC_F; 9 wire Stop; 10 PC PC_P5 ( 11 .Clock(clk), 12 .Reset(reset), 13 .Stop(Stop), 14 .NextPC(NewPC), 15 .PC(PC_F) 16 ); 17 18 wire[31:0] IR_F; 19 IM IM_P5 ( 20 .Address(PC_F[11:2]), 21 .Instr(IR_F) 22 ); 23 24 wire [31:0] IR_D; 25 wire [31:0] PC_D; 26 Reg_D Reg_D_P5 ( 27 .Clock(clk), 28 .Reset(reset), 29 .Enable(Stop), 30 .IR_F(IR_F), 31 .PC_F(PC_F), 32 .IR_D(IR_D),33 .NPC_D(PC_D) 34 ); 35 //D級 36 37 //D級 38 wire [1:0] RegDst_D; 39 wire RegWrite_D; 40 wire ALUSrc_D; 41 wire MemWrite_D; 42 wire [1:0]MemtoReg_D; 43 wire [1:0] ExtOp_D; 44 wire [3:0] ALUOp_D; 45 wire [2:0] NPCOp_D; 46 ctrl D_ctrl_P5 ( 47 .Op(IR_D[31:26]), 48 .Func(IR_D[5:0]), 49 .RegDst(RegDst_D), 50 .RegWrite(RegWrite_D), 51 .ALUSrc(ALUSrc_D), 52 .MemWrite(MemWrite_D), 53 .MemtoReg(MemtoReg_D), 54 .ExtOp(ExtOp_D), 55 .ALUOp(ALUOp_D), 56 .NPCOp(NPCOp_D) 57 ); 58 59 //forward 60 wire [31:0] WriteData; 61 wire [31:0] PC_E; 62 wire [31:0] AO_M; 63 wire [31:0] PC_M; 64 65 wire [31:0] RD1; 66 wire [2:0] RSDsel; 67 wire [31:0] ReadData1; 68 mux_5_32 MFRSD_P5 ( 69 .a(ReadData1), 70 .b(WriteData), 71 .c(PC_M+8), 72 .d(AO_M), 73 .e(PC_E+8), 74 .select(RSDsel), 75 .y(RD1) 76 ); 77 wire [31:0] RD2; 78 wire [2:0] RTDsel; 79 wire [31:0] ReadData2; 80 mux_5_32 MFRTD_P5 ( 81 .a(ReadData2), 82 .b(WriteData), 83 .c(PC_M+8), 84 .d(AO_M), 85 .e(PC_E+8), 86 .select(RTDsel), 87 .y(RD2) 88 ); 89 //forward 90 91 NPC NPC_P5 ( 92 .Instr(IR_D[25:0]), 93 .PC_F(PC_F), 94 .PC_D(PC_D), 95 .rs(RD1), 96 .A(RD1), 97 .B(RD2), 98 .NPCOp(NPCOp_D), 99 .npc(NewPC) 100 ); 101 102 wire RegWrite_W; 103 wire [4:0] A3_W; 104 wire [31:0] PC_W; 105 GRF GRF_P5 ( 106 .Clock(clk), 107 .Reset(reset), 108 .RegWrite(RegWrite_W), 109 .ReadReg1(IR_D[25:21]), 110 .ReadReg2(IR_D[20:16]), 111 .WriteReg(A3_W), 112 .WriteData(WriteData), 113 .WPC(PC_W), 114 .ReadData1(ReadData1), 115 .ReadData2(ReadData2) 116 ); 117 118 wire [31:0] EXTOut; 119 EXT EXT_P5 ( 120 .Imm_16(IR_D[15:0]), 121 .ExtOp(ExtOp_D), 122 .Imm_32(EXTOut) 123 ); 124 125 wire [31:0] IR_E; 126 wire [31:0] V1_E; 127 wire [31:0] V2_E; 128 wire [31:0] E32_E; 129 wire [4:0] A1_E; 130 wire [4:0] A2_E; 131 wire [4:0] A3_E; 132 Reg_E Reg_E_P5 ( 133 .Clock(clk), 134 .Reset(reset | Stop), 135 .IR_D(IR_D), 136 .RF_RD1(ReadData1), 137 .RF_RD2(ReadData2), 138 .PC4_D(PC_D), 139 .EXT(EXTOut), 140 .Rs_IR_D(IR_D[25:21]), 141 .Rt_IR_D(IR_D[20:16]), 142 .Rd_IR_D(IR_D[15:11]), 143 .IR_E(IR_E), 144 .V1_E(V1_E), 145 .V2_E(V2_E), 146 .A1_E(A1_E), 147 .A2_E(A2_E), 148 .A3_E(A3_E), 149 .E32_E(E32_E), 150 .PC4_E(PC_E) 151 ); 152 //E級 153 154 //E級 155 wire [1:0] RegDst_E; 156 wire RegWrite_E; 157 wire ALUSrc_E; 158 wire MemWrite_E; 159 wire [1:0]MemtoReg_E; 160 wire [1:0] ExtOp_E; 161 wire [3:0] ALUOp_E; 162 wire [2:0] NPCOp_E; 163 ctrl E_ctrl_P5 ( 164 .Op(IR_E[31:26]), 165 .Func(IR_E[5:0]), 166 .RegDst(RegDst_E), 167 .RegWrite(RegWrite_E), 168 .ALUSrc(ALUSrc_E), 169 .MemWrite(MemWrite_E), 170 .MemtoReg(MemtoReg_E), 171 .ExtOp(ExtOp_E), 172 .ALUOp(ALUOp_E), 173 .NPCOp(NPCOp_E) 174 ); 175 176 //forward 177 wire [31:0] ALU_A; 178 wire [2:0] RSEsel; 179 mux_4_32 MFRSE_P5 ( 180 .a(V1_E), 181 .b(WriteData), 182 .c(PC_M+8), 183 .d(AO_M), 184 .select(RSEsel), 185 .y(ALU_A) 186 ); 187 wire [31:0] ALU_B; 188 wire [2:0] RTEsel; 189 mux_4_32 MFRTE_P5 ( 190 .a(V2_E), 191 .b(WriteData), 192 .c(PC_M+8), 193 .d(AO_M), 194 .select(RTEsel), 195 .y(ALU_B) 196 ); 197 198 wire [31:0] ALU_B_E32; 199 assign ALU_B_E32 = (ALUSrc_E == 0) ? ALU_B : E32_E; 200 //forward 201 202 wire [31:0] ALUOut; 203 wire Zero; 204 ALU ALU_P5 ( 205 .A(ALU_A), 206 .B(ALU_B_E32), 207 .ALUOp(ALUOp_E), 208 .Zero(Zero), 209 .Result(ALUOut) 210 ); 211 212 wire [31:0] IR_M; 213 wire [31:0] V2_M; 214 wire [4:0] WriteReg; 215 mux_3_5 A3_Mux_P5 ( 216 .a(A2_E), 217 .b(A3_E), 218 .c(5'h1f), 219 .select(RegDst_E), 220 .y(WriteReg) 221 ); 222 223 wire [4:0] A3_M; 224 Reg_M Reg_M_P5 ( 225 .Clock(clk), 226 .Reset(reset), 227 .ALUOut(ALUOut), 228 .ALU_B(ALU_B), 229 .IR_E(IR_E), 230 .PC4_E(PC_E), 231 .A3_E(WriteReg), 232 .IR_M(IR_M), 233 .V2_M(V2_M), 234 .AO_M(AO_M), 235 .A3_M(A3_M), 236 .PC4_M(PC_M) 237 ); 238 //M級 239 240 //M級 241 wire [1:0] RegDst_M; 242 wire RegWrite_M; 243 wire ALUSrc_M; 244 wire MemWrite_M; 245 wire [1:0]MemtoReg_M; 246 wire [1:0] ExtOp_M; 247 wire [3:0] ALUOp_M; 248 wire [2:0] NPCOp_M; 249 ctrl M_ctrl_P5 ( 250 .Op(IR_M[31:26]), 251 .Func(IR_M[5:0]), 252 .RegDst(RegDst_M), 253 .RegWrite(RegWrite_M), 254 .ALUSrc(ALUSrc_M), 255 .MemWrite(MemWrite_M), 256 .MemtoReg(MemtoReg_M), 257 .ExtOp(ExtOp_M), 258 .ALUOp(ALUOp_M), 259 .NPCOp(NPCOp_M) 260 ); 261 262 //forward 263 wire [31:0] WriteData_DM; 264 wire [2:0] RTMsel; 265 assign WriteData_DM = (RTMsel == 1) ? WriteData : V2_M; 266 //forward 267 268 wire [31:0] ReadData_DM; 269 DM DM_P5 ( 270 .Clock(clk), 271 .Reset(reset), 272 .MemWrite(MemWrite_M), 273 .Address(AO_M[11:2]), 274 .WriteData(WriteData_DM), 275 .pc(PC_M), 276 .addr(AO_M), 277 .ReadData(ReadData_DM) 278 ); 279 280 wire [31:0] IR_W; 281 wire [31:0] AO_W; 282 wire [31:0] DR_W; 283 Reg_W Reg_W_P5 ( 284 .Clock(clk), 285 .Reset(reset), 286 .IR_M(IR_M), 287 .A3_M(A3_M), 288 .AO_M(AO_M), 289 .PC4_M(PC_M), 290 .DMOut(ReadData_DM), 291 .IR_W(IR_W), 292 .A3_W(A3_W), 293 .PC4_W(PC_W), 294 .AO_W(AO_W), 295 .DR_W(DR_W) 296 ); 297 //W級 298 299 //W級 300 wire [1:0] RegDst_W; 301 wire ALUSrc_W; 302 wire MemWrite_W; 303 wire [1:0] MemtoReg_W; 304 wire [1:0] ExtOp_W; 305 wire [3:0] ALUOp_W; 306 wire [2:0] NPCOp_W; 307 ctrl W_ctrl_P5 ( 308 .Op(IR_W[31:26]), 309 .Func(IR_W[5:0]), 310 .RegDst(RegDst_W), 311 .RegWrite(RegWrite_W), 312 .ALUSrc(ALUSrc_W), 313 .MemWrite(MemWrite_W), 314 .MemtoReg(MemtoReg_W), 315 .ExtOp(ExtOp_W), 316 .ALUOp(ALUOp_W), 317 .NPCOp(NPCOp_W) 318 ); 319 320 mux_3_32 MemtoReg_Mux_P5 ( 321 .a(AO_W), 322 .b(DR_W), 323 .c(PC_W+8), 324 .select(MemtoReg_W), 325 .y(WriteData) 326 ); 327 //W級 328 329 //衝突 330 Forward Forward_P5 ( 331 .IR_D(IR_D), 332 .IR_E(IR_E), 333 .IR_M(IR_M), 334 .IR_W(IR_W), 335 .RSDsel(RSDsel), 336 .RTDsel(RTDsel), 337 .RSEsel(RSEsel), 338 .RTEsel(RTEsel), 339 .RTMsel(RTMsel) 340 ); 341 342 Stop Stop_P5 ( 343 .IR_D(IR_D), 344 .IR_E(IR_E), 345 .IR_M(IR_M), 346 .Stop(Stop) 347 ); 348 //衝突 349 350 endmodule
1 module PC( 2 input Clock, 3 input Reset, 4 input Stop, 5 input [31:0] NextPC, 6 output reg [31:0] PC 7 ); 8 9 initial begin 10 PC = 32'h0000_3000; 11 end 12 13 always @ (posedge Clock) begin 14 if(Reset == 1) 15 PC = 32'h0000_3000; 16 else if(Stop == 1) 17 PC = PC; 18 else 19 PC = NextPC; 20 end 21 22 endmodule
1 module IM( 2 input [9:0] Address, 3 output [31:0] Instr 4 ); 5 6 reg [31:0] memory [1023:0]; 7 integer i; 8 9 initial begin 10 for(i = 0; i < 1024; i = i + 1) 11 memory[i] = 32'h0; 12 $readmemh("code.txt",memory); 13 end 14 15 assign Instr = memory[Address]; 16 17 endmodule
1 module Reg_D( 2 input Clock, 3 input Reset, 4 input Enable, 5 input [31:0] IR_F, 6 input [31:0] PC_F, 7 output reg [31:0] IR_D, 8 output reg [31:0] NPC_D 9 ); 10 11 initial begin 12 IR_D = 0; 13 NPC_D = 0; 14 end 15 16 always @ (posedge Clock) begin 17 if(Reset == 1) begin 18 IR_D <= 0; 19 NPC_D <= 0; 20 end 21 else if(Enable == 1) begin 22 IR_D <= IR_D; 23 NPC_D <= NPC_D; 24 end 25 else begin 26 IR_D <= IR_F; 27 NPC_D <= PC_F; 28 end 29 end 30 31 endmodule
1 module ctrl( 2 input [5:0] Op, 3 input [5:0] Func, 4 output [1:0] RegDst, 5 output RegWrite, 6 output ALUSrc, 7 output MemWrite, 8 output [1:0]MemtoReg, 9 output [1:0] ExtOp, 10 output [3:0] ALUOp, 11 output [2:0] NPCOp 12 ); 13 initial begin 14 regdst = 2'b00; 15 regwrite = 0; 16 alusrc = 0; 17 memwrite = 0; 18 memtoreg = 2'b00; 19 extop = 2'b00; 20 aluop = 4'b0000; 21 npcop = 3'b000; 22 end 23 24 reg [1:0] regdst; 25 reg regwrite; 26 reg alusrc; 27 reg memwrite; 28 reg [1:0] memtoreg; 29 reg [1:0] extop; 30 reg [3:0] aluop; 31 reg [2:0] npcop; 32 33 parameter addu_f = 6'b100001, 34 subu_f = 6'b100011, 35 jr_f = 6'b001000, 36 ori = 6'b001101, 37 lw = 6'b100011, 38 sw = 6'b101011, 39 beq = 6'b000100, 40 lui = 6'b001111, 41 j = 6'b000010, 42 jal = 6'b000011; 43 44 always @ (Op or Func) begin 45 case(Op) 46 0: begin 47 case(Func) 48 addu_f: begin 49 regdst = 2'b01; 50 regwrite = 1; 51 alusrc = 0; 52 memwrite = 0; 53 memtoreg = 2'b00; 54 extop = 2'bxx; 55 aluop = 4'b0000; 56 npcop = 3'b000; 57 end 58 subu_f: begin 59 regdst = 2'b01; 60 regwrite = 1; 61 alusrc = 0; 62 memwrite = 0; 63 memtoreg = 2'b00; 64 extop = 2'bxx; 65 aluop = 4'b0001; 66 npcop = 3'b000; 67 end 68 jr_f: begin 69 regdst = 2'bxx; 70 regwrite = 0; 71 alusrc = 1'bx; 72 memwrite = 0; 73 memtoreg = 2'bxx; 74 extop = 2'bxx; 75 aluop = 4'bxxxx; 76 npcop = 3'b011; 77 end 78 default: begin 79 regdst = 2'b00; 80 regwrite = 0; 81 alusrc = 0; 82 memwrite = 0; 83 memtoreg = 2'b00; 84 extop = 2'b00; 85 aluop = 4'b0000; 86 npcop = 3'b000; 87 end 88 endcase 89 end 90 ori: begin 91 regdst = 2'b00; 92 regwrite = 1; 93 alusrc = 1; 94 memwrite = 0; 95 memtoreg = 2'b00; 96 extop = 2'b01; 97 aluop = 4'b0010; 98 npcop = 3'b000; 99 end 100 lw: begin 101 regdst = 2'b00; 102 regwrite = 1; 103 alusrc = 1; 104 memwrite = 0; 105 memtoreg = 2'b01; 106 extop = 2'b00; 107 aluop = 4'b0000; 108 npcop = 3'b000; 109 end 110 sw: begin 111 regdst = 2'bxx; 112 regwrite = 0; 113 alusrc = 1; 114 memwrite = 1; 115 memtoreg = 2'bxx; 116 extop = 2'b00; 117 aluop = 4'b0000; 118 npcop = 3'b000; 119 end 120 beq: begin 121 regdst = 2'bxx; 122 regwrite = 0; 123 alusrc = 0; 124 memwrite = 0; 125 memtoreg = 2'b00; 126 extop = 2'b00; 127 aluop = 4'b0001; 128 npcop = 3'b001; 129 end 130 lui: begin 131 regdst = 2'b00; 132 regwrite = 1; 133 alusrc = 1; 134 memwrite = 0; 135 memtoreg = 2'b00; 136 extop = 2'b10; 137 aluop = 4'b0000; 138 npcop = 3'b000; 139 end 140 jal: begin 141 regdst = 2'b10; 142 regwrite = 1; 143 alusrc = 1'bx; 144 memwrite = 0; 145 memtoreg = 2'b10; 146 extop = 2'b11; 147 aluop = 4'b0000; 148 npcop = 3'b010; 149 end 150 j : begin 151 regdst = 2'bxx; 152 regwrite = 0; 153 alusrc = 1'bx; 154 memwrite = 0; 155 memtoreg = 2'bxx; 156 extop = 2'bxx; 157 aluop = 4'bxxxx; 158 npcop = 3'b010; 159 end 160 endcase 161 end 162 163 assign RegDst = regdst; 164 assign RegWrite = regwrite; 165 assign ALUSrc = alusrc; 166 assign MemWrite = memwrite; 167 assign MemtoReg = memtoreg; 168 assign ExtOp = extop; 169 assign ALUOp = aluop; 170 assign NPCOp = npcop; 171 172 173 endmodule
1 module NPC( 2 input [25:0] Instr, 3 input [31:0] PC_F, 4 input [31:0] PC_D, 5 input [31:0] rs, 6 input [31:0] A, 7 input [31:0] B, 8 input [2:0] NPCOp, 9 output [31:0] npc 10 ); 11 12 wire [15:0] offset; 13 wire [31:0] PC_F4; 14 wire [31:0] PC_D4; 15 wire Zero; 16 parameter other = 3'b000, 17 beq = 3'b001, 18 jal_j = 3'b010, 19 jr = 3'b011; 20 21 assign offset = Instr[15:0]; 22 assign Zero = (A == B); 23 24 assign PC_F4 = PC_F + 4; 25 assign PC_D4 = PC_D + 4; 26 27 28 assign npc = (NPCOp == other) ? PC_F4 : 29 ((NPCOp == beq) & (Zero == 1)) ? PC_D4 + {{14{offset[15]}},offset,2'b00} : 30 (NPCOp == jal_j) ? {PC_D[31:28],Instr,2'b00} : 31 (NPCOp == jr) ? rs : 32 PC_D4 + 4; 33 34 endmodule
1 module GRF( 2 input Clock, 3 input Reset, 4 input RegWrite, 5 input [4:0] ReadReg1, 6 input [4:0] ReadReg2, 7 input [4:0] WriteReg, 8 input [31:0] WriteData, 9 input [31:0] WPC, 10 output [31:0] ReadData1, 11 output [31:0] ReadData2 12 ); 13 14 reg [31:0] register[31:0]; 15 integer i; 16 17 initial begin 18 for(i = 0; i < 32; i = i + 1) 19 register[i] = 0; 20 end 21 22 assign ReadData1 = (ReadReg1 == WriteReg && WriteReg != 0 && RegWrite == 1) ? WriteData : register[ReadReg1]; 23 assign ReadData2 = (ReadReg2 == WriteReg && WriteReg != 0 && RegWrite == 1) ? WriteData : register[ReadReg2]; 24 25 always @ (posedge Clock) begin 26 if(Reset == 1) 27 for(i = 0; i < 32; i = i + 1) 28 register[i] = 32'h0; 29 else if(RegWrite == 1 && WriteReg != 0) begin 30 register[WriteReg] = WriteData; 31 $display("%[email protected]%h: $%d <= %h", $time, WPC, WriteReg,WriteData); 32 end 33 end 34 35 endmodule
1 module EXT( 2 input [15:0] Imm_16, 3 input [1:0] ExtOp, 4 output [31:0] Imm_32 5 ); 6 7 parameter sign = 2'b00, 8 zero = 2'b01, 9 high = 2'b10, 10 sign_left_2 = 2'b11; 11 12 assign Imm_32 = (ExtOp == sign) ? {{16{Imm_16[15]}},Imm_16} : 13 (ExtOp == zero) ? {{16'b0}, Imm_16} : 14 (ExtOp == high) ? {Imm_16,{16'b0}} : 15 {{14{Imm_16[15]}},Imm_16,2'b00}; 16 17 endmodule
1 module Reg_E( 2 input Clock, 3 input Reset, 4 input [31:0] IR_D, 5 input [31:0] RF_RD1, 6 input [31:0] RF_RD2, 7 input [31:0] PC4_D, 8 input [31:0] EXT, 9 input [4:0] Rs_IR_D, 10 input [4:0] Rt_IR_D, 11 input [4:0] Rd_IR_D, 12 output reg [31:0] IR_E, 13 output reg [31:0] V1_E, 14 output reg [31:0] V2_E, 15 output reg [4:0] A1_E, 16 output reg [4:0] A2_E, 17 output reg [4:0] A3_E, 18 output reg [31:0] E32_E, 19 output reg [31:0] PC4_E 20 ); 21 22 always @ (posedge Clock) begin 23 if(Reset == 1) begin 24 IR_E <= 0; 25 V1_E <= 0; 26 V2_E <= 0; 27 A1_E <= 0; 28 A2_E <= 0; 29 A3_E <= 0; 30 E32_E <= 0; 31 PC4_E <= 32'h0000_3000; 32 end 33 else begin 34 IR_E <= IR_D; 35 V1_E <= RF_RD1; 36 V2_E <= RF_RD2; 37 A1_E <= Rs_IR_D; 38 A2_E <= Rt_IR_D; 39 A3_E <= Rd_IR_D; 40 E32_E <= EXT; 41 PC4_E <= PC4_D; 42 end 43 end 44 45 endmodule
1 module ALU( 2 input [31:0] A, 3 input [31:0] B, 4 input [3:0] ALUOp, 5 output Zero, 6 output [31:0] Result 7 ); 8 9 parameter addu = 4'b0000, 10 subu = 4'b0001, 11 orr = 4'b0010; 12 13 assign Result = (ALUOp == addu) ? (A + B) : 14 (ALUOp == subu) ? (A - B) : 15 (A | B); 16 17 assign Zero = (A - B == 0) ? 1 : 0; 18 19 20 endmodule
1 module Reg_M( 2 input Clock, 3 input Reset, 4 input [31:0] ALUOut, 5 input [31:0] ALU_B, 6 input [31:0] IR_E, 7 input [31:0] PC4_E, 8 input [4:0] A3_E, 9 output reg [31:0] IR_M, 10 output reg [31:0] V2_M, 11 output reg [31:0] AO_M, 12 output reg [4:0] A3_M, 13 output reg [31:0] PC4_M 14 ); 15 16 always @ (posedge Clock) begin 17 if(Reset == 1) begin 18 IR_M <= 0; 19 V2_M <= 0; 20 AO_M <= 0; 21 A3_M <= 0; 22 PC4_M <= 32'h0000_3000; 23 end 24 else begin 25 IR_M <= IR_E; 26 V2_M <= ALU_B; 27 AO_M <= ALUOut; 28 A3_M <= A3_E; 29 PC4_M <= PC4_E; 30 end 31 end 32 33 endmodule
1 module DM( 2 input Clock, 3 input Reset, 4 input MemWrite, 5 input [9:0] Address, 6 input [31:0] WriteData, 7 input [31:0] pc, 8 input [31:0] addr, 9 output[31:0] ReadData 10 ); 11 12 reg [31:0] memory[1023:0]; 13 integer i; 14 15 initial begin 16 for(i = 0; i < 1023; i = i + 1) 17 memory[i] <= 32'h0; 18 end 19 20 assign ReadData = memory[Address]; 21 22 always @ (posedge Clock) begin 23 if(Reset == 1) 24 for(i = 0; i < 1023; i = i + 1) 25 memory[i] <= 32'h0; 26 else if(MemWrite == 1) begin 27 memory[Address] = WriteData; 28 $display("%[email protected]%h: *%h <= %h", $time, pc, addr,WriteData); 29 end 30 end 31 32 endmodule
1 module Reg_W( 2 input Clock, 3 input Reset, 4 input [31:0] IR_M, 5 input [4:0] A3_M, 6 input [31:0] AO_M, 7 input [31:0] PC4_M, 8 input [31:0] DMOut, 9 output reg [31:0] IR_W, 10 output reg [4:0] A3_W, 11 output reg [31:0] PC4_W, 12 output reg [31:0] AO_W, 13 output reg [31:0] DR_W 14 ); 15 16 always @ (posedge Clock) begin 17 if(Reset == 1) begin 18 IR_W <= 0; 19 A3_W <= 0; 20 PC4_W <= 32'h0000_3000; 21 AO_W <= 0; 22 DR_W <= 0; 23 end 24 else begin 25 IR_W <= IR_M; 26 A3_W <= A3_M; 27 PC4_W <= PC4_M; 28 AO_W <= AO_M; 29 DR_W <= DMOut; 30 end 31 end 32 33 endmodule
1 `define opcode 31:26 2 `define func 5:0 3 `define rs 25:21 4 `define rt 20:16 5 `define rd 15:11 6 module Stop( 7 input [31:0] IR_D, 8 input [31:0] IR_E, 9 input [31:0] IR_M, 10 output Stop 11 ); 12 13 parameter R = 6'b000000, 14 addu_f = 6'b100001, 15 subu_f = 6'b100011, 16 jr_f = 6'b001000, 17 ori = 6'b001101, 18 lw = 6'b100011, 19 sw = 6'b101011, 20 beq = 6'b000100, 21 lui = 6'b001111, 22 j = 6'b000010, 23 jal = 6'b000011; 24 25 wire b_D, jr_D, cal_r_D, cal_i_D, load_D, store_D; 26 wire cal_r_E, cal_i_E, load_E, store_E; 27 wire load_M; 28 29 wire [4:0] RS_D,RT_D; 30 wire [4:0] RS_E,RT_E,RD_E; 31 wire [4:0] RS_M,RT_M,RD_M; 32 33 wire stall_b_r, stall_b_i, stall_b_load, stall_b_loadM; 34 wire stall_cal_r_load; 35 wire stall_cal_i_load; 36 wire stall_load_load; 37 wire stall_store_load; 38 wire stall_jr_r, stall_jr_i, stall_jr_load, stall_jr_loadM; 39 40 assign {RS_D, RT_D} = {IR_D[`rs], IR_D[`rt]}; 41 assign {RS_E, RT_E, RD_E} = {IR_E[`rs], IR_E[`rt], IR_E[`rd]}; 42 assign {RS_M, RT_M, RD_M} = {IR_M[`rs], IR_M[`rt], IR_M[`rd]}; 43 44 assign b_D = (IR_D[`opcode] == beq); 45 assign jr_D = (IR_D[`opcode] == R) & (IR_D[`func] == jr_f); 46 assign cal_r_D = (IR_D[`opcode] == R) & (IR_D[`func] != jr_f); 47 assign cal_i_D = (IR_D[`opcode] == ori) | (IR_D[`opcode] == lui); 48 assign load_D = (IR_D[`opcode] == lw); 49 assign store_D = (IR_D[`opcode] == sw); 50 51 assign cal_r_E = (IR_E[`opcode] == R) & (IR_E[`func] != jr_f); 52 assign cal_i_E = (IR_E[`opcode] == ori) | (IR_E[`opcode] == lui); 53 assign load_E = (IR_E[`opcode] == lw); 54 assign store_E = (IR_E[`opcode] == sw); 55 56 assign load_M = (IR_M[`opcode] == lw); 57 58 assign stall_b_r = b_D & cal_r_E & ( (RS_D == RD_E) | (RT_D == RD_E) ); 59 assign stall_b_i = b_D & cal_i_E & ( (RS_D == RT_E) | (RT_D == RT_E) ); 60 assign stall_b_load = b_D & load_E & ( (RS_D == RT_E) | (RT_D == RT_E) ); 61 assign stall_b_loadM = b_D & load_M & ( (RS_D == RT_M) | (RT_D == RT_M) ); 62 63 assign stall_cal_r_load = cal_r_D & load_E & ( (RS_D == RT_E) | (RT_D == RT_E) ); 64 65 assign stall_cal_i_load = cal_i_D & load_E & (RS_D == RT_E); 66 67 assign stall_load_load = load_D & load_E & (RS_D == RT_E); 68 69 assign stall_store_load = store_D & load_E & (RS_D == RT_E); 70 71 assign stall_jr_r = jr_D & cal_r_E & (RS_D == RD_E); 72 assign stall_jr_i = jr_D & cal_i_E & (RS_D == RT_E); 73 assign stall_jr_load = jr_D & load_E & (RS_D == RT_E); 74 assign stall_jr_loadM = jr_D & load_M & (RS_D == RT_M); 75 76 assign Stop = stall_b_r | stall_b_i | stall_b_load | stall_b_loadM | 77 stall_cal_r_load | stall_cal_i_load | 78 stall_load_load | stall_store_load | 79 stall_jr_r | stall_jr_i | stall_jr_load | stall_jr_loadM; 80 81 endmodule
1 `define opcode 31:26 2 `define func 5:0 3 `define rs 25:21 4 `define rt 20:16 5 `define rd 15:11 6 module Forward( 7 input [31:0] IR_D, 8 input [31:0] IR_E, 9 input [31:0] IR_M, 10 input [31:0] IR_W, 11 output [2:0] RSDsel, 12 output [2:0] RTDsel, 13 output