有人询问如何在单周期数据路径中实现加载字节而无需更改数据存储器,解决方案如下。
替代文本 http://img214.imageshack.us/img214/7107/99897101.jpg http://img214.imageshack.us/img214/7107/99897101.jpg
这其实是很现实的
问题;大多数记忆系统是
完全基于单词和个人
字节通常只被处理
处理器内部。当你看到一个
许多计算机上出现“总线错误”,这
通常意味着处理器尝试过
访问一个内存地址
字对齐不正确,并且
内存系统引发异常。
无论如何,因为字节地址可能
不是 4 的倍数,我们不能通过
直接将它们存储到内存中。然而,我们
仍然可以获得任何字节,因为
每个字节都可以在某些内找到
字,所有字地址都是
4的倍数。所以我们首先要做的就是
要做的就是确保我们得到正确的
单词。如果我们取高 30 位
地址(即 ALUresult[31-2])
并将它们与两个 0 位组合在一起
低端(这就是“左
shift 2”单位确实在做),我们
具有该字的字节地址
包含所需的字节。这是
只是字节自己的地址,四舍五入
减少到 4 的倍数。这个变化
意味着 lw 现在也将舍入
地址低至 4 的倍数,但是
没关系,因为地址不对齐
无论如何,这对 lw 不起作用
记忆单元。好的,现在我们得到数据了
从记忆中回想起这个词。我们如何得到
我们想要从中得到什么字节?出色地,
请注意该字节的字节偏移量
在这个词中只是给出了
字节的低 2 位
地址。所以,我们只需使用这 2 个
位来选择适当的字节
使用多路复用器无法言表。请注意
使用大端字节编号,如
适用于 MIPS。接下来,我们
必须将字节零扩展为 32
位(即,只需将其与 24
零在其高端),因为
问题指定这样做。实际上,
这是一个小错误
问题:实际上,lbu
指令对字节进行零扩展,但是
lb 符号扩展它。那好吧。
最后,我们必须延长
MemtoReg 控制的多路复用器接受一个
新输入:零扩展字节
磅案。 MemtoReg 控件
信号必须加宽至 2 位。这
原来的0和1情况改为00
和 01,我们添加一个新的
case 10 只在case中使用
磅。
即使在阅读了解释之后,我实际上不太明白这是如何工作的,尤其是关于将 ALU 结果左移 2 将给出字节地址......这怎么可能?所以如果我想加载一个半字,那么我会做一次左移,然后我会得到半字的地址?通过修改数据存储器来加载字节、加载半字的更好方法是什么? (上面的问题限制了我们不能修改数据内存)
原作者似乎只是在从内存读取的 32 位数据中添加了一个字节多路复用器。该存储器允许完整的 32 位自然对齐加载(lw 指令),并且附加字节多路复用器和零扩展也允许加载字节指令(lbu 指令)。
ALU 结果左移产生字地址,NOT一个字节地址,并考虑到信号路由中隐式右移两位。最终结果只是 ALU 结果的低两位在发送到内存之前被屏蔽(清零)。 ALU 值的两个 LSB 被馈送到存储器下游的字节多路复用器,允许字存储器读取任意字节。
所示逻辑中没有直接支持加载半字(16 位),仅支持字节和完整 32 位字。但是,您可以使用类似的方法轻松修改字节寻址逻辑以支持字而不是字节(甚至两者)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)