⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coherence_protocol.cc

📁 linux下基于c++的处理器仿真平台。具有处理器流水线
💻 CC
📖 第 1 页 / 共 2 页
字号:
	// 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 + -