天天看點

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

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

9.7 ll、sc指令實作思路

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的改動。

      導緻寄存器LLbit為0的情況有:(1)sc指令之前沒有運作ll指令;(2)ll指令運作後、sc指令運作前。發生了異常。

9.7.2 資料流圖的改動

      為了實作ll、sc指令。須要對資料流圖作如圖9-29所看到的的改動,主要是在回寫階段新增了一個LLbit寄存器,當中存儲的就是連結狀态位。僅僅有在回寫階段才會寫LLbit寄存器。同一時候。要将LLbit寄存器的值傳遞到訪存階段,以供指令sc進行推斷。

9.7.3 系統結構的改動

      為實作ll、sc指令,須要對系統結構做如圖9-30所看到的的改動。新增了一個LLbit子產品。用來實作LLbit寄存器。

      在訪存階段的MEM子產品中會進行分析。假設是ll、sc指令,那麼設定對LLbit寄存器的訪問資訊,通過LLbit_we_o、LLbit_value_o接口輸出。前者表示是否是寫操作,後者表示要寫入的值,這些資訊通過MEM/WB子產品傳遞到回寫階段。終于改動LLbit寄存器。

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

      須要注意的是。由于對LLbit寄存器的改動是在回寫階段最後的時鐘上升沿進行的。假設直接採用LLbit子產品給出的LLbit寄存器的值,可能不是正确的值,由于此時處于回寫階段的指令可能會改動LLbit寄存器,這一問題在第6章加入HI、LO寄存器時也遇到過,解決方法還是資料前推,将回寫階段指令對LLbit寄存器的操作資訊前推到訪存階段。訪存階段根據這些情況,确定正确的LLbit寄存器的值。是以在圖9-30中,MEM/WB子產品的輸出信号wb_LLbit_we、wb_LLbit_value也要送到MEM子產品。就是用來解決資料相關問題的。

下一次将通過改動代碼實作LL、SC指令。