CPU設計實戰-汪文祥 邢金璋
第4章 實踐任務三
實驗環境 lab4.zip
文章目錄
- 前言
- 一、實驗内容
前言
在lab4的實驗環境下,增加相應代碼用前遞技術解決相關引發的沖突,最後使得仿真時間相比實踐任務二更少。
一、實驗内容
在譯碼級判斷目前時刻處于執行級、訪存級或者寫回級的指令的目的操作數的寄存器号是否與譯碼級源操作數的寄存器号是否相同後,表示已經發生了資料相關,需要将執行級、訪存級或者寫回級的資料前遞到譯碼級。代碼如下:
EXE_stage:
output [31:0] EXE_result,
assign EXE_result = es_alu_result;
MEM_stage:
output [31:0] MEM_result
assign MEM_result = ms_final_result;
WB_stage:
output [31:0] WB_result
assign WB_result = ws_final_result;
ID_stage:
input [31:0] EXE_result,
input [31:0] MEM_result,
input [31:0] WB_result,
别忘了在mycpu_top相應子產品的執行個體化中添加對應的信号。
我們在譯碼級得到了目前時刻處于執行級、訪存級和寫回級的指令需要最終寫回到寄存器的目的操作數後,接下來就要産生相應的邏輯來判斷需要前遞的是執行級、訪存級還是寫回級的資料。在譯碼級修改的代碼如下:
/*資料前遞增加/修改代碼*/
//修改-begin
assign rs_value = rs_wait ? (rs == EXE_dest ? EXE_result :
rs == MEM_dest ? MEM_result : WB_result)
: rf_rdata1;
assign rt_value = rt_wait ? (rt == EXE_dest ? EXE_result :
rt == MEM_dest ? MEM_result : WB_result)
: rf_rdata2;
assign ds_ready_go = ds_valid & ~load_stall;
//load_stall在實踐任務二就已經添加,表示第i條指令是load指令,第i+1條指令
和load指令發生資料相關,此時需要前遞的資料還未準備好,需要流水線暫停。
//修改-end
/*---------------*/