以下内容摘自《步步惊芯——软核处理器内部设计分析》一书
特殊寄存器访问类指令说明
OR1200中特殊寄存器访问类指令只有两条:l.mfspr、l.mtspr。如表5.5所示。
l.mfspr指令
l.mfspr指令与上一章数据处理类指令的最大不同就是l.mfspr的执行阶段需要两个时钟周期,所以会暂停流水线。执行阶段需要两个时钟周期的原因是由于部分特殊寄存器的读取需要时间。比如此处读取RF中的寄存器,在执行阶段的第1个时钟周期为读RF中的寄存器做好了准备,在下一个时钟周期才能读出数据,所以l.mfspr需要两个时钟周期才能完成,流水线就需要暂停以等待l.mfspr执行。为了暂停流水线,OR1200做了以下几项工作:
- 引入id_freeze、ex_freeze,当这两个信号为1时,会保持译码阶段的指令id_insn、执行阶段的指令ex_insn不变
- IF模块会保存取指阶段的指令,这样保证了在流水线暂停期间送入CTRL模块的if_insn保持不变
- GENPC模块会重复取if_insn下一条指令,这样一旦流水线继续,就可以取得下一条指令进入流水线 <