BUAA-CO-条件写类指令处理方法

co-lab6上机前总结

Posted by Arthuring on Wednesday, December 8, 2021

条件写类指令处理方法

采用谨慎转发策略,防止在写和不写之间选择的指令产生错误转发

    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;