Enforce the timing cpu ticking at it's clock rate

Add a max time option in seconds and a single system root clock be 1THz

configs/test/fs.py:
    Add a max time option in seconds and a single system root clock be 1THz
src/cpu/simple/timing.cc:
src/cpu/simple/timing.hh:
    Enforce the timing cpu ticking at it's clock rate

--HG--
extra : convert_revision : a1b0de27abde867f9c3da5bec11639e3d82a95f5
This commit is contained in:
Ali Saidi
2006-07-20 19:00:40 -04:00
parent 15e5ce96c7
commit e8a3295075
3 changed files with 88 additions and 10 deletions

View File

@@ -85,8 +85,16 @@ TimingSimpleCPU::CpuPort::recvStatusChange(Status status)
panic("TimingSimpleCPU doesn't expect recvStatusChange callback!");
}
void
TimingSimpleCPU::CpuPort::TickEvent::schedule(Packet *_pkt, Tick t)
{
pkt = _pkt;
Event::schedule(t);
}
TimingSimpleCPU::TimingSimpleCPU(Params *p)
: BaseSimpleCPU(p), icachePort(this), dcachePort(this)
: BaseSimpleCPU(p), icachePort(this, p->clock), dcachePort(this, p->clock)
{
_status = Idle;
ifetch_pkt = dcache_pkt = NULL;
@@ -462,11 +470,26 @@ TimingSimpleCPU::completeIfetch(Packet *pkt)
}
}
void
TimingSimpleCPU::IcachePort::ITickEvent::process()
{
cpu->completeIfetch(pkt);
}
bool
TimingSimpleCPU::IcachePort::recvTiming(Packet *pkt)
{
cpu->completeIfetch(pkt);
// These next few lines could be replaced with something faster
// who knows what though
Tick time = pkt->req->getTime();
while (time < curTick)
time += lat;
if (time == curTick)
cpu->completeIfetch(pkt);
else
tickEvent.schedule(pkt, time);
return true;
}
@@ -523,10 +546,24 @@ TimingSimpleCPU::completeDrain()
bool
TimingSimpleCPU::DcachePort::recvTiming(Packet *pkt)
{
cpu->completeDataAccess(pkt);
Tick time = pkt->req->getTime();
while (time < curTick)
time += lat;
if (time == curTick)
cpu->completeDataAccess(pkt);
else
tickEvent.schedule(pkt, time);
return true;
}
void
TimingSimpleCPU::DcachePort::DTickEvent::process()
{
cpu->completeDataAccess(pkt);
}
void
TimingSimpleCPU::DcachePort::recvRetry()
{

View File

@@ -74,11 +74,12 @@ class TimingSimpleCPU : public BaseSimpleCPU
{
protected:
TimingSimpleCPU *cpu;
Tick lat;
public:
CpuPort(const std::string &_name, TimingSimpleCPU *_cpu)
: Port(_name), cpu(_cpu)
CpuPort(const std::string &_name, TimingSimpleCPU *_cpu, Tick _lat)
: Port(_name), cpu(_cpu), lat(_lat)
{ }
protected:
@@ -92,14 +93,26 @@ class TimingSimpleCPU : public BaseSimpleCPU
virtual void getDeviceAddressRanges(AddrRangeList &resp,
AddrRangeList &snoop)
{ resp.clear(); snoop.clear(); }
struct TickEvent : public Event
{
Packet *pkt;
TimingSimpleCPU *cpu;
TickEvent(TimingSimpleCPU *_cpu)
:Event(&mainEventQueue), cpu(_cpu) {}
const char *description() { return "Timing CPU clock event"; }
void schedule(Packet *_pkt, Tick t);
};
};
class IcachePort : public CpuPort
{
public:
IcachePort(TimingSimpleCPU *_cpu)
: CpuPort(_cpu->name() + "-iport", _cpu)
IcachePort(TimingSimpleCPU *_cpu, Tick _lat)
: CpuPort(_cpu->name() + "-iport", _cpu, _lat), tickEvent(_cpu)
{ }
protected:
@@ -107,14 +120,26 @@ class TimingSimpleCPU : public BaseSimpleCPU
virtual bool recvTiming(Packet *pkt);
virtual void recvRetry();
struct ITickEvent : public TickEvent
{
ITickEvent(TimingSimpleCPU *_cpu)
: TickEvent(_cpu) {}
void process();
const char *description() { return "Timing CPU clock event"; }
};
ITickEvent tickEvent;
};
class DcachePort : public CpuPort
{
public:
DcachePort(TimingSimpleCPU *_cpu)
: CpuPort(_cpu->name() + "-dport", _cpu)
DcachePort(TimingSimpleCPU *_cpu, Tick _lat)
: CpuPort(_cpu->name() + "-dport", _cpu, _lat), tickEvent(_cpu)
{ }
protected:
@@ -122,6 +147,17 @@ class TimingSimpleCPU : public BaseSimpleCPU
virtual bool recvTiming(Packet *pkt);
virtual void recvRetry();
struct DTickEvent : public TickEvent
{
DTickEvent(TimingSimpleCPU *_cpu)
: TickEvent(_cpu) {}
void process();
const char *description() { return "Timing CPU clock event"; }
};
DTickEvent tickEvent;
};
IcachePort icachePort;