4.8 SEQ各阶段分析

取指阶段

取指阶段从 PC 指向的内存地址读取指令编码,生成以下信号:

  • icode:ifun:2 字节,指令码和功能码
  • rA:rB:1 字节,两个寄存器操作数编号(可能等于 0xF 表示无)
  • valC:常量数据(irmovq、rmmovq、mrmovq 中的立即数,或跳转/调用地址)
  • valP:下一条指令的地址 = PC + 当前指令的字节长度

其中 need_valCneed_regids 等控制信号由 icode 决定,通过 HCL 逻辑生成。

译码/写回阶段

译码和写回共享寄存器文件的读写端口:

  • 读端口:生成 valA 和 valB
    • valA 可能来自 rA 或 %rsp(call/push/pop/ret)
    • valB 可能来自 rB 或 %rsp
  • 写端口:dstE 和 dstM 分别指定两个写目标
    • dstE:ALU 结果的目标寄存器
    • dstM:内存读取值的目标寄存器
  • 写回只在时钟周期末尾的上升沿发生

执行阶段

执行阶段的核心是 ALU,它根据 icode:ifun 执行不同操作:

  • 算术运算:valE = valA OP valB(addq/subq/andq/xorq)
  • 地址计算:valE = valB + valC(rmmovq/mrmovq 的内存地址)
  • 常数传送:valE = valC(irmovq)
  • 入栈/出栈:valE = valB ± 8(pushq/popq 调整 %rsp)

条件码(ZF、SF、OF)只在算术指令时才更新。

访存阶段

数据内存的访问,地址总是 valE(rmmovq/mrmovq/pushq)或 valA(call/ret):

  • 写内存:rmmovq、pushq、call
  • 读内存:mrmovq、popq、ret
  • 读出的值送入 valM

更新PC

新 PC 的选择取决于指令类型:

  • call/jmp:valC(跳转目标)
  • 条件跳转(已选择):valC
  • 条件跳转(未选择):valP
  • ret:valM(从内存读出的返回地址)
  • 其他指令:valP(顺序执行下一指令)

相关笔记

链接到