/* * memoryStage - writes or reads from memory when needed * Updates values for writebackStage * * params - forwardType * forward, statusType* status, bubbleType* bubble * */ void memoryStage(forwardType * forward, statusType* status, bubbleType* bubble) { unsigned int addr = mem_addr(); unsigned int valM = M.valA; bool memError = false; unsigned int stat = M.stat; if(mem_write()) { putWord(addr, valM, &memError); } if(mem_read()) { valM = getWord(addr, &memError); } if(memError) stat = SADR; //forward values forward->M_dstM = M.dstM; forward->M_dstE = M.dstE; forward->m_valM = valM; forward->M_valE = M.valE; forward->M_Cnd = M.Cnd; forward->M_valA = M.valA; forward->M_icode = M.icode; status->m_stat = stat; bubble->M_icode = M.icode; updateWregister(stat, M.icode, M.valE, valM, M.dstE, M.dstM); }
/* memoryStage * Controls the main combinational logic of the memory stage * Params: fwdStruct *fwd - contains a bunch of forwarding info * Returns: void * Modifies: Writeback Register */ void memoryStage(fwdStruct *fwd) { if (M.stat == SINS || M.stat == SADR || M.stat == SHLT) canUpdateMem = FALSE; int valM = M.valA, stat = M.stat; bool readC = FALSE, writeC = FALSE, memError = FALSE; memoryControl(&readC, &writeC); int memAddr = memoryAddr(); if (readC) valM = getWord(memAddr, &memError); if (writeC && canUpdateMem) putWord(memAddr, M.valA, &memError); if (memError) { stat = SADR; canUpdateMem = FALSE; } fwd->M_valE = M.valE; fwd->m_valM = valM; fwd->M_dstE = M.dstE; fwd->M_dstM = M.dstM; fwd->M_Cnd = M.Cnd; fwd->M_icode = M.icode; fwd->M_valA = M.valA; fwd->m_stat = stat; if (!W_stall(fwd)) updateWregister(stat, M.icode, M.valE, valM, M.dstE, M.dstM); }