Почему для чтения данных из регистров мне нужно преобразовать в ulong inorder? - PullRequest
0 голосов
/ 24 сентября 2019

Это из программы, имитирующей инструкцию для процессора MIPS.

В функции readWrite, почему мне нужно преобразовать в u_long, чтобы прочитать данные из RdReg1?

class RF
{
    public:
        bitset<32> ReadData1, ReadData2;
        RF()
        {
          Registers.resize(32);
          Registers[0] = bitset<32> (0);
        }

        void ReadWrite(bitset<5> RdReg1, bitset<5> RdReg2, bitset<5> WrtReg, bitset<32> WrtData, bitset<1> WrtEnable)
        {
            // implement the funciton by you.
            ReadData1 = Registers[RdReg1.to_ulong()];//reading data from registers
            ReadData2 = Registers[RdReg2.to_ulong()];
            if(WrtEnable.to_ulong() == 1)//if writeEnable=1 then write data into register
            {
                Registers[WrtReg.to_ulong()] = WrtData;
            }
         }

    void OutputRF()
             {
               ofstream rfout;
                  rfout.open("RFresult.txt",std::ios_base::app);
                  if (rfout.is_open())
                  {
                    rfout<<"A state of RF:"<<endl;
                  for (int j = 0; j<32; j++)
                      {
                        rfout << Registers[j]<<endl;
                      }

                  }
                  else cout<<"Unable to open file";
                  rfout.close();

               }
    private:
            vector<bitset<32> >Registers;

};

1 Ответ

0 голосов
/ 24 сентября 2019

Поскольку код принимает номера регистров как 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>.

Я полагаю, что сочетание чтения + записи облегчает моделирование того факта, что чтение + запись одного и того же регистра читает старое значение, как обмен.Некоторая другая логика должна обрабатывать обход обхода.

...