自己動手寫CPU之第九階段(8)——MIPS32中的LL、SC指令說明

將陸續上傳新書《自己動手寫CPU》,今天是第47篇。


9.7 llsc指令實現思路

9.7.1 實現思路

      這2條指令都涉及到訪問鏈接狀態位LLbit,可以將LLbit當做寄存器處理,ll指令需要寫該寄存器,sc指令需要讀該寄存器,同時,與對通用寄存器的訪問一樣,對LLbit寄存器的寫操作也放在回寫階段進行。

      ll指令在訪存階段要讀取數據存儲器中指定地址的數據,還要設置對LLbit寄存器的寫操作,寫入的值爲1,這個寫操作會通過MEM/WB模塊傳遞到回寫階段,最終實現對LLbit寄存器的寫。

      sc指令在訪存階段要先獲得LLbit寄存器的值,如果該值爲1,那麼會完成存儲操作,同時設置對LLbit寄存器的寫操作,寫入的值爲0,還要設置對通用寄存器rt的寫操作,寫入的值爲1,這些寫操作都會通過MEM/WB模塊傳遞到回寫階段,最終實現對寄存器LLbit、通用寄存器rt的寫;反之,如果LLbit寄存器的值爲0,那麼不進行存儲操作,同時設置對通用寄存器rt的寫操作,寫入的值爲0,這個寫操作會通過MEM/WB模塊傳遞到回寫階段,最終實現對通用寄存器rt的修改。

      導致寄存器LLbit0的情況有:(1sc指令之前沒有執行ll指令;(2ll指令執行後、sc指令執行前,發生了異常。

9.7.2 數據流圖的修改

      爲了實現llsc指令,需要對數據流圖作如圖9-29所示的修改,主要是在回寫階段新增了一個LLbit寄存器,其中存儲的就是鏈接狀態位,只有在回寫階段纔會寫LLbit寄存器。同時,要將LLbit寄存器的值傳遞到訪存階段,以供指令sc進行判斷。



9.7.3 系統結構的修改

      爲實現llsc指令,需要對系統結構做如圖9-30所示的修改,新增了一個LLbit模塊,用來實現LLbit寄存器。


      在訪存階段的MEM模塊中會進行分析,如果是llsc指令,那麼設置對LLbit寄存器的訪問信息,通過LLbit_we_oLLbit_value_o接口輸出,前者表示是否是寫操作,後者表示要寫入的值,這些信息通過MEM/WB模塊傳遞到回寫階段,最終修改LLbit寄存器。

      LLbit寄存器的值通過LLbit_o接口輸出到MEM模塊的接口LLbit_i,當sc指令進入訪存階段時會使用到該值。

      需要注意的是,由於對LLbit寄存器的修改是在回寫階段最後的時鐘上升沿進行的,如果直接採用LLbit模塊給出的LLbit寄存器的值,可能不是正確的值,因爲此時處於回寫階段的指令可能會修改LLbit寄存器,這一問題在第6章添加HILO寄存器時也遇到過,解決方法還是數據前推,將回寫階段指令對LLbit寄存器的操作信息前推到訪存階段,訪存階段依據這些情況,確定正確的LLbit寄存器的值,所以在圖9-30中,MEM/WB模塊的輸出信號wb_LLbit_wewb_LLbit_value也要送到MEM模塊,就是用來解決數據相關問題的。


下一次將通過修改代碼實現LL、SC指令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章