From dcc22079fc1c455df70ab1263ea09400e4c948d6 Mon Sep 17 00:00:00 2001 From: bd Date: Sat, 8 Mar 2025 15:19:57 -0500 Subject: Remove queue in storage.h --- inc/storage.h | 23 +++-------------------- src/storage/dram.cc | 5 +++-- src/storage/storage.cc | 4 ++-- tests/dram.cc | 45 --------------------------------------------- 4 files changed, 8 insertions(+), 69 deletions(-) diff --git a/inc/storage.h b/inc/storage.h index 95b6749..4bf4591 100644 --- a/inc/storage.h +++ b/inc/storage.h @@ -4,33 +4,16 @@ #include "response.h" #include #include -#include #include enum Accessor { + IDLE, MEM, FETCH, L1CACHE, SIDE, }; -/** - * Wrapper class for std::deque. - * - * Implements a deque that does not push duplicate objects. - */ -template class Deque : public std::deque -{ - public: - using std::deque::deque; - - void push_back(const T &value) - { - if (std::find(this->begin(), this->end(), value) == this->end()) - std::deque::push_back(value); - } -}; - class Storage { public: @@ -83,9 +66,9 @@ class Storage */ int delay; /** - * The accessors currently being serviced, in first come first serve order. + * The accessor currently being serviced. */ - Deque deque; + enum Accessor requester; /** * The number of cycles until the current request is completed. */ diff --git a/src/storage/dram.cc b/src/storage/dram.cc index 5b4c63b..7197668 100644 --- a/src/storage/dram.cc +++ b/src/storage/dram.cc @@ -23,9 +23,10 @@ Response Dram::write(Accessor accessor, signed int data, int address) r = OK; } else { /* Do this first--then process the first cycle immediately. */ - this->deque.push_back(accessor); + if (this->requester == IDLE) + this->requester = accessor; - if (this->deque.front() == accessor) { + if (this->requester == accessor) { if (this->wait_time == 0) { this->do_write(data, address); r = OK; diff --git a/src/storage/storage.cc b/src/storage/storage.cc index 429f8aa..e3067a2 100644 --- a/src/storage/storage.cc +++ b/src/storage/storage.cc @@ -24,9 +24,9 @@ void Storage::do_write(signed data, int address) void Storage::resolve() { if (this->wait_time == 0) { - this->deque.pop_front(); + this->requester = IDLE; this->wait_time = delay; - } else if (!this->deque.empty()) { + } else if (this->requester != IDLE) { --this->wait_time; } } diff --git a/tests/dram.cc b/tests/dram.cc index e0189c7..c646135 100644 --- a/tests/dram.cc +++ b/tests/dram.cc @@ -188,51 +188,6 @@ TEST_CASE( delete d; } -TEST_CASE("Many conflicting requests first-come first serve", "[dram]") -{ - int delay = 1; - Dram *d = new Dram(1, delay); - std::array expected = {0, 0, 0, 0}; - std::array actual = d->view(0, 1)[0]; - CHECK(expected == actual); - - signed int w = 0x11223344; - - Response r; - r = d->write(FETCH, w, 0x00000000); - r = d->write(MEM, w, 0x00000001); - - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - d->resolve(); - - r = d->write(FETCH, w, 0x00000000); - r = d->write(L1CACHE, w, 0x00000002); - // call mem after cache - r = d->write(MEM, w, 0x00000001); - - expected.at(0) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - d->resolve(); - - r = d->write(MEM, w, 0x00000001); - r = d->write(L1CACHE, w, 0x00000002); - - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - d->resolve(); - - r = d->write(MEM, w, 0x00000001); - r = d->write(L1CACHE, w, 0x00000002); - - expected.at(1) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - delete d; -} - TEST_CASE("Sidedoor bypasses delay", "[dram]") { int delay = 3; -- cgit v1.2.3