我目前正在实现一个单周期 MIPS 处理器,并且正在实现 SB 和 SH 指令。我已经使用这个线程的想法成功地实现了 LB/LBU 和 LH/LHU 指令:Load half word and load byte in a single cycle datapath
我在概念化如何实施 SB/SH 指令时遇到了麻烦。我目前的想法是有一个 4:1 MUX,其中每个输入都是当前字的掩码,其字节将被写入。例如,假设我要将字节 0x2E 写入地址 0x10010002,例如当前包含值:[0x10010000] 0xABCD1234。所以写入内存后会是:[0x10010000] 0xAB2E1234。(字节对齐寻址)
所以我要做的是使用 4 个与以下值 0xFFFFFF00、0xFFFF00FF、0xFF00FFFF、0x00FFFFFF 来屏蔽地址 0x10010000 处的单词。MUX 的选择位将来自地址的低两位。
与此同时,我们获取字节,对其进行零扩展,然后对其执行一些不同的移位以将其放置在掩码的正确位置。这些不同的移位值将再次进入具有相同相应选择位的 MUX。例如,如果地址的低两位为 0,则无需移位,如果为 01,则左移一个字节。如果是 10,我们左移 2 个字节。如果为 11,则左移 3 个字节(或循环右移 1 个字节)
然后,我们将 MUX 和 OR 中的值放在一起以获得要存储的最终值。所以对于上面的例子:
低两位是 10,所以 MUX 选择 0xFF00FFFF 与 0xABCD1234 相乘,得到 0xAB001234 的输出值。字节左移 4 变为 0x002E0000,然后与 0xAB001234 进行 OR 运算以变为 0xAB2E1234,然后被存储。
当然,这扩展到具有相同想法的 SH 指令。我希望我的例子有意义。我可能会以这种方式实现它,除非有一种我没有看到的更简单的方法来做到这一点。我一直在盯着硬件设计这么久,我可能会错过一些更简单的实现。
谢谢。