Esempio n. 1
0
/*
 * 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);
}
Esempio n. 2
0
/* 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);
    
}