架构

说下 RISCV 指令怎么运行的?

  • 取指 IF
  • 解码 ID
  • 执行 EX
  • 访存 MEM
  • 写回 WB

CPU内部结构

  • ALU
  • Control Unit
  • Reg
  • Cache
  • 总线接口单元

一个 rv 的 add 在 EX 阶段是怎样的?

Draft

  • 获取操作数
  • ALU 执行加法运算
  • 更新状态

流水线怎么处理前后相关性指令?

流水线冒险是什么?

流水线

经典流水线的弊端是由于流水线是静态调度且不能投机(Speculative),指令执行非独立。当遇到某种情况需要停机(Stall)时被称为流水线冒险(Pipelining Hazards)

  • 数据冒险 / Data Hazard
  • 控制冒险 / Control Hazard
  • 结构冒险 / Structure Hazard
  • 内存访问延迟

CPU 如何计算 IEEE 754 加法

IEEE754 浮点数

Cache

结构

  • Cache 结构:
  • Cache 内部:Cache Line 结构:

访问

Cache 如何判断是否命中?

  • 地址分解:标签(Tag),索引(Index),偏移(Offset)
  • 查找缓存:
    • 根据索引部分找到对应的缓存行,然后检查该行的标签是否与内存地址中的标签匹配。
    • 如果标签匹配,则称为“命中”(Hit);如果不匹配,则称为“未命中”(Miss)

缓存一致性问题

缓存一致性 一致性

Write Through 和 Write Back 以及广播机制

  • Write Through / 写直达把数据同时写入内存和 Cache 中
    • 检查若在 CPU Cache 则同时写入
    • 每次都写到内存
  • Write Back / 写回 :减少数据写回内存的频率,只有当修改过的 Cache Block「被替换」时才写到内存中
    • 若对应存在于 CPU Cache 则写到 Cache,并标记为 Dirty,即缓存与内存不一致
    • 若对应的 Cache Block 里存放的是「别的内存地址的数据」,则需要替换

对于不同核心等之间保证同步,需要 广播

总线嗅探与 MESI

  • Bus Snooping / 总线嗅探 :通过总线把这个事件广播通知给其他所有的核心
  • MESI
    • 标记 Cache Line 状态,先询问+修改标记再更新数据
    • 状态
      • Modified:等价于 Dirty,更新但未写入内存;更新于广播修改之后,实际修改时
      • Exclusive:干净,只存储在一个 CPU 核心的 Cache 里,自由写入;更新于读取到内存中不存在的新数据时
      • Shared:干净,多个 CPU 核心的 Cache 里都有,更新需要广播;更新于读取到别人独占的数据时
      • Invalidated:失效,不可读取;更新于收到别人更新的广播时
    • 状态图

Misc

嵌入式

波特率是什么,为什么双方波特率要相同,高低波特率有什么区别

波特率每秒钟信号变化的次数,用于描述 串行通信 中传输速度的一个单位。

如果两者的波特率不同,接收方会错误地解释信号,导致数据丢失、数据错误或者完全无法接收数据。