在单周期数据路径中加载半字和加载字节

2024-04-06

有人询问如何在单周期数据路径中实现加载字节而无需更改数据存储器,解决方案如下。

替代文本 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(使用前将#替换为@)

在单周期数据路径中加载半字和加载字节 的相关文章

  • CPU 和数据对齐

    如果您觉得这个问题已经被回答了很多次 请原谅我 但我需要以下问题的答案 为什么数据必须对齐 在 2 字节 4 字节 8 字节边界上 这里我的疑问是 当CPU有地址线Ax Ax 1 Ax 2 A2 A1 A0时 很有可能按顺序寻址内存位置 那
  • 简单 mips 中的无限循环

    我正在尝试了解 ra 所以我想要的输出是 mainfunction1main 通过 main 调用 function1 function1 返回到 main 然后 main 完成 但由于某种原因 我得到一个无限循环 打印 mainfunct
  • 提示用户输入汇编 ci20 seg 错误

    我目前正在 ci20 机器上开发一个小程序 提示用户输入整数值 然后将该值打印到屏幕上 我当前的代码 data prompt asciiz Please enter an integer message asciiz nValue ente
  • 计算三级缓存的实际/有效CPI

    a 给定一个具有两级高速缓存 L1 和 L2 的内存系统 以下是规格 L1缓存命中时间 2个时钟周期 一级缓存命中率 92 L2 缓存的未命中惩罚 L2 的命中时间 8 个时钟周期 二级缓存命中率 86 主存丢失惩罚 37 个时钟周期 暂时
  • VHDL - FSM 未启动(仅在时序仿真中)

    我正在写我的硕士论文 而且我对 VHDL 还很陌生 但我仍然必须实现一些复杂的东西 这是我必须编写的最简单的结构之一 但我仍然遇到了一些问题 它是一个 FSM 采用低电平有效同步信号 用于对 DAC 进行编程 实现 24 位移位寄存器 这只
  • 现代 x86 CPU 使用什么缓存一致性解决方案?

    我对缓存一致性系统在现代多核 CPU 中的功能有些困惑 我已经看到基于侦听的协议 例如基于 MESIF MOESI 侦听的协议 已在 Intel 和 AMD 处理器中使用 另一方面 基于目录的协议对于多核来说似乎更加高效 因为它们不广播而是
  • 为什么较长的管道会导致单个延迟槽不够用?

    我在 Patterson Hennessy 的文章中读到了以下声明计算机组织与设计教科书 随着处理器使用更长的管道并在每个时钟周期发出多个指令 分支延迟变得更长 并且单个延迟槽是不够的 我可以理解为什么 每个时钟周期发出多个指令 会使单个延
  • 学习 VHDL 的最佳方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么64位cpu不存在高端内存?

    当我试图了解 32 位 cpu 和 Linux 的高内存问题时 为什么没有高内存问题 https en wikipedia org wiki High memory对于64位CPU 特别是 虚拟内存分为内核空间和用户空间的划分是如何改变的
  • 在单周期数据路径中加载半字和加载字节

    有人询问如何在单周期数据路径中实现加载字节而无需更改数据存储器 解决方案如下 替代文本 http img214 imageshack us img214 7107 99897101 jpg http img214 imageshack us
  • Aarch64 什么是延迟转发?

    中提到了 延迟转发 Arm Neoverse E1核心软件优化指南 https developer arm com documentation swog466751 a 以及其他一些 CPU 型号的优化指南 Instruction Grou
  • 查看x86架构中的cpu缓存内容

    如何查看或转储基于 x86 的架构的 cpu 缓存内容 每次进行缓存刷新时 我如何才能看到刷新了什么 在哪里 你不能 真的 CPU 缓存被设计为对于 CPU 上运行的代码是透明的 它具有加快代码执行速度的效果 但 CPU 管理有关缓存的所有
  • 如何将三地址代码转换为MIPS汇编语言?

    我正在做一个项目 其中我必须创建一个翻译器来为 C 代码生成 MIPS 汇编代码 正在使用的编程语言是 C 我已经完成了三个地址代码的生成 但我对如何进一步进行感到非常困惑 如前所述 这是直接翻译 确实没有什么需要澄清的 以下面的三地址代码
  • 在MIPS中,有符号加法、无符号加法、有符号减法和无符号减法之间有什么区别?

    add rd rs rt addu rd rs rt sub rd rs rt subu rd rs rt 在MIPS中 有符号加法 无符号加法 有符号减法和无符号减法之间有什么区别 如果它们的结果相同 那么分类为使用有符号和无符号方法有什
  • 字大小及其指示

    请参阅下面关于各种指令集架构中的字长以及它与汇编语言的关系的问题 感谢您提供的所有帮助 先说几个事实 如有错误 请指正 处理器架构的字长表示 编辑 其中一些是错误的 请参阅下面 Seva 的帖子 每个寄存器的最大尺寸 每个内存地址的最大尺寸
  • 设计用于初始化的VHDL状态机

    如何最明智地设计用于初始化芯片的 VHDL 状态机 我当前的设计是 伪代码 案例状态 当 s0 gt VHDL CODE FOR WRITING VALUE TO REGISTER状态 s1 当 s1 gt VHDL CODE FOR WR
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 为什么我的空循环在 Intel Skylake CPU 上作为函数调用时运行速度是原来的两倍?

    我正在运行一些测试来比较 C 和 Java 并遇到了一些有趣的事情 在 main 调用的函数中 而不是在 main 本身中 运行具有优化级别 1 O1 的完全相同的基准代码 导致性能大约翻倍 我正在打印 test t 的大小 以毫无疑问地验
  • VHDL:如何声明可变宽度通用[重复]

    这个问题在这里已经有答案了 我想创建一个 VHDL 实体 其中一个泛型可以更改另一个泛型的宽度 entity lfsr n is generic WIDTH integer 32 counter width POLYNOMIAL std l

随机推荐