diff options
author | bd <bdunahu@operationnull.com> | 2025-03-28 19:55:48 -0400 |
---|---|---|
committer | bd <bdunahu@operationnull.com> | 2025-03-28 19:55:48 -0400 |
commit | b06f7b0546d679958153263e15ea857659819499 (patch) | |
tree | 44ce58c9ea15b561e41d3c62a239cdf2c54ef841 /tests | |
parent | 7b3abbd51c91b51725a12d17fad6ecbfcdb19975 (diff) |
Add id tests file
Diffstat (limited to 'tests')
-rw-r--r-- | tests/id.cc | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/tests/id.cc b/tests/id.cc new file mode 100644 index 0000000..e09276f --- /dev/null +++ b/tests/id.cc @@ -0,0 +1,158 @@ +#include "id.h" +#include "cache.h" +#include "controller.h" +#include "dram.h" +#include "if.h" +#include "instrDTO.h" +#include <catch2/catch_test_macros.hpp> + +class IDPipeFixture +{ + public: + IDPipeFixture() + { + Dram *dr; + + dr = new Dram(this->m_delay); + // 0xC00 is a nop + p = {0xC000, 0xC001, 0xC002, 0xC003}; + dr->load(p); + + this->c = new Cache(dr, this->c_delay); + IF *f = new IF(nullptr); + this->d = new ID(f); + this->ct = new Controller(this->d, this->c, true); + }; + ~IDPipeFixture() + { + delete this->ct; + delete this->c; + }; + + // /** + // * Requests something to do until it is received. + // */ + // void fetch(InstrDTO &instr) + // { + // Response r = WAIT; + + // while (r != OK) { + // r = this->ct->advance(instr); + // } + // } + + int m_delay = 3; + int c_delay = 1; + std::vector<signed int> p; + Cache *c; + ID *d; + Controller *ct; +}; + +TEST_CASE_METHOD(IDPipeFixture, "Parse invalid type", "[utils]") +{ + signed int s1 = 0, s2 = 0, s3 = 0; + unsigned int type = 0, opcode = 0; + + s1 = 0x00FF00FF; + this->d->get_instr_fields(s1, s2, s3, type, opcode); + + REQUIRE(type == 0b11); + // behavior does nothing + CHECK(s1 == 0x00FF00FF); + CHECK(s2 == 0b0); + CHECK(s3 == 0b0); + CHECK(opcode == 0b0); +} + +TEST_CASE_METHOD(IDPipeFixture, "Parse arbitrary r-type # one", "[utils]") +{ + signed int s1 = 0, s2 = 0, s3 = 0; + unsigned int type = 0, opcode = 0; + + s1 = 0xCCCCCCCC; + this->d->get_instr_fields(s1, s2, s3, type, opcode); + + REQUIRE(type == 0b00); + CHECK(s1 == 0b11001); + CHECK(s2 == 0b01100); + CHECK(s3 == 0b00110); + CHECK(opcode == 0b10011); +} + +TEST_CASE_METHOD(IDPipeFixture, "Parse arbitrary r-type # two", "[utils]") +{ + signed int s1 = 0, s2 = 0, s3 = 0; + unsigned int type = 0, opcode = 0; + + s1 = 0x99AABBCC; + this->d->get_instr_fields(s1, s2, s3, type, opcode); + + REQUIRE(type == 0b00); + CHECK(s1 == 0b10111); + CHECK(s2 == 0b01011); + CHECK(s3 == 0b10101); + CHECK(opcode == 0b10011); +} + +TEST_CASE_METHOD(IDPipeFixture, "Parse arbitrary i-type # one", "[utils]") +{ + signed int s1 = 0, s2 = 0, s3 = 0; + unsigned int type = 0, opcode = 0; + + s1 = 0xDDDDDDDD; + this->d->get_instr_fields(s1, s2, s3, type, opcode); + + REQUIRE(type == 0b01); + CHECK(s1 == 0b10111); + CHECK(s2 == 0b11011); + CHECK(s3 == 0xDDDD); + CHECK(opcode == 0b0111); +} + +TEST_CASE_METHOD(IDPipeFixture, "Parse arbitrary i-type # two", "[utils]") +{ + signed int s1 = 0, s2 = 0, s3 = 0; + unsigned int type = 0, opcode = 0; + + s1 = 0xAABBCCDD; + this->d->get_instr_fields(s1, s2, s3, type, opcode); + + REQUIRE(type == 0b01); + CHECK(s1 == 0b10011); + CHECK(s2 == 0b11001); + CHECK(s3 == 0xAABB); + CHECK(opcode == 0b0111); +} + +TEST_CASE_METHOD(IDPipeFixture, "Parse arbitrary j-type # one", "[utils]") +{ + signed int s1 = 0, s2 = 0, s3 = 0; + unsigned int type = 0, opcode = 0; + + s1 = 0xEEEEEEEE; + this->d->get_instr_fields(s1, s2, s3, type, opcode); + + REQUIRE(type == 0b10); + CHECK(s1 == 0b11011); + CHECK(s2 == 0b111011101110111011101); + CHECK(opcode == 0b1011); + // behavior does nothing + CHECK(s3 == 0b0); +} + +TEST_CASE_METHOD(IDPipeFixture, "Parse arbitrary j-type # two", "[utils]") +{ + signed int s1 = 0, s2 = 0, s3 = 0; + unsigned int type = 0, opcode = 0; + + s1 = 0xBBCCDDEE; + this->d->get_instr_fields(s1, s2, s3, type, opcode); + + REQUIRE(type == 0b10); + CHECK(s1 == 0b10111); + CHECK(s2 == 0b101110111100110011011); + CHECK(opcode == 0b1011); + // behavior does nothing + CHECK(s3 == 0b0); +} |