在开源玄铁C910中,fence指令通过ct_idu_id_decd_special模块进行译码,分为三类。
1、 Fence.i Instruction
同步指令
Sync:保证前序指令早退休,后续指令晚退休
sync.s:前早后晚,将该请求广播给其他核
sync.i:前早后晚 且该指令退休时清空流水线
sync.is:前早后晚 且该指令退休时清空流水线并广播给其他核
dcache操作指令
dcache.call:clear 所有L1 dcache 表项,将所有dirty 表项写回到下一级存储,仅操作当前核。
dcache.iall: 无效所有L1 dcache 表项,仅操作当前核。
dcache.ciall: 将所有L1 dcache dirty 表项写回到下一级存储后,无效所有表项。
2、 Cp0 Instruction
Sret:超级用户模式异常返回指令,
next pc← sepc
sstatus.sie ←sstatus.spie
sstatus.spie ←1
Mret:机器模式异常返回指令,
next pc← mepc
mstatus.mie ←mstatus.mpie
mstatus.mpie ←1
Wfi:进入低功耗模式指令
处理器进入低功耗模式,此时CPU 时钟关闭,大部分外设时钟也关闭
控制寄存器操作指令:
Csrrw:控制寄存器立即数读写传送指令
Csrrs:控制寄存器立即数置位传送指令
Csrrc:控制寄存器清零传送指令
Csrrwi:控制寄存器立即数读写传送指令
Csrrci:控制寄存器立即数清零传送指令
Csrrsi:控制寄存器立即数置位传送指令
3、 Sfence Instruction
fence.i:清空icache, 保证该指令前序所有数据访存结果能够被指令后的取指操作访问到。
sfence.vma:用于虚拟内存的无效和同步操作
1、id级inst0是fence类型指令后进入fence状态机,fence类型指令要等待后序流水线清空,
assign fence_pipeline_empty = ctrl_fence_ir_pipe_empty
&& ctrl_fence_is_pipe_empty
&& rtu_idu_rob_empty
&& !iu_idu_div_busy
&& rtu_idu_pst_empty;
2、fence状态机较为简单,
(1) 初始为IDLE状态,inst0为fence时进入WAIT_ISSUE
(2) 后序流水线清空后进入ISSUE状态,ISSUE状态下fence指令进行译码,然后进入WAIT_CMPLT状态等待fence指令退休。
(3) Fence指令退休后,进入POP_INST状态,不再阻塞流水线,下一周期进入IDLE。
1、fence指令类型为Sfence类型时,会产生三个vld信号
fence_ctrl_inst0_vld、fence_ctrl_inst1vld、fence_ctrl_inst2_vld,当fence指令进入ISSUE状态时,inst0,1,2都会VLD。(inst3不会vld)
2、fence指令的译码通路也是并行+选择器的结构,通过mux选择对应的data
在id_dp中,inst0如果为fence指令可以生成三条uop,
fence_inst0_data根据fence type选择
case(dp_fence_id_fence_type[2:0])
3'b001 : fence_inst0_data[IR_WIDTH-1:0] = fence_inst0_sync_data[IR_WIDTH-1:0];
3'b010 : fence_inst0_data[IR_WIDTH-1:0] = fence_inst0_cp0_data[IR_WIDTH-1:0];
3'b100 : fence_inst0_data[IR_WIDTH-1:0] = fence_inst0_fence_data[IR_WIDTH-1:0];
fence_inst0_data
3、对于sync类型的指令,fence_inst0和fence_inst2为LSU类型,Inst2是sync.is指令
对于cp0类型指令,inst0为special类型
对于fence类型指令,inst0为LSU类型,inst1为LSU/LSUP5类型。
也就是说,对于sfence类型的指令,会生成三条uop,uop0为LSU类型,instl1为LSU/LSUP5类型,uop3为LSU类型(相当于sync.is)
本文章仅供学习交流使用,如有引用请注明出处。