条件写类指令处理方法
采用谨慎转发策略,防止在写和不写之间选择的指令产生错误转发
assign D_MFRD1Sel =
(E_A != 5'b0 && D_rs_ad == E_A && E_Tnew == 0) ? `E_TO_D :
(M_A != 5'b0 && D_rs_ad == M_A && M_Tnew == 0) ? `M_TO_D :
`NoForward;
assign D_MFRD2Sel =
(E_A != 5'b0 && D_rt_ad == E_A && E_Tnew == 0) ? `E_TO_D :
(M_A != 5'b0 && D_rt_ad == M_A && M_Tnew == 0) ? `M_TO_D :
`NoForward;
assign E_MFRD1Sel =
(M_A != 5'b0 && E_rs_ad == M_A && M_Tnew == 0) ? `M_TO_E :
(W_A != 5'b0 && E_rs_ad == W_A) ? `W_TO_E :
`NoForward;
assign E_MFRD2Sel =
(M_A != 5'b0 && E_rt_ad == M_A && M_Tnew == 0) ? `M_TO_E :
(W_A != 5'b0 && E_rt_ad == W_A) ? `W_TO_E :
`NoForward;
条件在D级生成
例如条件跳转写入 blztal 所有正确信息均在E级齐全,只需将条件流水并传入各级CU计算出正确的写入地址。阻塞逻辑和转发逻辑不变。
若写入值在D级也齐全,则
D_Tuse_rt = 0; D_Tuse_rs = 0;
E_Tnew = 0; M_Tnew = 0;
若写入值不确定,则具体问题具体分析,分析出E_Tnew以及M_Tnew
阻塞逻辑
X = E/M
assign X_stall_new_rs = (X_new) && (D_Tuse_rs < X_Tnew) && (X_A != 0) && (D_rs_ad == X_A) //其实与正常情况相同,无需特殊处理
条件在E级生成
例如条件计算写入,写入条件(目的地)在E级生成,在M级之后可以得到正确的地址信息。
D_Tuse_rt = 1; D_Tuse_rs = 1;//视具体情况可能有所不同
E_Tnew = 1; M_Tnew = 0;//E_Tnew至少为1,视写入值产生的时间而不同
阻塞逻辑
assign E_stall_new_rs = (E_new) && (D_Tuse_rs < E_Tnew) && (D_rs_ad == AllPossibel(E_A));//为了防止缺漏,故去掉了E_A != 0 的条件,不抢这一拍了
assign E_stall_new_rt = (E_new) && (D_Tuse_rt < E_Tnew) && (D_rt_ad == AllPossibel(E_A));
assign E_stall_rs = (!E_new) && (D_Tuse_rs < E_Tnew ) && (E_A != 5'b0 && D_rs_ad == E_A);//或许需要将正常情况和新指令分离
assign E_stall_new = E_stall_new_rs | E_stall_new_rt;
assign stall = E_stall | M_stall | E_stall_new | md_stall;
//M级的阻塞逻辑与正常情况相同,因为已经得到正确的地址,只需将条件信号传入CU计算地址即可
条件在M级生成
例如条件储存写入,写入条件(目的地)在M级生成,在W级可以得到全部正确信息
D_Tuse_rt = 1; D_Tuse_rs = 0/1/2;//视具体情况可能有所不同
E_Tnew = 2; M_Tnew = 1;//E_Tnew至少为2,视写入值产生的时间而不同
阻塞逻辑
assign E_stall_new_rs = (E_new) && (D_Tuse_rs < E_Tnew) && (D_rs_ad == AllPossible(E_A));
assign E_stall_new_rt = (E_new) && (D_Tuse_rt < E_Tnew) && (D_rt_ad == AllPossible(E_A));
assign M_stall_new_rs = (M_new) && (D_Tuse_rs < M_Tnew) && (D_rs_ad == AllPossible(M_A));
assign M_stall_new_rt = (M_new) && (D_Tuse_rt < M_Tnew) && (D_rt_ad == AllPossible(M_A));
//E级和M级都进行特殊处理
assign E_stall_rs = (!E_new) && (D_Tuse_rs < E_Tnew ) && (E_A != 5'b0 && D_rs_ad == E_A);//或许需要将正常情况和新指令分离
assign E_stall_new = E_stall_new_rs | E_stall_new_rt;
assign M_stall_new = M_stall_new_rs | M_stall_new_rt;
assign stall = E_stall | M_stall | E_stall_new | M_stall_new | md_stall;