FENCE指令分析

一、 玄铁C910中fence类型指令

在开源玄铁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:用于虚拟内存的无效和同步操作

二、 fence状态机控制

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。

三、 Fence指令译码

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)


本文章仅供学习交流使用,如有引用请注明出处。

你可能感兴趣的:(risc-v)