RSIC-V——存儲器訪存指令

1. load/store 存儲器訪問指令

該指令是RISCV架構專門用來訪問存儲器的指令,其他任何指令均無法訪問存儲器。一般load採用I型指令格式,store採用S型指令格式。有效字節地址是通過將寄存器rs1與符號擴展的12位偏移量相加而獲得的。Load指令將存儲器中的一個值複製到寄存器rd中。 Store指令將寄存器rs2中的值複製到存儲器中。load/store指令是讓寄存器和存儲器進行數據交換,雖然不存在運算,但是都會經過完整的數據通路。

  • 舉例說明指令執行過程:

例如sw rs2, imm(rs1)   
即爲將rs2寄存器中存放的值保存到rs1寄存器值加上立即數imm值得到的相加結果的內存地址的內存單元

  1. 在當前時鐘下的PC值建立後,PC值被存入指令存儲器和加法單元。加法單元得到PC+4;
  2. 根據當前PC值從指令存儲器中(Icache)取出指令機器碼,根據機器碼中的寄存器編號直接訪問寄存器文件,其中指令中立即數字段送給立即數生成單元,指令的機器碼送給控制器
  3. 控制器獲得機器碼後根據指令編碼格式進行譯碼,產生控制信號,其中
    PC選擇信號PCSel爲0,
    立即數編碼選擇信號ImmSel爲S(表明爲Store指令),控制立即數生成單元生成S型立即數編碼,
    由於sw指令沒有寫回寄存器的操作,所以寫使能端信號RegWEn爲0,
    寫回選擇信號WBSel也爲*,表示不影響結果;
    sw不涉及操作數的比較,因此對分支比較器的控制信號BrUn和比較結果信號BrLT、BrEq都無作用;
    B操作數選擇信號Bsel爲1,選擇立即數生成單元輸出的立即數值接入ALU的B操作數端口,
    A操作數選擇信號Asel爲0,選擇寄存器文件輸出的DataA接入ALU的A操作端口;
    ALU的控制信號ALUSel爲add,控制ALU輸出加法運算結果,作爲數據存儲器的訪問地址值;
    數據存儲器讀寫控制信號MemRW=write,表示寫使能有效;使接入存儲器輸入數據段的寄存器文件原寄存器2的內容保存到存儲器中。
  4. 最後下一時鐘上升沿到來時,將更新的PC+4值寫入到PC寄存器,同時原寄存器2的內容寫入到數據存儲器中。

2. 多線程「上鎖」——原子指令

  • 「鎖」的概念
    假設一個場景如core1,core2共享一片數據區間,但是同一時間只有一個core能夠獨佔此數據區間,爲避免兩core同時發送請求導致競爭現象,於是二者約定了一個共享的全局變量作爲「鎖」。該變量在硬件上的本質是在存儲器中分配一個地址保存該變量的值(core1和core2均能訪問)。「上鎖」過程:
    1)當某個core獨佔共享數據區並完成相關操作後,便會釋放該數據區,通過向鎖中寫0將其釋放。
    2)沒有獨佔數據區的core都會不斷的讀鎖中的值,判斷是否空閒。若讀到的值爲0(空閒),便會向鎖中寫入1進行上鎖
  • 解決「上鎖」問題的方法
  1. 原子操作(AMO)
    爲解決上述競爭問題,可引入原子操作,即第一次讀(發現鎖空閒)和下一次寫操作(寫入1)成爲一個整體,這樣當發送讀請求的後即上鎖,其他core的請求便無效,即讀出-計算-寫回。操作過程:
    1)使用原子指令將鎖中的值讀出,並向鎖中寫入數值1。該過程爲一個整體性的原子操作,讀和寫操作間其他核不會訪問到鎖
    2)其他core讀鎖值,若爲1則繼續讀值,若爲0,由於原子操作已向其寫入1則可以獨佔。

    例如amoadd.w rd, rs2, (rs1)   該指令用於從地址爲寄存器rs1值的存儲器中讀出一個值,存放到rd寄存器中,並且將讀出的數據與rs2寄存器值進行計算(相加),將結果存放到rd寄存器中
  2. 互斥操作(LR/SC指令)
    雖然原子操作能解決多線程的競爭問題,但由於會將總線鎖住,導致其他核無法訪問總線,在覈數衆多且頻發搶鎖的情況下,會造成總線長期被鎖的情況,因此引入一種新的互斥類型的存儲器訪問指令,即LR/SC指令。


    LR指令用於從存儲器(地址爲rs1寄存器的值指定)中讀一個長度爲XLEN的數據存放到rd寄存器中。
    SC指令用於向存儲器(地址爲rs1寄存器的值指定)中寫入一個長度爲XLEN的數據,數據的值來自於rs2寄存器中的值。SC指令需要一定條件才能執行成功:1)LR/SC成對訪問相同地址;2)LR/SC間沒有任何其他的寫操作(來自於任何一個hart)訪問過相同的地址;3)LR/SC指令間沒有中斷核異常發生;4)LR/SC間沒有執行MRET指令
    如果執行成功則向rd寄存器寫回數值0;若失敗則向rd寄存器寫回一個非零值。

    LR/SC訪問存儲器地址必須32位對齊,否則會產生地址非對齊異常。

3. 存儲器屏障指令

fence指令用於屏蔽"數據"存儲器執行的順序。