[CALU] Re: [CALU] Re: werd mich mal um die stall detection unit kümmern

  • From: Martin Elshuber <e9825286@xxxxxxxxxxxxxxxxxxxx>
  • To: calu-ss2010-tuwien@xxxxxxxxxxxxx
  • Date: Sat, 15 May 2010 13:25:38 +0200

Macht sinn was du da sagst:

ich werds jetzt mal so implementieren:
die stall unit erkennt eine stall grenze. und teilt der stufe emit_nop='1' mit und den stufen davor stall='1'
anmerkung:
 emit_nop gibt es nur für ex und id.
 if->id kann keine stall grenze sein
wb->id (writeback) kann nur eine stall grenze bei ld befehelen sein, in diesem fall ist aber wb_en invariant in wb, inkorrekte zwischenergenisse werden garantiert am ende überschreiben

frage zu datadependencies:
 grundsätlich wird die stalldetection unit in etwa so aussehen:

 stall2id=stall2if=stall2ex=stall2wb=emitnop2id=emitnop2ex=0;

 if (id.needs_ra and ex.wb_en=1 and ex.rd=id.ra) or
    (id.needs_rb and ex.wb_en=1 and ex.rd=id.rb) or
    (id.needs_rx and ex.wb_en=1 and ex.rd=id.rx) then
 {
   stall2if=stall2id='1';
   emitnop2id='1';
 }
 ....


 nun die frage:
die signale "needs_r?" bedeuten, ob der befehl überhaupt das jeweilige register lesen wird. Es macht wenig sinn bei "xor r1,r1,r1; orm r2,r3,1" zu stallen da orm die 1 als immendiate und nicht als r1 interpretiert. wohin würdest du die generierung dieser drei werte geben?
   in meinen augen sollten sie von opdecode generiert werden

zu den branches:
 so wie ich das sehe können die nur flushen

g martin

Günther Wimpassinger wrote:
Zitat von Martin Elshuber <e9825286@xxxxxxxxxxxxxxxxxxxx>:

es gibt 2 "stalls" die wir unterscheiden müssen


Ich weiß nicht, ob es wirklich zwei Arten gibt. An der "Stallgrenze"
muss (immer) ein NOP eingefügt werden. Bei einer BUSY Einheit
(Alu oder Datamem) liegt diese Grenze nach der jeweiligen Stage,
bei einer Datadependency liegt sie in zwischen ID und EX oder
dort wo die Datadependency erkannt wird (so genau hab ich mir
das noch nicht angesehen)

Ein Stall einer Stage heißt für mich: Das Pipeline-Register dieser Stage
wird nicht verändert. D.h. aber dass man nie die "ganze" Pipeline
stalled sondern immer nur Teile davon. Ansonsten würde ja keine
Veränderung mehr statt finden.

Beispiele:

addi r2,r1,7
subi r3,r2,2

Der Stall wird hervorgerufen, durch das was in ID ermittelt wurde und das
was in EX (bzw WB) steht (Register Konflikt) D.h. ID und IF werden gestalled, WB übernimmt von EX und EX wird mit NOP gefüllt. Hier ist die "Stallgrenze"
zwischen ID und EX.

mul r2,r1,3
add r4,r5,r6

Hier ist die ALU in EX busy und stallt somit jedenfalls IF und ID. Das EX-Register (welches von ID kommt) muss meiner Meinung auch erhalten
bleiben (sonst muss bei MUL einer der Operanden nochmal zusätzlich in
einem Register landen). In WB muss entsprechend der Dauer von MUL
jeden Takt ein NOP eingefügt werden. Hier liegt die "Stallgrenze" zwischen
EX und WB.

Kann ein Branch auch zu einem stall oder nur zu einem flush führen?

Mahlzeit
Günther




Other related posts: