3636 selector->deallocate (x); \
3737 } while (0 )
3838
39- #define READYQ_PUSH (x ) \
40- do { \
41- (x)->setInReadyQ (); \
42- auto & readyQ = readyQclassify[(x)->opClass ()]; \
43- auto it = std::lower_bound (readyQ->begin (), readyQ->end (), (x), select_policy ()); \
44- readyQ->insert (it, (x)); \
45- } while (0 )
46-
4739// must be consistent with FUScheduler.py
4840// rfTypePortId = regfile typeid + portid
4941#define MAXVAL_TYPEPORTID (1 << (2 + 4 )) // [5:4] is typeid, [3:0] is portid
@@ -191,21 +183,18 @@ IssueQue::IssueQue(const IssueQueParams& params)
191183 iqsize(params.size),
192184 scheduleToExecDelay(params.scheduleToExecDelay),
193185 iqname(params.name),
194- inflightIssues(scheduleToExecDelay, 0 ),
195186 selector(params.sel)
196187{
197- toIssue = inflightIssues.getWire (0 );
198- toFu = inflightIssues.getWire (-scheduleToExecDelay);
199188 if (outports > 8 ) {
200189 panic (" %s: outports > 8 is not supported\n " , iqname);
201190 }
191+ toIssue.resize (outports);
192+ toFu.resize (outports);
202193
203194 portBusy.resize (outports, 0 );
204-
205195 intRdRfTPI.resize (outports);
206196 fpRdRfTPI.resize (outports);
207197 intWrRfTPI.resize (outports);
208-
209198 readyQs.resize (outports, nullptr );
210199
211200 readyQclassify.resize (Num_OpClasses, nullptr );
@@ -355,7 +344,6 @@ IssueQue::addToFu(const DynInstPtr& inst)
355344void
356345IssueQue::issueToFu ()
357346{
358- int size = toFu->size ;
359347 int replayed = 0 ;
360348 int issued = 0 ;
361349
@@ -393,8 +381,8 @@ IssueQue::issueToFu()
393381 issued++;
394382 }
395383
396- for (int i = 0 ; i < size ; i++) {
397- auto inst = toFu-> pop () ;
384+ for (int i = 0 ; i < outports ; i++) {
385+ auto & inst = * toFu[i] ;
398386 if (!inst) {
399387 continue ;
400388 }
@@ -409,7 +397,7 @@ IssueQue::issueToFu()
409397 (inst->isStore () && (issuedStore >= numStorePipe)) || blockLoad) {
410398 inst->clearScheduled ();
411399 // only for load/store
412- READYQ_PUSH (inst);
400+ readyQInsert (inst);
413401 DPRINTF (Schedule, " [sn:%llu] issue failed due to being occupied\n " , inst->seqNum );
414402 continue ;
415403 }
@@ -526,7 +514,7 @@ IssueQue::addIfReady(const DynInstPtr& inst)
526514 DPRINTF (Schedule, " [sn:%llu] add to readyInstsQue\n " , inst->seqNum );
527515 inst->clearCancel ();
528516 if (!inst->inReadyQ ()) {
529- READYQ_PUSH (inst);
517+ readyQInsert (inst);
530518 }
531519 }
532520}
@@ -629,12 +617,12 @@ IssueQue::scheduleInst()
629617 iqstats->arbFailed ++;
630618 assert (inst->readyToIssue ());
631619
632- READYQ_PUSH (inst);
620+ readyQInsert (inst);
633621 } else [[likely]] {
634622 DPRINTF (Schedule, " [sn:%llu] no conflict, scheduled\n " , inst->seqNum );
635623 iqstats->portissued [pi]++;
636624 inst->setScheduled ();
637- toIssue-> push ( inst) ;
625+ * toIssue[pi] = inst;
638626 inst->issueportid = pi;
639627
640628 if (!opPipelined[inst->opClass ()]) {
@@ -661,7 +649,6 @@ IssueQue::tick()
661649 instNumInsert = 0 ;
662650
663651 scheduleInst ();
664- inflightIssues.advance ();
665652
666653 for (auto & t : portBusy) {
667654 t = t >> 1 ;
@@ -774,16 +761,6 @@ IssueQue::doSquash(const InstSeqNum seqNum)
774761 }
775762 }
776763
777- for (int i = 0 ; i <= getIssueStages (); i++) {
778- int size = inflightIssues[-i].size ;
779- for (int j = 0 ; j < size; j++) {
780- auto & inst = inflightIssues[-i].insts [j];
781- if (inst && inst->isSquashed ()) {
782- inst = nullptr ;
783- }
784- }
785- }
786-
787764 // clear in depGraph
788765 for (auto & entrys : subDepGraph) {
789766 for (auto it = entrys.begin (); it != entrys.end ();) {
@@ -853,10 +830,13 @@ Scheduler::Scheduler(const SchedulerParams& params)
853830 int maxRdTypePortId = 0 ;
854831 int maxWrTypePortId = 0 ;
855832 for (int i = 0 ; i < issueQues.size (); i++) {
833+ auto iq = issueQues[i];
856834 issueQues[i]->setIQID (i);
857835 issueQues[i]->scheduler = this ;
858- combinedFus += issueQues[i]->outports ;
859836 panic_if (issueQues[i]->fuDescs .size () == 0 , " Empty config IssueQue: " + issueQues[i]->getName ());
837+ for (int j = 0 ; j < iq->outports ; j++) {
838+ inflightIssues.push_back (TimeBuffer<DynInstPtr>(0 , iq->scheduleToExecDelay ));
839+ }
860840 for (auto fu : issueQues[i]->fuDescs ) {
861841 for (auto op : fu->opDescList ) {
862842 opExecTimeTable[op->opClass ] = op->opLat ;
@@ -899,6 +879,13 @@ Scheduler::Scheduler(const SchedulerParams& params)
899879 }
900880 wrRfPortOccupancy.resize (maxWrTypePortId, {nullptr , 0 , 0 });
901881
882+ int portid = 0 ;
883+ for (auto iq : issueQues) {
884+ for (int i = 0 ; i < iq->outports ; i++) {
885+ iq->setIssuePipe (inflightIssues[portid], i);
886+ portid++;
887+ }
888+ }
902889
903890 // dispatch distance counter allocate
904891 dispOpdist.resize (Num_OpClasses, nullptr );
@@ -1027,6 +1014,10 @@ Scheduler::tick()
10271014 for (auto it : issueQues) {
10281015 it->tick ();
10291016 }
1017+
1018+ for (auto & it : inflightIssues) {
1019+ it.advance ();
1020+ }
10301021}
10311022
10321023void
@@ -1392,14 +1383,11 @@ Scheduler::loadCancel(const DynInstPtr& inst)
13921383 }
13931384 }
13941385
1395- for (auto iq : issueQues) {
1396- for (int i = 0 ; i <= iq->getIssueStages (); i++) {
1397- int size = iq->inflightIssues [-i].size ;
1398- for (int j = 0 ; j < size; j++) {
1399- auto & inst = iq->inflightIssues [-i].insts [j];
1400- if (inst && inst->canceled ()) {
1401- inst = nullptr ;
1402- }
1386+ for (auto & it : inflightIssues) {
1387+ for (int i = 0 ; i < it.getSize (); i++) {
1388+ auto & inst = it[i];
1389+ if (inst && inst->canceled ()) {
1390+ inst = nullptr ;
14031391 }
14041392 }
14051393 }
@@ -1500,6 +1488,15 @@ Scheduler::doSquash(const InstSeqNum seqNum)
15001488 for (auto it : issueQues) {
15011489 it->doSquash (seqNum);
15021490 }
1491+
1492+ for (auto & it : inflightIssues) {
1493+ for (int i = 0 ; i < it.getSize (); i++) {
1494+ auto & inst = it[i];
1495+ if (inst && inst->isSquashed ()) {
1496+ inst = nullptr ;
1497+ }
1498+ }
1499+ }
15031500}
15041501
15051502uint32_t
0 commit comments