为什么我必须转换为 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>
.
相比似乎很疯狂
我想结合读+写可以更容易地模拟同一寄存器的读+写读取旧值的事实,就像交换一样。其他一些逻辑必须处理旁路转发。
这是来自 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>
.
我想结合读+写可以更容易地模拟同一寄存器的读+写读取旧值的事实,就像交换一样。其他一些逻辑必须处理旁路转发。