CS 61C: Great Ideas in Computer Architecture (Machine Structures) Lecture 29: Single-Cycle CPU Datapath Control Part 2 Instructor: Dan Garcia http://inst.eecs.berkeley.edu/~cs61c/sp13 www.huffingtonpost.com/2013/04/03/stanford-edx_n_3006484.html Technology In the News Stanford joining edX "Together, I think we will have a chance to produce a much better platform than each of us would be able to do individually," Provost John Mitchell said, adding that the software that emerges from the alliance has the potential to become the "Linux of online learning.” Source available June 1! Review: Processor Design 5 steps Step 1: Analyze instruction set to determine datapath requirements – Meaning of each instruction is given by register transfers – Datapath must include storage element for ISA registers – Datapath must support each register transfer Step 2: Select set of datapath components & establish clock methodology Step 3: Assemble datapath components that meet the requirements Step 4: Analyze implementation of each instruction to determine setting of control points that realizes the register transfer Step 5: Assemble the control logic Processor Design: 5 steps Step 1: Analyze instruction set to determine datapath requirements – Meaning of each instruction is given by register transfers – Datapath must include storage element for ISA registers – Datapath must support each register transfer Step 2: Select set of datapath components & establish clock methodology Step 3: Assemble datapath components that meet the requirements Step 4: Analyze implementation of each instruction to determine setting of control points that realizes the register transfer Step 5: Assemble the control logic Register-Register Timing: One Complete Cycle (Add/Sub) Clk PC Old Value Rs, Rt, Rd, Op, Func Old Value ALUctr Old Value RegWr Old Value busA, B Old Value busW Old Value New Value Instruction Memory Access Time New Value Delay through Control Logic New Value New Value Register File Access Time New Value ALU Delay New Value ALUctr RegWr Rd Rs Rt 5 Rw busW 5 Ra Rb busA 32 ALU RegFile clk 5 busB 32 32 Register Write Occurs Here 3c: Logical Op (or) with Immediate • R[rt] = R[rs] op ZeroExt[imm16] 31 26 21 op rs 31 6 bits RegDst RegWr Rw Rs Rt 5 bits 16 15 16 bits immediate 16 bits 5 ALUctr 5 Ra Rb busA busB 32 clk 16 ZeroExt imm16 32 ALU RegFile 32 5 bits immediate Writing to Rt register (not Rd)!! 0 5 0 rt 0000000000000000 16 bits Rd Rt 1 16 0 1 32 ALUSrc 32 What about Rt Read? 0 3d: Load Operations • R[rt] = Mem[R[rs] + SignExt[imm16]] Example: lw rt,rs,imm16 31 26 21 op 16 rs 6 bits 0 rt 5 bits immediate 5 bits 16 bits 1 RegWr 0 Rs Rt 5 5 Rw busW 5 Ra Rb busA busB 32 imm16 16 ExtOp Extender clk 32 ALU RegFile 32 MemtoReg ALUctr RegDst Rd Rt 32 0 0 Adr 1 32 ALUSrc clk Data Memory 1 3e: Store Operations • Mem[ R[rs] + SignExt[imm16] ] = R[rt] Ex.: sw rt, rs, imm16 31 26 21 op 6 bits 16 rs 5 bits rt 5 bits immediate 16 bits RegDst Rd Rt 1 RegWr ALUctr 0 5 5 5 busA busB 32 imm16 16 ExtOp Extender clk 32 0 ALU RegFile 32 MemtoReg MemWr Rs Rt Rw Ra Rb busW 0 32 0 32 WrEn Adr 1 32 ALUSrc Data In clk Data Memory 1 3e: Store Operations • Mem[ R[rs] + SignExt[imm16] ] = R[rt] Ex.: sw rt, rs, imm16 31 26 21 op 6 bits 16 rs 5 bits rt 5 bits immediate 16 bits RegDst Rd Rt 1 RegWr ALUctr 0 5 5 5 busA busB 32 imm16 16 ExtOp Extender clk 32 0 ALU RegFile 32 MemtoReg MemWr Rs Rt Rw Ra Rb busW 0 32 0 32 WrEn Adr 1 32 ALUSrc Data In clk Data Memory 1 3f: The Branch Instruction 31 26 op 6 bits 21 rs 5 bits 16 rt 5 bits immediate 16 bits 0 beq rs, rt, imm16 – mem[PC] Fetch the instruction from memory – Equal = R[rs] == R[rt] Calculate branch condition – if (Equal) Calculate the next instruction’s address • PC = PC + 4 + ( SignExt(imm16) x 4 ) else • PC = PC + 4 Datapath for Branch Operations beq rs, rt, imm16 31 26 op 6 bits 21 rs 5 bits 16 0 rt 5 bits immediate 16 bits Datapath generates condition (Equal) Inst Address 00 RegWr clk busW clk 5 Rs Rt 5 ALUctr 5 Rw Ra Rb busA RegFile busB 32 = ALU PC Mux Adder PC Ext imm16 nPC_sel Adder 4 Equal 32 32 Already have mux, adder, need special sign extender for PC, need equal compare (sub?) Instruction Fetch Unit including Branch 31 26 op 21 rs 16 rt 0 immediate • if (Zero == 1) then PC = PC + 4 + SignExt[imm16]*4 ; else PC = PC + 4 Inst nPC_sel Equal MUX ctrl nPC_sel • How to encode nPC_sel? 0 00 • Direct MUX select? • Branch inst. / not branch inst. Mux PC Adder 4 Adder PC Ext imm16 Instruction<31:0> Memory Adr 1 clk • Let’s pick 2nd option nPC_sel 0 1 1 zero? x 0 1 MUX 0 0 1 Q: What logic gate? Putting it All Together:A Single Cycle Datapath RegDst 32 0 5 5 5 Rw Ra Rb RegFile busA busB 32 16 Extender imm16 MemtoReg MemWr Rs Rt clk clk ALUctr Equal 32 = ALU busW PC PC Ext Adder Mux 00 RegWr Adder 4 Rt Rd Imm16 Rd Rt 1 Instruction<31:0> <0:15> nPC_sel Rs <11:15> Adr <16:20> <21:25> Inst Memory 0 32 1 32 Data In clk imm16 ExtOp ALUSrc 32 0 WrEn Adr Data Memory 1 Datapath Control Signals • ExtOp: • ALUsrc: • ALUctr: • • • • “zero”, “sign” 0 regB; 1 immed “ADD”, “SUB”, “OR” MemWr: MemtoReg: RegDst: RegWr: ALUctr MemtoReg MemWr RegDst Rd Rt 1 Inst Address 4 RegWr 0 Rs Rt 5 5 Rw busW Ra Rb busA RegFile clk imm16 16 Extender PC Ext Adder 1 32 0 0 32 clk 32 busB PC Mux 32 ExtOp imm16 5 ALU Adder 0 00 nPC_sel & Equal 1 write memory 0 ALU; 1 Mem 0 “rt”; 1 “rd” 1 write register 32 WrEn Adr 1 Data In ALUSrc clk 32 Data Memory 1 Given Datapath: RTL Control Instruction<31:0> Rd <0:15> Rs <11:15> Rt <16:20> Op Fun <21:25> <0:5> <26:31> Inst Memory Adr Imm16 Control nPC_sel RegWr RegDst ExtOp ALUSrc ALUctr DATA PATH MemWr MemtoReg RTL: The Add Instruction 31 26 op 6 bits 21 rs 5 bits 16 rt 5 bits 11 6 0 rd shamt funct 5 bits 5 bits 6 bits add rd, rs, rt – MEM[PC] Fetch the instruction from memory – R[rd] = R[rs] + R[rt] The actual operation – PC = PC + 4 Calculate the next instruction’s address Instruction Fetch Unit at the Beginning of Add • Fetch the instruction from Instruction memory: Instruction = MEM[PC] – same for all instructions Inst Memory nPC_sel 00 Adder 4 PC Mux Adder PC Ext imm16 clk Inst Address Instruction<31:0> Single Cycle Datapath during Add 31 26 op 21 16 rs 11 rt rd 6 shamt R[rd] = R[rs] + R[rt] 5 5 Rw busW 5 busA Ra Rb busB 32 imm16 16 ExtOp=x Extender clk Rs Rt Rd Imm16 zero ALUctr=ADD MemtoReg=0 MemWr=0 32 = ALU RegFile 32 <0:15> Rs Rt <11:15> RegWr=1 0 <16:20> 1 <21:25> Rd Rt funct Instruction<31:0> instr fetch unit nPC_sel=+4 RegDst=1 clk 0 32 0 0 32 1 Data In 32 ALUSrc=0 clk WrEn Adr Data Memory 1 Instruction Fetch Unit at End of Add • PC = PC + 4 – Same for all instructions except: Branch and Jump nPC_sel=+4 00 Adder 4 Inst Memory PC Mux Adder PC Ext imm16 clk Inst Address P&H Figure 4.17 Summary of the Control Signals (1/2) inst Register Transfer add R[rd] R[rs] + R[rt]; PC PC + 4 ALUsrc=RegB, ALUctr=“ADD”, RegDst=rd, RegWr, nPC_sel=“+4” sub R[rd] R[rs] – R[rt]; PC PC + 4 ALUsrc=RegB, ALUctr=“SUB”, RegDst=rd, RegWr, nPC_sel=“+4” ori R[rt] R[rs] + zero_ext(Imm16); PC PC + 4 ALUsrc=Im, Extop=“Z”, ALUctr=“OR”, RegDst=rt,RegWr, nPC_sel=“+4” lw R[rt] MEM[ R[rs] + sign_ext(Imm16)]; PC PC + 4 ALUsrc=Im, Extop=“sn”, ALUctr=“ADD”, MemtoReg, RegDst=rt, RegWr, nPC_sel = “+4” sw MEM[ R[rs] + sign_ext(Imm16)] R[rs]; PC PC + 4 ALUsrc=Im, Extop=“sn”, ALUctr = “ADD”, MemWr, nPC_sel = “+4” beq if (R[rs] == R[rt]) then PC PC + sign_ext(Imm16)] || 00 else PC PC + 4 nPC_sel = “br”, ALUctr = “SUB” Summary of the Control Signals (2/2) See Appendix A func 10 0000 10 0010 We Don’t Care :-) op 00 0000 00 0000 00 1101 10 0011 10 1011 00 0100 00 0010 add sub ori lw sw beq jump RegDst 1 1 0 0 x x x ALUSrc 0 0 1 1 1 0 x MemtoReg 0 0 0 1 x x x RegWrite 1 1 1 1 0 0 0 MemWrite 0 0 0 0 1 0 0 nPCsel 0 0 0 0 0 1 ? Jump 0 0 0 0 0 0 1 ExtOp x x 0 1 1 x Add Subtract Or Add Add x Subtract ALUctr<2:0> 31 26 21 16 R-type op rs rt I-type op rs rt J-type op 11 rd 6 shamt immediate target address x 0 funct add, sub ori, lw, sw, beq jump Boolean Expressions for Controller RegDst ALUSrc MemtoReg RegWrite MemWrite nPCsel Jump ExtOp ALUctr[0] ALUctr[1] = = = = = = = = = = add + sub ori + lw + sw lw add + sub + ori + lw sw beq jump lw + sw sub + beq (assume ALUctr is 00 ADD, 01 SUB, 10 OR) or Where: rtype ori lw sw beq jump = = = = = = ~op5 ~op5 op5 op5 ~op5 ~op5 ~op4 ~op4 ~op4 ~op4 ~op4 ~op4 ~op3 op3 ~op3 op3 ~op3 ~op3 ~op2 op2 ~op2 ~op2 op2 ~op2 ~op1 ~op1 op1 op1 ~op1 op1 ~op0, op0 op0 op0 ~op0 ~op0 How do we implement this in gates? add = rtype func5 ~func4 ~func3 ~func2 ~func1 ~func0 sub = rtype func5 ~func4 ~func3 ~func2 func1 ~func0 Controller Implementation opcode func “AND” logic add sub ori lw sw beq jump “OR” logic RegDst ALUSrc MemtoReg RegWrite MemWrite nPCsel Jump ExtOp ALUctr[0] ALUctr[1] Peer Instruction 1) We should use the main ALU to compute PC=PC+4 in order to save some gates 2) The ALU is inactive for memory reads (loads) or writes (stores). a) b) c) d) e) 12 FF FT TF TT Help! Summary: Single-cycle Processor • Five steps to design a processor: Processor 1. Analyze instruction set Input datapath requirements Control Memory 2. Select set of datapath components & establish Datapath Output clock methodology 3. Assemble datapath meeting the requirements 4. Analyze implementation of each instruction to determine setting of control points that effects the register transfer. 5. Assemble the control logic • Formulate Logic Equations • Design Circuits Bonus Slides • How to implement Jump Single Cycle Datapath during Jump 31 26 25 J-type 0 op target address jump • New PC = { PC[31..28], target address, 00 } Instruction<31:0> Jump= Clk ALUSrc = ExtOp = Rd Imm16 TA26 MemtoReg = MemWr = 0 32 Data In 32 <0:25> 32 Rs WrEn Adr Data Memory 32 Mux 1 <0:15> 16 Extender imm16 Zero Mux 32 Clk busA Rw Ra Rb 32 32 x 32-bit Registers busB 0 32 ALU busW 5 Rt ALUctr = Rs Rt 5 5 <11:15> RegWr = Clk <16:20> RegDst = <21:25> Rd Rt 1 Mux 0 Instruction Fetch Unit nPC_sel= 1 Single Cycle Datapath during Jump 31 26 25 0 op J-type target address jump • New PC = { PC[31..28], target address, 00 } Instruction<31:0> Jump=1 ExtOp = x <0:25> Clk ALUSrc = x Rd Imm16 TA26 MemtoReg = x MemWr = 0 0 WrEn Adr Data Memory 32 Mux 32 Rs 32 Data In 32 <0:15> 1 <11:15> 16 Extender imm16 Zero Mux 32 Clk busA Rw Ra Rb 32 32 x 32-bit busB Registers 0 32 ALU busW 5 Rt ALUctr =x Rs Rt 5 5 <16:20> RegWr = 0 Clk <21:25> RegDst = x Rd Rt 1 Mux 0 Instruction Fetch Unit nPC_sel=? 1 Instruction Fetch Unit at the End of Jump 31 26 25 J-type 0 op target address jump • New PC = { PC[31..28], target address, 00 } Jump Inst Memory nPC_sel Adr Instruction<31:0> Zero nPC_MUX_sel Adder 00 4 0 imm16 PC Mux Adder 1 Clk How do we modify this to account for jumps? Instruction Fetch Unit at the End of Jump 31 26 25 0 op J-type target address jump • New PC = { PC[31..28], target address, 00 } Inst Memory Jump nPC_sel Instruction<31:0> Adr Zero imm16 00 TA Mux Adder 1 4 (MSBs) 1 PC Adder 0 26 Mux 4 00 nPC_MUX_sel 0 Clk Query • Can Zero still get asserted? • Does nPC_sel need to be 0? • If not, what?