Esempio n. 1
0
/*
 * writebackStage - determines when the pipeline should stop executing.
 *                  also handles dump instructions
 *
 * Returns: TRUE when pipeline should stop
 */
bool writebackStage(forwardType * forward, statusType* status)
{

    forward->W_dstE = W.dstE;
    forward->W_valE = W.valE;
    forward->W_dstM = W.dstM;
    forward->W_valM = W.valM;
    forward->W_icode = W.icode;
    status->W_stat = W.stat;
    
    if(W.stat == SAOK)
    {
        setRegister(W.dstE, W.valE);
        setRegister(W.dstM, W.valM);
    }

    if(W.stat == SINS)
    {
       printf("Invalid instruction\n");
       dumpProgramRegisters();
       dumpProcessorRegisters();
       dumpMemory();
       return true;
    }
    else if(W.stat == SADR)
    {
        printf("Invalid memory address\n");
        dumpProgramRegisters();
        dumpProcessorRegisters();
        dumpMemory();
        return true;
    }
    else if(W.stat == SHLT)
    {
        return true;
    }
    
    if(W.icode == DUMP && W.valE & 1)
    {
        dumpProgramRegisters();
    }

    if(W.icode == DUMP && W.valE & 2)
    {
        dumpProcessorRegisters();
    }

    if(W.icode == DUMP && W.valE & 4)
    {
        dumpMemory();
    }

    return false;
}
Esempio n. 2
0
/* Function Name: writebackStage
 * Purpose:       To simulate the writeback stage in a pipeline machine
 *
 * Parameters:    forward - struct containing values used for forwarding
 *                status - struct containing values for the status of the memory and writeback stages
 * Returns:       TRUE if status is anything other than SAOK, FALSE otherwise
 * Modifies:      Appropriate values in forward and status structs
 */
bool writebackStage(forwardType *forward, statusType *status){

    //set appropriate forwarding values
    forward->W_valE = W.valE;
    forward->W_dstE = W.dstE;
    forward->W_dstM = W.dstM;
    forward->W_valM = W.valM;
    forward->W_icode = W.icode;

    //set appropriate status value
    status->W_stat = W.stat;

    //check if instruction is a dump
    if(W.icode == IDUMP){
        if(W.valE & 0x1) dumpProgramRegisters();
        if(W.valE & 0x2) dumpProcessorRegisters();
        if(W.valE & 0x4) dumpMemory();
    }

    //only update registers if status is SAOK
    if(W.stat == SAOK){
    setRegister(W.dstE, W.valE);
    setRegister(W.dstM, W.valM);
    }
    
    //determines next operation based on status
    switch(W.stat){
        case SAOK:
            return FALSE; //continue program operation
        case SHLT:
            return TRUE; //program terminated due to halt
        case SADR:
            printf("Invalid memory address\n"); 
            dumpProgramRegisters();
            dumpProcessorRegisters();
            dumpMemory();
            return TRUE; //invalid memory address, dump everything and terminate
        case SINS:
            printf("Invalid instruction\n");
            dumpProgramRegisters();
            dumpProcessorRegisters();
            dumpMemory();
            return TRUE; //invalid instruction, dump everything and terminate
    }
}
Esempio n. 3
0
/**
 * Execute the writeback stage.
 * @param  FORW A pointer to the forwarding struct `forwarding.h`
 * @return      True if processor should halt, otherwise false
 */
bool writebackStage(forwardType * FORW) {
    FORW->W_dstE = W.dstE;
    FORW->W_valE = W.valE;
    FORW->W_icode = W.icode;
    FORW->W_valM = W.valM;
    FORW->W_dstM = W.dstM;
    FORW->W_stat = W.stat;

    if (W.stat == S_INS) {
        printf("Invalid instruction\n");
        dumpProgramRegisters();
        dumpProcessorRegisters();
        dumpMemory();
        return true;
    } else if (W.stat == S_ADR) {
        printf("Invalid memory address\n");
        dumpProgramRegisters();
        dumpProcessorRegisters();
        dumpMemory();
        return true;
    } else if (W.stat == S_HLT) {
        return true;
    } else {
        // Status AOK
    }

    setRegister(W.dstE, W.valE);
    setRegister(W.dstM, W.valM);

    if (W.icode == I_DUMP) {
        unsigned int dump_flags = getBits(0, 3, W.valE);
        if (dump_flags & 0x1) {
            dumpProgramRegisters();
        }
        if (dump_flags & 0x2) {
            dumpProcessorRegisters();
        }
        if (dump_flags & 0x4) {
            dumpMemory();
        }
    }
    return false;
}
// Function: writebackStage
// Description: Simulates the writebackStage of the y86 pipe
// Params: *forward, *status
// Returns: Bool
// Modifies: None
bool writebackStage(forwardType *forward, statusType *status)
{
    forward->W_dstE = W.dstE;
    forward->W_valE = W.valE;
    forward->W_valM = W.valM;
    forward->W_dstM = W.dstM;
    status->W_stat = W.stat;
	forward->W_icode = W.icode;
    //setRegister(W.dstE, W.valE);
    //setRegister(W.dstM, W.valM);
    /*if (W.icode == mrmovl || W.icode == popl)
    {
        setRegister(W.dstM, W.valM);
    }
    if(W.icode == OPL || W.icode == rrmovl || W.icode == irmovl || W.icode == popl || W.icode == pushl)
    {
        setRegister(W.dstE, W.valE);
    }*/
    if(W.dstM == none)
    {
        W.valM = 0;
    }
    
    if (W.stat == HLT || W.stat == INS || W.stat == ADR)
    {
	    if(W.stat == INS)
        {
            printf("Invalid instruction\n");
            dumpProgramRegisters();
            dumpProcessorRegisters();
            dumpMemory();
        }
        if(W.stat == ADR)
        {
            printf("Invalid memory address\n");
            dumpProgramRegisters();
            dumpProcessorRegisters();
            dumpMemory();
        }
        return true;
    }
    else
    {
    setRegister(W.dstE, W.valE);
    setRegister(W.dstM, W.valM);
    if (W.icode == dump)
        {
            int temp_array[3] = {getBits(0,0,W.valE),getBits(1,1,W.valE),getBits(2,2,W.valE)};
            if (temp_array[0])
            {
                dumpProgramRegisters();
            }
            if (temp_array[1])
            {
                dumpProcessorRegisters();
            }
            if (temp_array[2])
            {
                dumpMemory();
            }
        }
        return false;
    }
}