Hi Arthur Perais, Thanks for your response. I have a question regarding blocking & unblocking of decode stage. Could you please help me in understanding them.
I am working on a O3 CPU model with below configuration fetchToDecodeDelay = 1 fetchWidth = 8 decodeToFetchDelay=1 decodeWidth = 4 skid-buffer b/w fetch & decode - skidBufferMax = (fetchToDecodeDelay + 1) * params->fetchWidth; => skidBufferMax= (1+1) * 8 = 16 All my experiment are based on 1 CPU with 1 thread. decode_impl.hh: In decodeInsts() - assuming decode was not in unblocking stage, it will get 8 instruction from insts[tid] (from fetch stage) However, since decodeWidth=4, only 4 instruction will be decode. Thus 4 instruction are still left. In the same function, there is a logic to block the decode stage and inform the fetch stage about it, if all the instruction were not decoded. My question, is why the docode is blocked when there is still space left in skidbuffer (i.e. 12). Fetch can still send instruction in skidbuffer, while decode is busy with 4 instructions. if (!insts_to_decode.empty()) { block(tid); } The unblock() in decode stage unblock it only if skidbuffer is empty. Can't we unblock the decode stage as soon as we have enough space for storing fetch instruction (here 8). DefaultDecode<Impl>::unblock(ThreadID tid) { if (skidBuffer[tid].empty()) { toFetch->decodeUnblock[tid] = true; } } Please shed some light on this. Am I missing something or interpreting it wrong ? Thanks. Thanks for your time in advance. -- with regards, Virendra Kumar Pathak
_______________________________________________ gem5-users mailing list gem5-users@gem5.org http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users