为什么我必须转换为 ulong 才能从寄存器读取数据?

Why do I have to convert to ulong inorder to read data from registers?

这是来自 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;

};

因为代码将寄存器编号作为 std::bitset<5> 对象,而不是像 <stdint.h> 中的 uint32_t 这样的整数类型。

std::bitset<> class 没有到 unsigned long 的隐式转换,因此您必须使用成员函数来获取 unsigned long 与位集的位作为它的价值。 https://en.cppreference.com/w/cpp/utility/bitset

class 不能透明地用作 n 位整数。如果需要,理论上可以在结构中使用无符号位域。


我认为该函数这样做是出于教学原因,以提醒您寄存器编号来自指令字中的 5 位字段。或者作为一种保证超出范围的值是不可能的方法。 (即在 5 位位集中只有 0..31 的值是可能的。)

这段代码实现的API一塌糊涂! "return values" 通过分配给 class 的 2 个 public 成员返回,与寄存器文件数组本身分开**。实际上是错误的 vector<bitset<32> > Registers,因此寄存器文件是一个动态分配的 growable/shrinkable 容器,与 std::array<bitset<32>, 32>.

相比没有明显的原因或好处

我想知道代码结构是否试图不仅模拟 MIPS 流水线而且在内部像硬件的设计方式一样工作。即让一个函数调用在单个周期内实现寄存器文件的操作:为 ID 阶段读取 2 个值,并从 WB 阶段写入 0 或 1 个值。并将 2 个读取值放在作为寄存器文件一部分的缓冲区中?与返回 std::pair<uint32_t>.

相比似乎很疯狂

我想结合读+写可以更容易地模拟同一寄存器的读+写读取旧值的事实,就像交换一样。其他一些逻辑必须处理旁路转发。