diff options
author | bd <bdunahu@operationnull.com> | 2025-04-11 23:09:49 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-04-11 23:09:49 -0400 |
commit | df580c5352528a4837b996a838f486d3838050a4 (patch) | |
tree | 72671b34d6baf1ea2ec4cd02f73fe51338ce0b6d /tests | |
parent | 3eeb345d673bee6d62b04fc8a8a95ab822dc1e45 (diff) |
Move storage to a separate git repository.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/cache.cc | 189 | ||||
-rw-r--r-- | tests/dram.cc | 351 |
2 files changed, 0 insertions, 540 deletions
diff --git a/tests/cache.cc b/tests/cache.cc deleted file mode 100644 index 0b04bce..0000000 --- a/tests/cache.cc +++ /dev/null @@ -1,189 +0,0 @@ -#include "cache.h" -#include "dram.h" -#include <catch2/catch_test_macros.hpp> - -class CacheFixture -{ - public: - CacheFixture() - { - this->m_delay = 4; - this->c_delay = 2; - this->d = new Dram(this->m_delay); - this->c = new Cache(this->d, this->c_delay); - this->expected = {0, 0, 0, 0}; - this->actual = this->c->view(0, 1)[0]; - } - - ~CacheFixture() { delete this->c; } - - /** - * An operation that is done a lot. - */ - void - wait_for_storage(int delay, Response expected, std::function<Response()> f) - { - for (int i = 0; i < delay; ++i) { - Response r = f(); - - // check response - CHECK(r == expected); - // check for early modifications - actual = c->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - } - - int m_delay; - int c_delay; - Cache *c; - Dram *d; - std::array<signed int, LINE_SIZE> expected; - std::array<signed int, LINE_SIZE> actual; -}; - -TEST_CASE_METHOD(CacheFixture, "store 0th element in DELAY cycles", "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - // delay + 1 due to internal logic, when mem - // finishes handle_miss still returns 'blocked' - this->wait_for_storage(this->m_delay + 1, BLOCKED, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - r = c->write_word(MEM, w, 0b0); - CHECK(r == OK); - - actual = this->d->view(0, 1)[0]; - // we do NOT write back now! - REQUIRE(expected == actual); - - expected.at(0) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - CacheFixture, - "store 0th, 1st element in DELAY cycles, with conflict", - "[cache]") -{ - Response r; - signed int w; - int i; - CHECK(expected == actual); - - w = 0x11223344; - // delay + 1 due to internal logic, when mem - // finishes handle_miss still returns 'blocked' - for (i = 0; i < this->m_delay + 1; ++i) { - r = c->write_word(MEM, w, 0b0); - CHECK(r == BLOCKED); - r = c->write_word(FETCH, w, 0b1); - CHECK(r == WAIT); - - // check for early modifications - actual = c->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - - for (i = 0; i < this->c_delay; ++i) { - r = c->write_word(MEM, w, 0b0); - CHECK(r == WAIT); - r = c->write_word(FETCH, w, 0b1); - CHECK(r == WAIT); - - // check for early modifications - actual = c->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - - r = c->write_word(MEM, w, 0b0); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - // we do NOT write back now! - REQUIRE(expected == actual); - - expected.at(0) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); - - // this should have been loaded already! - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(FETCH, w, 0b1); - }); - - r = c->write_word(FETCH, w, 0b1); - CHECK(r == OK); - - expected.at(1) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - CacheFixture, - "store 0th, 1st element different tags, in DELAY cycles, no conflict", - "[cache]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - // delay + 1 due to internal logic, when mem - // finishes handle_miss still returns 'blocked' - this->wait_for_storage(this->m_delay + 1, BLOCKED, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(MEM, w, 0b0); - }); - - r = c->write_word(MEM, w, 0b0); - CHECK(r == OK); - - expected.at(0) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); - - // write back to memory - this->wait_for_storage(this->m_delay + 1, BLOCKED, [this, w]() { - return this->c->write_word(FETCH, w, 0b10000001); - }); - - // fetch new address (don't run the completion cycle yet) - this->wait_for_storage(this->m_delay, BLOCKED, [this, w]() { - return this->c->write_word(FETCH, w, 0b10000001); - }); - - // after the fetch, this cache line should be empty - this->c->write_word(FETCH, w, 0b10000001); - CHECK(r == OK); - - expected.at(0) = 0; - actual = c->view(0, 1)[0]; - CHECK(expected == actual); - - this->wait_for_storage(this->c_delay, WAIT, [this, w]() { - return this->c->write_word(FETCH, w, 0b10000001); - }); - - r = c->write_word(FETCH, w, 0b10000001); - CHECK(r == OK); - - expected.at(0) = 0; - expected.at(1) = w; - actual = c->view(0, 1)[0]; - REQUIRE(expected == actual); -} diff --git a/tests/dram.cc b/tests/dram.cc deleted file mode 100644 index 0e97e81..0000000 --- a/tests/dram.cc +++ /dev/null @@ -1,351 +0,0 @@ -#include "dram.h" -#include <array> -#include <catch2/catch_test_macros.hpp> - -class DramFixture -{ - public: - DramFixture() - { - this->delay = 3; - this->d = new Dram(this->delay); - this->expected = {0, 0, 0, 0}; - this->actual = this->d->view(0, 1)[0]; - } - - ~DramFixture() { delete this->d; } - - /** - * An operation that is done a lot. - */ - void - wait_for_storage(int delay, Response expected, std::function<Response()> f) - { - for (int i = 0; i < delay; ++i) { - Response r = f(); - - // check response - CHECK(r == expected); - // check for early modifications - actual = d->view(0, 1)[0]; - REQUIRE(this->expected == this->actual); - } - } - - int delay; - Dram *d; - std::array<signed int, LINE_SIZE> expected; - std::array<signed int, LINE_SIZE> actual; -}; - -TEST_CASE_METHOD(DramFixture, "store 0th element in DELAY cycles", "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(MEM, w, 0x0); - }); - - r = this->d->write_word(MEM, w, 0x0); - - CHECK(r == OK); - expected.at(0) = w; - actual = this->d->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store 0th, 1st element in DELAY cycles, no conflict", - "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(MEM, w, 0x0); - }); - - r = d->write_word(MEM, w, 0x0); - REQUIRE(r == OK); - - expected.at(0) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(FETCH, w, 0x1); - }); - - r = d->write_word(FETCH, w, 0x1); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected.at(1) = w; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, "store 0th element in DELAY cycles with conflict", "[dram]") -{ - Response r; - signed int w; - int i; - CHECK(expected == actual); - - w = 0x11223344; - for (i = 0; i < this->delay; ++i) { - r = this->d->write_word(MEM, w, 0x0); - CHECK(r == WAIT); - r = this->d->write_word(FETCH, w, 0x1); - CHECK(r == WAIT); - - // check for early modifications - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - } - - r = d->write_word(MEM, w, 0x0); - REQUIRE(r == OK); - - expected.at(0) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - this->wait_for_storage(this->delay, WAIT, [this, w]() { - return this->d->write_word(FETCH, w, 0x1); - }); - - r = d->write_word(FETCH, w, 0x1); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected.at(1) = w; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD(DramFixture, "store line in DELAY cycles", "[dram]") -{ - Response r; - signed int w; - std::array<signed int, LINE_SIZE> buffer; - CHECK(expected == actual); - - w = 0x11223344; - buffer = {w, w + 1, w + 2, w + 3}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(MEM, buffer, 0x0); - }); - - r = d->write_line(MEM, buffer, 0x0); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected = buffer; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, "store line in DELAY cycles no conflict", "[dram]") -{ - Response r; - signed int w; - std::array<signed int, LINE_SIZE> buffer; - CHECK(expected == actual); - - w = 0x11223344; - buffer = {w, w + 1, w + 2, w + 3}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(MEM, buffer, 0x0); - }); - - r = this->d->write_line(MEM, buffer, 0x0); - REQUIRE(r == OK); - - expected = buffer; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - buffer = {w + 4, w + 5, w + 6, w + 7}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(FETCH, buffer, 0x1); - }); - - r = this->d->write_line(FETCH, buffer, 0x1); - CHECK(r == OK); - - expected = buffer; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, "store line in DELAY cycles with conflict", "[dram]") -{ - Response r; - signed int w; - int i; - std::array<signed int, LINE_SIZE> buffer; - CHECK(expected == actual); - - w = 0x11223344; - buffer = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < this->delay; ++i) { - r = this->d->write_line(MEM, buffer, 0x0); - CHECK(r == WAIT); - r = d->write_line(FETCH, buffer, 0x1); - CHECK(r == WAIT); - - // check for early modifications - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - } - - r = d->write_line(MEM, buffer, 0x0); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - expected = buffer; - REQUIRE(expected == actual); - - buffer = {w + 4, w + 5, w + 6, w + 7}; - this->wait_for_storage(this->delay, WAIT, [this, w, buffer]() { - return this->d->write_line(FETCH, buffer, 0x1); - }); - - r = this->d->write_line(FETCH, buffer, 0x1); - CHECK(r == OK); - - expected = buffer; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store line in DELAY cycles, read in DELAY cycles, no conflict", - "[dram]") -{ - Response r; - signed int w; - int i, addr; - CHECK(expected == actual); - - w = 0x11223311; - addr = 0x0; - expected = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < this->delay; ++i) { - r = d->write_line(MEM, expected, addr); - CHECK(r == WAIT); - } - r = d->write_line(MEM, expected, addr); - CHECK(r == OK); - - for (i = 0; i < this->delay; ++i) { - r = d->read_line(MEM, addr, actual); - - CHECK(r == WAIT); - REQUIRE(expected != actual); - } - - r = d->read_line(MEM, addr, actual); - - CHECK(r == OK); - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store line in DELAY cycles, read in DELAY cycles with conflict", - "[dram]") -{ - Response r; - signed int w; - int i, addr; - CHECK(expected == actual); - - w = 0x11223311; - addr = 0x0; - expected = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < delay; ++i) { - r = d->write_line(MEM, expected, addr); - CHECK(r == WAIT); - - r = d->read_line(FETCH, addr, actual); - CHECK(r == WAIT); - } - r = d->write_line(MEM, expected, addr); - CHECK(r == OK); - - for (i = 0; i < this->delay; ++i) { - r = d->read_line(MEM, addr, actual); - - CHECK(r == WAIT); - REQUIRE(expected != actual); - } - - r = d->read_line(MEM, addr, actual); - - CHECK(r == OK); - REQUIRE(expected == actual); -} - -TEST_CASE_METHOD( - DramFixture, - "store line in DELAY cycles, read one element at a time in DELAY cycles " - "with conflict", - "[dram]") -{ - Response r; - signed int w, a; - int i, j, addr; - CHECK(expected == actual); - - w = 0x11223311; - a = 0x0; - addr = 0x0; - expected = {w, w + 1, w + 2, w + 3}; - for (i = 0; i < this->delay; ++i) { - r = d->write_line(MEM, expected, addr); - CHECK(r == WAIT); - } - r = d->write_line(MEM, expected, addr); - CHECK(r == OK); - - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); - - for (i = 0; i < LINE_SIZE; ++i) { - for (j = 0; j < this->delay; ++j) { - r = d->read_word(MEM, addr, a); - - CHECK(r == WAIT); - REQUIRE(0x0 == a); - } - r = d->read_word(MEM, addr++, a); - CHECK(r == OK); - REQUIRE(w++ == a); - - a = 0; - } -} - -TEST_CASE_METHOD(DramFixture, "Sidedoor bypasses delay", "[dram]") -{ - Response r; - signed int w; - CHECK(expected == actual); - - w = 0x11223344; - r = this->d->write_word(SIDE, w, 0x0); - CHECK(r == OK); - - expected.at(0) = w; - actual = d->view(0, 1)[0]; - REQUIRE(expected == actual); -} |