4.8 SEQ各阶段分析
取指阶段
取指阶段从 PC 指向的内存地址读取指令编码,生成以下信号:
- icode:ifun:2 字节,指令码和功能码
- rA:rB:1 字节,两个寄存器操作数编号(可能等于 0xF 表示无)
- valC:常量数据(irmovq、rmmovq、mrmovq 中的立即数,或跳转/调用地址)
- valP:下一条指令的地址 = PC + 当前指令的字节长度
其中 need_valC、need_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(顺序执行下一指令)
相关笔记
链接到
- 上一个知识点:4.7 SEQ处理器
- 下一个知识点:4.9 流水线概念与原理
- 相关知识点:3.9 跳转指令、3.10 条件分支