1 / 18

Modular Refinement Arvind Computer Science & Artificial Intelligence Lab

Modular Refinement Arvind Computer Science & Artificial Intelligence Lab Massachusetts Institute of Technology. rf. pc. CPU. rf. pc. write- back. fetch. memory. execute. decode. dMem. iMem. CPU. fetch & decode. execute. bu. Successive refinement & Modular Structure.

aradia
Download Presentation

Modular Refinement Arvind Computer Science & Artificial Intelligence Lab

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Modular Refinement Arvind Computer Science & Artificial Intelligence Lab Massachusetts Institute of Technology http://csg.csail.mit.edu/6.375

  2. rf pc CPU rf pc write- back fetch memory execute decode dMem iMem CPU fetch & decode execute bu Successive refinement & Modular Structure Can we derive the 5-stage pipeline by successive refinement of a 2-stage pipeline? http://csg.csail.mit.edu/6.375

  3. Instuction Memory PC +4 Decode Register File buf Controller ALU Data Memory A 2-Stage Processor in RTL Design Microarchitecture Locate Datapaths/Memories and create modules Identify Input/Output ports Design the Controller (FSM) module regfile ( input [4:0] wa, //address for write port input [31:0] wd, //write data input we, //write enable (active high) input [4:0] ra1, //address for read port 1 output [31:0] rd1, //read data for port 1 ... http://csg.csail.mit.edu/6.375

  4. Instuction Memory PC setPC(new_pc) +4 read(addr) Decode Register File update(addr,val) enqNextInst(dec_inst) buf ALU Data Memory Designing a 2-Stage Processor with GAA Design Microarchitecture Locate Datapaths/Memories and create modules Define Interface methods: read, action, action value > interface RegisterFile#(addr_T, data_T); data_T read(addr_T); Action update(addr_T, data_T); endinterface; http://csg.csail.mit.edu/6.375

  5. dMem iMem RFile rf pc Method calls embody both data and control (i.e., protocol) Read method call Action method call CPU as one module CPU fetch & decode FIFO bu execute http://csg.csail.mit.edu/6.375

  6. CPU as one module module mkCPU#(Mem iMem, Mem dMem)(); // Instantiating state elements Reg#(Iaddress) pc <- mkReg(0); RegFile#(RName, Value) rf <- mkBypassRF(); SFIFO#(InstTemplate, RName) bu <- mkSLoopyFifo(findf); // Some definitions Instr instr = iMem.read(pc); Iaddress predIa = pc + 1; // Rules rule fetch_decode ... rule execute ... endmodule you have seen this before http://csg.csail.mit.edu/6.375

  7. CPU FIFO bu dMem iMem RFile rf WB execute setPc pc stall enqIt A Modular organization • Suppose we include rf and pc in Fetch and bu in Execute • Fetch delivers decoded instructions to Execute and needs to consult Execute for the stall condition • Execute writes back data in rf and supplies the pc value in case of a branch misprediction modules call each other (recursive) fetch & decode http://csg.csail.mit.edu/6.375

  8. module mkCPU2#(Mem iMem, Mem dMem)(); Execute execute <- mkExecute(dMem, fetch); Fetch fetch <- mkFetch(iMem, execute); endmodule interface Fetch; method Action setPC (Iaddress cpc); method Action writeback (RName dst, Value v); endinterface interface Execute; method Action enqIt(InstTemplate it); method Bool stall(Instr instr) endinterface recursive calls Recursive modular organization Unfortunately, recursive module syntax is not as simple http://csg.csail.mit.edu/6.375

  9. no change Fetch Module module mkFetch#(IMem iMem, Execute execute) (Fetch); Instr instr = iMem.read(pc); Iaddress predIa = pc + 1; Reg#(Iaddress) pc <- mkReg(0); RegFile#(RName, Bit#(32)) rf <- mkBypassRegFile(); rule fetch_and_decode (!execute.stall(instr)); execute.enqIt(newIt(instr,rf)); pc <= predIa; endrule methodAction writeback(RName rd, Value v); rf.upd(rd,v); endmethod methodAction setPC(Iaddress newPC); pc <= newPC; endmethod endmodule http://csg.csail.mit.edu/6.375

  10. no change Execute Module module mkExecute#(DMem dMem, Fetch fetch) (Execute); SFIFO#(InstTemplate) bu <- mkSLoopyFifo(findf); InstTemplate it = bu.first; rule execute … methodActionenqIt(InstTemplate it); bu.enq(it); endmethod method Bool stall(Instr instr); return (stallFunc(instr, bu)); endmethod endmodule http://csg.csail.mit.edu/6.375

  11. Execute Module Rule rule execute (True); case (it) matchestagged EAdd{dst:.rd,src1:.va,src2:.vb}: begin fetch.writeback(rd, va+vb); bu.deq(); end tagged EBz {cond:.cv,addr:.av}: if (cv == 0) then begin fetch.setPC(av);bu.clear(); end else bu.deq();tagged ELoad{dst:.rd,addr:.av}: begin fetch.writeback(rd, dMem.read(av)); bu.deq(); end tagged EStore{value:.vv,addr:.av}: begin dMem.write(av, vv); bu.deq(); end endcase endrule http://csg.csail.mit.edu/6.375

  12. Issue • A recursive call structure can be wrong in the sense of “circular calls”; fortunately the compiler can perform this check • Unfortunately recursive call structure amongst modules is supported by the compiler in a limited way. • The syntax is complicated • Recursive modules cannot be synthesized separately http://csg.csail.mit.edu/6.375

  13. Syntax for Recursive Modules module mkFix#(Tuple2#(Fetch, Execute) fe) (Tuple2#(Fetch, Execute));match{.f, .e} = fe; Fetch fetch <- mkFetch(e); Execute execute <- mkExecute(f);return(tuple2(fetch,execute));endmodule(* synthesize *)module mkCPU(Empty);match {.fetch, .execute} <- moduleFix(mkFix);endmodule moduleFixis like the Y combinator F = Y F http://csg.csail.mit.edu/6.375

  14. Passing parameters module mkCPU#(IMem iMem, DMem dMem)(Empty); module mkFix#(Tuple2#(Fetch, Execute) fe) • (Tuple2#(Fetch, Execute));match{.f, .e} = fe; Fetch fetch <- mkFetch(iMem,e); Execute execute <- mkExecute(dMem,f);return(tuple2(fetch,execute); • endmodulematch {.fetch, .execute} <- moduleFix(mkFix);endmodule http://csg.csail.mit.edu/6.375

  15. Subtle Architecture Issues interface Fetch; method Action setPC (Iaddress cpc); method Action writeback (RName dst, Value v); endinterface interface Execute; method Action enqIt(InstTemplate it); method Bool stall(Instr instr) endinterface • After setPC is called the next instruction enqueued via enqIt must correspond to iMem(cpc) • stall and writeback methods are closely related; • writeback affects the results of subsequent stalls • the effect of writeback must be reflected immediately in the decoded instructions Any modular refinement must preserve these extra linguistic semantic properties http://csg.csail.mit.edu/6.375

  16. Fetch Module RefinementSeparating Fetch and Decode module mkFetch#(IMem iMem, Execute execute) (Fetch); FIFO#(Instr) fetchDecodeQ <- mkLoopyFIFO(); Instr instr = iMem.read(pc); Iaddress predIa = pc + 1; … rulefetch(True); pc <= predIa; fetchDecodeQ.enq(instr); endrule ruledecode (!execute.stall(fetchDecodeQ.first())); execute.enqIt(newIt(fetchDecodeQ.first(),rf)); fetchDecodeQ.deq(); endrule method Action setPC … method Action writeback … endmodule Are any changes needed in the methods? http://csg.csail.mit.edu/6.375

  17. no change Fetch Module Refinement module mkFetch#(IMem iMem, Execute execute) (Fetch); FIFO#(Instr) fetchDecodeQ <- mkFIFO(); … Instr instr = iMem.read(pc); Iaddress predIa = pc + 1; methodAction writeback(RName rd, Value v); rf.upd(rd,v); endmethod methodAction setPC(Iaddress newPC); pc <= newPC; fetchDecodeQ.clear(); endmethod endmodule http://csg.csail.mit.edu/6.375

  18. More refinements to consider • Multicycle execution module • Multicycle memory • Bypassing Next time … http://csg.csail.mit.edu/6.375

More Related