📄 coherence_protocol.cc
字号:
// on response to given request: specify new state transitionTable[Invalid][Read].onResponse(Shared); transitionTable[Invalid][ReadEx].onResponse(Modified); transitionTable[Shared][writeToSharedCmd].onResponse(Modified); // bus snoop transition functions transitionTable[Invalid][Read].onSnoop(nullTransition); transitionTable[Invalid][ReadEx].onSnoop(nullTransition); transitionTable[Shared][Read].onSnoop(nullTransition); transitionTable[Shared][ReadEx].onSnoop(invalidateTrans); transitionTable[Modified][ReadEx].onSnoop(supplyAndInvalidateTrans); transitionTable[Modified][Read].onSnoop(supplyAndGotoSharedTrans); //Tansitions on seeing a DMA (writeInv(samelevel) or DMAInv) transitionTable[Invalid][Invalidate].onSnoop(invalidateTrans); transitionTable[Shared][Invalidate].onSnoop(invalidateTrans); transitionTable[Modified][Invalidate].onSnoop(invalidateTrans); transitionTable[Invalid][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Shared][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Modified][WriteInvalidate].onSnoop(invalidateTrans); if (doUpgrades) { transitionTable[Invalid][Upgrade].onSnoop(nullTransition); transitionTable[Shared][Upgrade].onSnoop(invalidateTrans); } } else if(protocol == "mesi") { // incoming requests: specify outgoing bus request transitionTable[Invalid][Read].onRequest(Read); transitionTable[Invalid][Write].onRequest(ReadEx); transitionTable[Shared][Write].onRequest(writeToSharedCmd); //Prefetching causes a read transitionTable[Invalid][Soft_Prefetch].onRequest(Read); transitionTable[Invalid][Hard_Prefetch].onRequest(Read); // on response to given request: specify new state transitionTable[Invalid][Read].onResponse(Exclusive); //It will move into shared if the shared line is asserted in the //getNewState function transitionTable[Invalid][ReadEx].onResponse(Modified); transitionTable[Shared][writeToSharedCmd].onResponse(Modified); // bus snoop transition functions transitionTable[Invalid][Read].onSnoop(nullTransition); transitionTable[Invalid][ReadEx].onSnoop(nullTransition); transitionTable[Shared][Read].onSnoop(assertShared); transitionTable[Shared][ReadEx].onSnoop(invalidateTrans); transitionTable[Exclusive][Read].onSnoop(assertShared); transitionTable[Exclusive][ReadEx].onSnoop(invalidateTrans); transitionTable[Modified][ReadEx].onSnoop(supplyAndInvalidateTrans); transitionTable[Modified][Read].onSnoop(supplyAndGotoSharedTrans); //Tansitions on seeing a DMA (writeInv(samelevel) or DMAInv) transitionTable[Invalid][Invalidate].onSnoop(invalidateTrans); transitionTable[Shared][Invalidate].onSnoop(invalidateTrans); transitionTable[Modified][Invalidate].onSnoop(invalidateTrans); transitionTable[Exclusive][Invalidate].onSnoop(invalidateTrans); transitionTable[Invalid][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Shared][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Modified][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Exclusive][WriteInvalidate].onSnoop(invalidateTrans); if (doUpgrades) { transitionTable[Invalid][Upgrade].onSnoop(nullTransition); transitionTable[Shared][Upgrade].onSnoop(invalidateTrans); } } else if(protocol == "mosi") { // incoming requests: specify outgoing bus request transitionTable[Invalid][Read].onRequest(Read); transitionTable[Invalid][Write].onRequest(ReadEx); transitionTable[Shared][Write].onRequest(writeToSharedCmd); transitionTable[Owned][Write].onRequest(writeToSharedCmd); //Prefetching causes a read transitionTable[Invalid][Soft_Prefetch].onRequest(Read); transitionTable[Invalid][Hard_Prefetch].onRequest(Read); // on response to given request: specify new state transitionTable[Invalid][Read].onResponse(Shared); transitionTable[Invalid][ReadEx].onResponse(Modified); transitionTable[Shared][writeToSharedCmd].onResponse(Modified); transitionTable[Owned][writeToSharedCmd].onResponse(Modified); // bus snoop transition functions transitionTable[Invalid][Read].onSnoop(nullTransition); transitionTable[Invalid][ReadEx].onSnoop(nullTransition); transitionTable[Invalid][Upgrade].onSnoop(nullTransition); transitionTable[Shared][Read].onSnoop(assertShared); transitionTable[Shared][ReadEx].onSnoop(invalidateTrans); transitionTable[Shared][Upgrade].onSnoop(invalidateTrans); transitionTable[Modified][ReadEx].onSnoop(supplyAndInvalidateTrans); transitionTable[Modified][Read].onSnoop(supplyAndGotoOwnedTrans); transitionTable[Owned][Read].onSnoop(supplyAndGotoOwnedTrans); transitionTable[Owned][ReadEx].onSnoop(supplyAndInvalidateTrans); transitionTable[Owned][Upgrade].onSnoop(invalidateTrans); //Tansitions on seeing a DMA (writeInv(samelevel) or DMAInv) transitionTable[Invalid][Invalidate].onSnoop(invalidateTrans); transitionTable[Shared][Invalidate].onSnoop(invalidateTrans); transitionTable[Modified][Invalidate].onSnoop(invalidateTrans); transitionTable[Owned][Invalidate].onSnoop(invalidateTrans); transitionTable[Invalid][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Shared][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Modified][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Owned][WriteInvalidate].onSnoop(invalidateTrans); } else if(protocol == "moesi") { // incoming requests: specify outgoing bus request transitionTable[Invalid][Read].onRequest(Read); transitionTable[Invalid][Write].onRequest(ReadEx); transitionTable[Shared][Write].onRequest(writeToSharedCmd); transitionTable[Owned][Write].onRequest(writeToSharedCmd); //Prefetching causes a read transitionTable[Invalid][Soft_Prefetch].onRequest(Read); transitionTable[Invalid][Hard_Prefetch].onRequest(Read); // on response to given request: specify new state transitionTable[Invalid][Read].onResponse(Exclusive); //It will move into shared if the shared line is asserted in the //getNewState function transitionTable[Invalid][ReadEx].onResponse(Modified); transitionTable[Shared][writeToSharedCmd].onResponse(Modified); transitionTable[Owned][writeToSharedCmd].onResponse(Modified); // bus snoop transition functions transitionTable[Invalid][Read].onSnoop(nullTransition); transitionTable[Invalid][ReadEx].onSnoop(nullTransition); transitionTable[Invalid][Upgrade].onSnoop(nullTransition); transitionTable[Shared][Read].onSnoop(assertShared); transitionTable[Shared][ReadEx].onSnoop(invalidateTrans); transitionTable[Shared][Upgrade].onSnoop(invalidateTrans); transitionTable[Exclusive][Read].onSnoop(assertShared); transitionTable[Exclusive][ReadEx].onSnoop(invalidateTrans); transitionTable[Modified][Read].onSnoop(supplyAndGotoOwnedTrans); transitionTable[Modified][ReadEx].onSnoop(supplyAndInvalidateTrans); transitionTable[Owned][Read].onSnoop(supplyAndGotoOwnedTrans); transitionTable[Owned][ReadEx].onSnoop(supplyAndInvalidateTrans); transitionTable[Owned][Upgrade].onSnoop(invalidateTrans); //Transitions on seeing a DMA (writeInv(samelevel) or DMAInv) transitionTable[Invalid][Invalidate].onSnoop(invalidateTrans); transitionTable[Shared][Invalidate].onSnoop(invalidateTrans); transitionTable[Exclusive][Invalidate].onSnoop(invalidateTrans); transitionTable[Modified][Invalidate].onSnoop(invalidateTrans); transitionTable[Owned][Invalidate].onSnoop(invalidateTrans); transitionTable[Invalid][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Shared][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Exclusive][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Modified][WriteInvalidate].onSnoop(invalidateTrans); transitionTable[Owned][WriteInvalidate].onSnoop(invalidateTrans); } else { cerr << "CoherenceProtocol: unrecognized protocol " << protocol << endl; fatal(""); }}MemCmdCoherenceProtocol::getBusCmd(MemCmd cmdIn, CacheBlk::State state, MSHR *mshr){ state &= stateMask; int cmd_idx = cmdIn.toIndex(); assert(0 <= state && state <= stateMax); assert(0 <= cmd_idx && cmd_idx < NUM_MEM_CMDS); MemCmd cmdOut = transitionTable[state][cmd_idx].busCmd; assert(cmdOut != InvalidCmd); ++requestCount[state][cmd_idx]; return cmdOut;}CacheBlk::StateCoherenceProtocol::getNewState(const MemReqPtr &req, CacheBlk::State oldState){ CacheBlk::State state = oldState & stateMask; int cmd_idx = req->cmd.toIndex(); assert(0 <= state && state <= stateMax); assert(0 <= cmd_idx && cmd_idx < NUM_MEM_CMDS); CacheBlk::State newState = transitionTable[state][cmd_idx].newState; //Check if it's exclusive and the shared line was asserted, //then goto shared instead if (newState == Exclusive && (req->flags & SHARED_LINE)) { newState = Shared; } assert(newState != -1); //Make sure not to loose any other state information newState = (oldState & ~stateMask) | newState; return newState;}boolCoherenceProtocol::handleBusRequest(BaseCache *cache, MemReqPtr &req, CacheBlk *blk, MSHR *mshr, CacheBlk::State & new_state){ if (blk == NULL) { // nothing to do if we don't have a block return false; } CacheBlk::State state = blk->status & stateMask; int cmd_idx = req->cmd.toIndex(); assert(0 <= state && state <= stateMax); assert(0 <= cmd_idx && cmd_idx < NUM_MEM_CMDS);// assert(mshr == NULL); // can't currently handle outstanding requests //Check first if MSHR, and also insure, if there is one, that it is not in service assert(!mshr || mshr->inService == 0); ++snoopCount[state][cmd_idx]; bool ret = transitionTable[state][cmd_idx].snoopFunc(cache, req, blk, mshr, new_state); return ret;}boolCoherenceProtocol::nullTransition(BaseCache *cache, MemReqPtr &req, CacheBlk *blk, MSHR *mshr, CacheBlk::State & new_state){ // do nothing if (blk) new_state = blk->status; return false;}boolCoherenceProtocol::invalidTransition(BaseCache *cache, MemReqPtr &req, CacheBlk *blk, MSHR *mshr, CacheBlk::State & new_state){ panic("Invalid transition"); return false;}#ifndef DOXYGEN_SHOULD_SKIP_THISBEGIN_DECLARE_SIM_OBJECT_PARAMS(CoherenceProtocol) Param<string> protocol; Param<bool> do_upgrades;END_DECLARE_SIM_OBJECT_PARAMS(CoherenceProtocol)BEGIN_INIT_SIM_OBJECT_PARAMS(CoherenceProtocol) INIT_PARAM(protocol, "name of coherence protocol"), INIT_PARAM_DFLT(do_upgrades, "use upgrade transactions?", true)END_INIT_SIM_OBJECT_PARAMS(CoherenceProtocol)CREATE_SIM_OBJECT(CoherenceProtocol){ return new CoherenceProtocol(getInstanceName(), protocol, do_upgrades);}REGISTER_SIM_OBJECT("CoherenceProtocol", CoherenceProtocol)#endif // DOXYGEN_SHOULD_SKIP_THIS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -