iT邦幫忙

0

[simple-mips] decode stage

  • 分享至 

  • xImage
  •  

系列文章 : 使用 Verilog 實作 in-order CPU

decode-stage

decode-stage 負責 :

  • 將 instruction 切分成許多控制訊號。
  • 從 register file 裡面取出 register 的值
  • 把 immediate 從 16 bits 透過 sign-extend 擴展成 32 bits

https://ithelp.ithome.com.tw/upload/images/20260208/20180992euQ57xKfUU.jpg

在 decode-stage 階段,會用到

  • Reg_File
  • Sign_Extend
  • Decoder
  • Pipeline_Reg_ID_EX

相關程式碼



instruction format

在認識 decode 階段以前,我們可以先認識一下,每個我們需要支援的 instruction,他們的 format 會是長什麼樣子。

https://ithelp.ithome.com.tw/upload/images/20260208/20180992zSsrzQDebj.jpg



Reg_File regfile

實作 CPU 的暫存器,從程式碼可以看到,這邊的設計總共有 32 個 registers。
我們可以把資料暫時地儲存在裡面,並在 instruction 需要他們的時候,再將他們給提取出來。


  • rd_addr_1_in
  • rd_addr_2_in
  • rd_data_1_out
  • rd_data_2_out

rd_addr_in 就是我們想要取用的 register 的位置。因為總共有 32 個 registers,所以 rd_addr_in 的寬度是 5 bits ( 2 ** 5 = 32 )。

rd_addr_*_out 就是從 regfile 裡面提楚出的暫存器的內容。


在這個設計,是要到 wb-stage 才會知道要不要寫入 register。以下的幾個 signals 都是從 wb-stage,不經由 pipeline-register 傳過來的。

  • reg_write_in
    • 要不要寫入 register
  • wr_addr_in
    • 寫入哪一個 register
  • wr_data_in
    • 寫入 register 的值

note :

  • 上一個 instruction 會對 a register 進行 lw ( load ),也就是從 memory 把值載入到 register
  • 當下的這一個 instruction 會想要使用 a register

這時候會發生什麼事情呢 ?

  • 上一個 instruction 要到 wb-stage 才會更新 register 的值
  • 當下的這一個 instruction 在 ex-stage 就需要使用
  • 當下的這一個 instruction 在 ex-stage 的時候,上一個 instruction 還停留在 mem-stage !!!

這導致了 當下的這一個 instruction 在 ex-stage 的時候,會取得的,不正確的值。這時候我們就需要使用到 hazard detectionforwarding unit 的組合技了。


這邊有一個小巧思。

assign rd_data_1_out = ((rd_addr_1_in == wr_addr_in) && reg_write_in) ? wr_data_in : reg_file[rd_addr_1_in];

假如寫入的位址跟輸出的位址相同,就直接輸出寫入的值,這樣可以節省一個 cycle。



Sign_Extend imm_sign_extend

把 instruction format 裡的 imm[15:0] 從 16 bits,利用 signed extension 擴展成 32 bits。



Decoder decoder

在 decoder 裡,我們會把 instruction 解析出許多的控制訊號。

  • Branch
    • 0 : 這 不是 一個 branch instruction
    • 1 : 這 一個 branch instruction
  • Branch_Type
    • 0 : branch equal ( beq )
    • 1 : branch greater than ( bgt )
    • 2 : branch greater than or equal to ( bge )
    • 3 : branch no equal ( bne )
  • MemToReg
    • 0 : 把 alu 的結果交給 reg-file
    • 1 : memory 的結果交給 reg-file
  • MemRead
    • 0 : 不需要讀取 data memory
    • 1 : 需要讀取 data memory
  • MemWrite
    • 0 : 不需要寫入 data memory
    • 1 : 需要寫入 data memory
  • ALUOp
    • 要交給 ex-stageALU Control 的訊號。我這邊比較懶惰,直接把 instruction 的 [5:0] 丟給 ALUCtrl,該有更好的設計。
  • ALUSrc
    • ALU 要用 rt register 的值,還是在 instruction imm[15:0] 裡面的值 ?
    • 0 : 把 rt register 的值交給 ALU
    • 1 : 把 imm 的值交給 ALU
  • RegWrite
    • 0 : 不需要寫入 reg-file
    • 1 : 需要寫入 reg-file
  • RegDst
    • 0 : 把 rt 當作 write register 的寫入目標
    • 1 : 把 rd 當作 write register 的寫入目標

來個範例吧
add instruction 會需要什麼樣的控制訊號呢 ?

  • Branch
    • 0
    • add 不是一個 branch instruction
  • Branch Type
    • X
    • 沒有意義,不是 branch instruction,不用去管它的 Branch Type,所以這裡放什麼值都可以。
  • MemToReg
    • 0
    • 不會把 data memory 的資料載入到 register 裡面
  • MemRead
    • 0
    • 不需要讀取 data memory
  • MemWrite
    • 0
    • 不需要寫入 data memory
  • ALUOp
    • 直接把 instruction 的 [5:0] 丟給 ALUCtrl。
  • ALUSrc
    • 0
    • 因為 add 是把兩個 register 的值加起來給 rd,所以 ALU 的 source 會是 rt register。
  • RegWrite
    • 1
    • add 最後的結果需要寫入到 reg-file
  • RegDst
    • 1
    • add 最後的結果需要寫入到 rd 指向的 register,而不是 rt 指向的 register。

note : 假如控制訊號通通都是 0 ,會發生什麼事 ?

  • 不會讀取 data memory
  • 不會寫入 data memory
  • 不會寫入 reg-file

不會改變 CPU 狀態 … 所以假如我們想要在 CPU pipeline 裡面插入一個 bubble ( nop ),在這個設計裡,我們只需要把所有控制訊號設為 0。



Pipeline_Reg_ID_EX pipeline_reg_id_ex

把需要從 decode-stage 交給 ex-stage 傳進 pipeline register

  • rs_o
    • instruction 的 rs field
  • rt_o
    • instruction 的 rt field
  • inst_15_11_o
    • instruction 的 rd field
  • pc_adder_o
    • pc + 4 的值
  • regfile_1_o
    • 從 reg-file 拿出來,位址為 rs 的 register 值
  • regfile_2_o
    • 從 reg-file 拿出來,位址為 rt 的 register 值
  • sign_extend_o
    • 經過 sign extend 的 imm[15:0]
  • decoder_signals_o
    • decoder 解析出來的控制訊號


總結

decode-stage 會跟以下單元互動

  • fetch-stage -> decode-stage pipeline register
    • 把 fetch-stage 想交給 decode-stage 的資料提取出來
  • hazard detection
    • 需要時,會將 stall 或 flush 訊號交給 decode-stage
  • wb-stage
    • 把需要寫入 reg-file 的資訊交給 decode-stage
  • ex-stage
    • 經由 pipeline register,把 ex-stage 需要的資料傳遞出去

圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言