Hello

I am observing a peculiar behavior while running the O3 CPU. There is a non-speculative, memory barrier instruction at the head of the ROB. The ROB waits for many ticks to write back all the stores before this instruction. Then all of a sudden, in of the ticks, the CPU decides that it cannot commit this particular instruction and then it decides to squash this instruction. Can some one explain as to why this might happen?

While squashing the instruction, the following code from the function doSquash() in o3/inst_queue_impl.hh is invoked. That particular instruction fails on the assert. If I comment out the assert, the simulation runs to completion (which is indicator of nothing). Should this instruction fail this assert? How can I ensure that the simulation runs fine even when the assert is in place?


            } else if (!squashed_inst->isStoreConditional() ||
                       !squashed_inst->isCompleted()) {
                NonSpecMapIt ns_inst_it =
                    nonSpecInsts.find(squashed_inst->seqNum);

                if (ns_inst_it == nonSpecInsts.end()) {
                    assert(squashed_inst->getFault() != NoFault);
                } else {

                    (*ns_inst_it).second = NULL;

                    nonSpecInsts.erase(ns_inst_it);

                    ++iqSquashedNonSpecRemoved;
                }
            }

Note that I am running O3 CPU with Ruby.

Thanks
Nilay
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to