Поскольку код принимает номера регистров как std::bitset<5>
объекты, а не целочисленный тип, такой как uint32_t
из <stdint.h>
.
Класс std::bitset<>
не имеет неявного преобразования в unsigned long
, поэтомуВы должны использовать функцию-член, чтобы получить unsigned long
с битами набора битов в качестве значения.https://en.cppreference.com/w/cpp/utility/bitset
Класс не работает прозрачно как n-битное целое число.Если вы хотите этого, теоретически вы можете использовать битовое поле без знака в структуре.
Я думаю, что функция делает это по педагогическим причинам, чтобы напомнить вам, что номер регистра происходит из 5-битногополе в командном слове.Или как способ гарантировать, что значения вне диапазона невозможны.(т. е. в 5-битном битовом наборе возможны только значения от 0.31.)
API, реализованный в этом коде, беспорядок!«Возвращаемые значения» возвращаются путем назначения 2 открытых членов класса , отдельно от самого массива регистровых файлов **.Ошибка на самом деле vector<bitset<32> > Registers
, поэтому файл реестра является динамически размещаемым и расширяемым / сжимаемым контейнером без видимой причины или выгоды по сравнению с std::array<bitset<32>, 32>
.
Интересно, пытается ли структура кода не только симулироватьMIPS конвейер, но внутренне работает так, как спроектировано аппаратное обеспечение.т. е. наличие одного вызова функции реализует операцию файла регистра в одном цикле: чтение 2 значений для этапа ID и запись 0 или 1 значения из этапа WB.И поместить 2 значения чтения в буферы, которые являются частью файла реестра?Кажется безумием против возвращения std::pair<uint32_t>
.
Я полагаю, что сочетание чтения + записи облегчает моделирование того факта, что чтение + запись одного и того же регистра читает старое значение, как обмен.Некоторая другая логика должна обрабатывать обход обхода.