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

Reply via email to