More changes toward making simpleCpu use new port interface.
authorRon Dreslinski <rdreslin@umich.edu>
Tue, 31 Jan 2006 20:00:09 +0000 (15:00 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Tue, 31 Jan 2006 20:00:09 +0000 (15:00 -0500)
cpu/simple/cpu.cc:
    Initialize the ports, also add Request and Packet instead of MemReq.  Initial work at ICache read in place.
cpu/simple/cpu.hh:
    Need to call the completion handler when we see a recieve.

--HG--
extra : convert_revision : a52caee6f0ceb5d9ee1e5acca63a202f5ea71359

cpu/simple/cpu.cc
cpu/simple/cpu.hh

index a7f4fa49937c5a39b83f94b85a250fc81d9371d9..d913505f1512df4e555a7b5952186d8acb697d15 100644 (file)
@@ -115,7 +115,7 @@ SimpleCPU::CacheCompletionEvent::description()
 
 SimpleCPU::SimpleCPU(Params *p)
     : BaseCPU(p), tickEvent(this, p->width), xc(NULL),
-      cacheCompletionEvent(this)
+      cacheCompletionEvent(this), dcache_port(this), icache_port(this)
 {
     _status = Idle;
 #if FULL_SYSTEM
@@ -130,10 +130,12 @@ SimpleCPU::SimpleCPU(Params *p)
     icacheInterface = p->icache_interface;
     dcacheInterface = p->dcache_interface;
 
-    memReq = new MemReq();
-    memReq->xc = xc;
-    memReq->asid = 0;
-    memReq->data = new uint8_t[64];
+    req = new CpuRequest();
+    pkt = new Packet();
+
+    req->asid = 0;
+    pkt->req = req;
+    pkt->data = new uint8_t[64];
 
     numInst = 0;
     startNumInst = 0;
@@ -704,16 +706,20 @@ SimpleCPU::tick()
 #define IFETCH_FLAGS(pc)       0
 #endif
 
-        memReq->cmd = Read;
-        memReq->reset(xc->regs.pc & ~3, sizeof(uint32_t),
-                     IFETCH_FLAGS(xc->regs.pc));
+        pkt->cmd = Read;
+        req->paddr = xc->regs.pc & ~3;
+        pkt->size = sizeof(uint32_t);
 
+/*     memReq->reset(xc->regs.pc & ~3, sizeof(uint32_t),
+                     IFETCH_FLAGS(xc->regs.pc));
+*/
+//NEED NEW TRANSLATION HERE
         fault = xc->translateInstReq(memReq);
 
         if (fault == No_Fault)
             fault = xc->mem->read(memReq, inst);
 
-        if (icacheInterface && fault == No_Fault) {
+/*     if (icacheInterface && fault == No_Fault) {
             memReq->completionEvent = NULL;
 
             memReq->time = curTick;
@@ -723,7 +729,7 @@ SimpleCPU::tick()
             // Ugly hack to get an event scheduled *only* if the access is
             // a miss.  We really should add first-class support for this
             // at some point.
-            if (result != MA_HIT && icacheInterface->doEvents()) {
+                if (result != MA_HIT && icacheInterface->doEvents()) {
                 memReq->completionEvent = &cacheCompletionEvent;
                 lastIcacheStall = curTick;
                 unscheduleTickEvent();
@@ -731,6 +737,16 @@ SimpleCPU::tick()
                 return;
             }
         }
+*/
+        bool success = icache_port.sendTiming(pkt);
+        if (!success)
+        {
+            //Need to wait for retry
+            lastIcacheStall = curTick;
+            unscheduleTickEvent();
+            _status = IcacheMissStall;
+            return;
+        }
     }
 
     // If we've got a valid instruction (i.e., no fault on instruction
index 0fb6235b46c5482fb2434944201af364b577beff..ac4e1cf2241e60d67957483b1988887a259b239d 100644 (file)
@@ -80,13 +80,13 @@ class SimpleCPU : public BaseCPU
       protected:
 
         virtual bool recvTiming(Packet &pkt)
-        { return cpu->recvTiming(pkt); }
+        { return cpu->processCacheCompletion(pkt); }
 
         virtual Tick recvAtomic(Packet &pkt)
-        { return cpu->recvAtomic(pkt); }
+        { return cpu->processCacheCompletion(pkt); }
 
         virtual void recvFunctional(Packet &pkt)
-        { cpu->recvFunctional(pkt); }
+        { cpu->processCacheCompletion(pkt); }
 
         virtual void recvStatusChange(Status status)
         { cpu->recvStatusChange(status); }
@@ -192,17 +192,11 @@ class SimpleCPU : public BaseCPU
     bool interval_stats;
 #endif
 
-    // L1 instruction cache
-    MemInterface *icacheInterface;
-
-    // L1 data cache
-    MemInterface *dcacheInterface;
-
     // current instruction
     MachInst inst;
 
-    // Refcounted pointer to the one memory request.
-    MemReqPtr memReq;
+    CpuRequest *req;
+    Packet *pkt;
 
     // Pointer to the sampler that is telling us to switchover.
     // Used to signal the completion of the pipe drain and schedule