单周期处理器

核心子集

  • 存储器访问指令:ldsd
  • 算术逻辑指令:add / sub / and / or
  • 条件分支指令:beq

指令执行核心逻辑

  • 程序计数器(PC)发送到指令所在的存储单元,并从中取出指令
  • 根据指令的某些字段选择要读取的一个或两个寄存器
    • 对于 ld 指令,只需要读取一个寄存器,但大多数其他指令需要读取两个寄存器
  • 所有类型的指令在读取寄存器后都使用算术逻辑单元(ALU)进行运算
  • 经过 ALU 后完成各类指令的所需操作都不同

基础的抽象电路图

![[images/Pasted image 20260113211749.png]]

  • PC 的数据来自两个加法器中的一个,需要根据一个数据选择器(multiplexor)进行选择
  • ALU 的第二个输入来自寄存器或者立即数,也需要一个数据选择器进行选择
  • ALU 的控制线会根据指令的字段来设置,从而控制 ALU 的运算类型

加入选择器的电路图

![[images/Pasted image 20260113212133.png]]

  • 上面的 Mux 控制 PC,当 ALU 输出为 0 且指令为 beq 时选择分支目标地址,否则为 PC + 4
  • 中间的 Mux 控制是将 ALU 的输出还是数据存储器的输出存入寄存器堆
  • 下面的 Mux 控制 ALU 第二个输入来自寄存器,还是立即数
  • 控制单元 Control:根据指令确定 ALU 的运算类型、数据存储器的读写、寄存器堆的写入

逻辑设计的一般方法

RISC-V 实现的数据通路包含两种逻辑单元:

  • 处理数据的单元:组合逻辑
    • 无内部存储功能
    • 输出仅依赖于当前输入
    • 给定相同输入,总是产生相同输出
  • 存储状态的单元:状态逻辑
    • 有内部存储功能
    • 至少有两个输入和一个输出
      • 写入状态单元的数据值
      • 决定写入时间的时钟信号
    • 包含触发器、存储器、寄存器
    • 写入时间由时钟确定,但可以随时被读

时钟同步方法

时钟同步方法(Clocking Methodology)规定了信号可以读出和写入的时间,避免新值和旧值的冲突

边沿触发时钟

  • 存储在时序逻辑单元中的所有值仅在时钟边沿更新
  • 如果状态单元在每个有效始终边沿都进行写入,则可忽略写控制信号

![[images/Pasted image 20260114102718.png]]

在边沿触发的时钟同步方法中,需在一个时钟周期内读出寄存器的值,并使之经过组合逻辑单元,将新值写入该寄存器

![[images/Pasted image 20260114103754.png]]

  • 可以在同一个时间周期内进行读和写,不会因为竞争出现中间数据
  • 但是时钟周期必须足够长,且没有反馈

所以不需要为状态单元准备备份

建立数据通路

数据通路单元(datapath element)

  • 用来操作或保存处理器中数据的单元
  • 包括指令存储器、数据存储器、寄存器堆、ALU、加法器

![[images/Pasted image 20260114104309.png]]

  • 指令存储器只提供读
  • 程序计数器是 64 位寄存器,在每个时钟周期结束时都会被写入,不需要写控制信号
  • 加法器是固定控制信号为 Add 的 ALU