Synthetiseren van de pipelined mMIPS processor Sander Stuijk Department of Electrical Engineering Electronic Systems mMIPS if_pc 2 id_pc 1 add2 shiftleft imm2word id_immediate dev_* id_instr_25_0 rom_addr 1 2 mux5 0 shiftleft_ jmp 0 mux1 pc add1 c4 ram_dout ram_wait [25-21] ram_din id_data_reg1 1 w r_data_reg2 0 id_data_reg2 b alu [15-0] [25-0] ram_r ram_w mem_dmem_data hi lo 2 2 decoder 0 1 [5-0] 1 id_instr_15_11 hazard_ctrl ctrl Enable rst mem_regdst_addr ex_ctrl_wb_memtoreg ex_ctrl_wb_regwrite mem_ctrl_wb_memtoreg mem_ctrl_wb_regwrite Signextend Hazard clk 2 hazard dmem_wait enable ex_regdst_addr 0 id_instr_20_16 [15-11] c31 Pipe_en (This signal goes to all registers on which no write signal is depicted) mem_alu_result aluctrl id_instr_10_6 [20-16] [31-26] [5-0] 0 ex_alu_result id_instr_5_0 [10-6] IFIDWrite mux4 PCWrite 1 0 mux6 1 mux8 a id_ctrl_ex_regdst id_ctrl_ex_alusrc id_ctrl_ex_aluop id_ctrl_ex_target id_ctrl_mem_branch id_ctrl_ex_hilo_write id_ctrl_ex_hiloalu_sel id_ctrl_ex_regvalue id_ctrl_mem_memwrite id_ctrl_mem_memread id_ctrl_wb_memtoreg id_ctrl_wb_regwrite mux3 w_addr_reg ram_addr signextend byte r_addr_reg2 memdev r_data_reg1 registers w_data_reg if_instr rom_r [20-16] branch_ ctrl 0 r_addr_reg1 decoder_nb rom_wait mux7 1 mux2 rom_dout 3 LCC compiler 4 LCC compiler 5 LCC compiler Forwarding optie 1 if_pc 6 id_pc 1 add2 shiftleft id_immediate w r_data_reg2 id_data_reg2 [15-0] mux5 shiftleft_ jmp ram_wait ram_din 1 0 b [25-0] ram_addr ram_r ram_w mem_dmem_data hi lo 2 2 decoder 0 1 [5-0] IFIDWrite 1 id_instr_15_11 hazard_ctrl ctrl Enable rst mem_regdst_addr ex_ctrl_wb_memtoreg ex_ctrl_wb_regwrite mem_ctrl_wb_memtoreg mem_ctrl_wb_regwrite Signextend Hazard clk 2 hazard dmem_wait enable ex_regdst_addr 0 id_instr_20_16 [15-11] c31 Pipe_en (This signal goes to all registers on which no write signal is depicted) mem_alu_result aluctrl id_instr_10_6 [20-16] [31-26] [5-0] 0 ex_alu_result id_instr_5_0 [10-6] mux4 PCWrite 1 0 mux6 1 mux8 a id_ctrl_ex_regdst id_ctrl_ex_alusrc id_ctrl_ex_aluop id_ctrl_ex_target id_ctrl_mem_branch id_ctrl_ex_hilo_write id_ctrl_ex_hiloalu_sel id_ctrl_ex_regvalue id_ctrl_mem_memwrite id_ctrl_mem_memread id_ctrl_wb_memtoreg id_ctrl_wb_regwrite mux3 w_addr_reg 2 ram_dout memdev registers w_data_reg 1 branch_ ctrl r_addr_reg2 id_data_reg1 alu r_data_reg1 mux2 [20-16] if_instr rom_r decoder_nb 0 mux7 rom_wait r_addr_reg1 mux [25-21] 1 mux rom_dout dev_* 0 id_instr_25_0 rom_addr signextend byte imm2word 0 mux1 pc add1 c4 Forwarding optie 2 if_pc 7 id_pc 1 add2 shiftleft imm2word id_immediate r_data_reg2 0 id_data_reg2 b [25-0] memdev ram_r ram_w mem_dmem_data hi lo 2 2 decoder 0 1 [5-0] IFIDWrite 1 id_instr_15_11 hazard_ctrl ctrl Enable rst mem_regdst_addr ex_ctrl_wb_memtoreg ex_ctrl_wb_regwrite mem_ctrl_wb_memtoreg mem_ctrl_wb_regwrite Signextend Hazard clk 2 hazard dmem_wait enable ex_regdst_addr 0 id_instr_20_16 [15-11] c31 Pipe_en (This signal goes to all registers on which no write signal is depicted) mem_alu_result aluctrl id_instr_10_6 [20-16] [31-26] [5-0] 0 ex_alu_result id_instr_5_0 [10-6] mux4 PCWrite 1 0 mux6 1 mux8 a id_ctrl_ex_regdst id_ctrl_ex_alusrc id_ctrl_ex_aluop id_ctrl_ex_target id_ctrl_mem_branch id_ctrl_ex_hilo_write id_ctrl_ex_hiloalu_sel id_ctrl_ex_regvalue id_ctrl_mem_memwrite id_ctrl_mem_memread id_ctrl_wb_memtoreg id_ctrl_wb_regwrite mux3 w [15-0] 1 ram_addr signextend byte w_addr_reg ram_din branch_ ctrl registers w_data_reg ram_wait alu r_addr_reg2 2 ram_dout id_data_reg1 mux2 r_data_reg1 mux [20-16] if_instr rom_r decoder_nb 0 mux7 rom_wait r_addr_reg1 mux [25-21] 1 1 mux5 id_instr_25_0 rom_addr rom_dout dev_* 0 shiftleft_ jmp 0 mux1 pc add1 c4 Forwarding - aandachtspunten 8 Register 0 heeft altijd de waarde 0, ongeacht wat er in dit register wordt geschreven Forward dus nooit register 0 Forward altijd de nieuwste data EX gaat voor MEM, MEM gaat voor WB, WB gaat voor ID De twee register inputs kunnen uit dezelfde of verschillende pipeline stages komen De twee forwarding multiplexers moeten los worden aangestuurd De lees operaties (lw, lb) hebben 1 delay slot, de data uit het geheugen is pas beschikbaar is in de WB stage Er kan een data hazard zijn tussen een load instructie in the MEM stage en een instructie in de ID stage, deze kan niet worden opgelost met forwarding Forwarding – WB stage 9 Hazard detectie in WB stage else if (memwbregwrite_t == 1 && ((memwbwriteregister_t == ifidreadregister1_t) || (memwbwriteregister_t == ifidreadregister2_t))) { hazard = 1; } Forwading vanuit WB stage if (memwbregwrite_t == 1 && memwbwriteregister_t == ifidreadregister1_t && memwbwriteregister_t != 0) { forwardA.write(3); } if (memwbregwrite_t == 1 && memwbwriteregister_t == ifidreadregister2_t && memwbwriteregister_t != 0) { forwardB.write(3); } if_pc Lab 5 - Synthesis id_pc 1 add2 shiftleft imm2word id_immediate dev_* id_instr_25_0 rom_addr 1 2 mux5 0 shiftleft_ jmp 0 mux1 add1 c4 pc ram_dout ram_wait [25-21] ram_din id_data_reg1 1 w_addr_reg w r_data_reg2 0 id_data_reg2 b alu [15-0] [25-0] ram_addr ram_r ram_w mem_dmem_data hi lo 2 2 decoder dmem_wait hazard_ctrl ctrl rst mem_regdst_addr ex_ctrl_wb_memtoreg ex_ctrl_wb_regwrite mem_ctrl_wb_memtoreg mem_ctrl_wb_regwrite Signextend Enable clk 2 mux4 1 id_instr_15_11 Hazard enable ex_regdst_addr 0 id_instr_20_16 [15-11] c31 Pipe_en (This signal goes to all registers on which no write signal is depicted) mem_alu_result aluctrl id_instr_10_6 [20-16] [31-26] [5-0] ex_alu_result id_instr_5_0 [10-6] IFIDWrite 0 0 1 [5-0] PCWrite 1 mux8 1 0 mux6 a id_ctrl_ex_regdst id_ctrl_ex_alusrc id_ctrl_ex_aluop id_ctrl_ex_target id_ctrl_mem_branch id_ctrl_ex_hilo_write id_ctrl_ex_hiloalu_sel id_ctrl_ex_regvalue id_ctrl_mem_memwrite id_ctrl_mem_memread id_ctrl_wb_memtoreg id_ctrl_wb_regwrite signextend byte if_instr registers w_data_reg mux3 r_data_reg1 r_addr_reg2 memdev r_addr_reg1 [20-16] branch_ ctrl 0 rom_r decoder_nb rom_wait mux7 1 mux2 rom_dout hazard 10 11 Design flow test LCC C Compiler implementation Application (C sources) LCC C Compiler Celoxica create memory sw hardware simulator Celoxica transfer hw Visual C++ mMIPS (C++ sources that use SystemC library) CoCentric SystemC Compiler Xilinx XST Xilinx ISE 12 Design flow www.es.ele.tue.nl/education/5JJ55-65/mmips-lab/labs/5/toolflow.php