iT邦幫忙

0

[simple-mips] fetch stage

  • 分享至 

  • xImage
  •  

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

fetch-stage

fetch-stage 會利用 pc 值,去跟 Inst_Mem 去要 instruction。

https://ithelp.ithome.com.tw/upload/images/20260206/20180992nBh0ja1w96.png

在 fetch 階段,會用到

  • Mux_2to1
  • Program_Counter
  • Full_Adder_32
  • Inst_Mem
  • Pipeline_Reg_IF_ID

相關程式碼



Program_Counter program_counter

Program_Counter 提供 PC 值,也就是我們想要拿取 instruction 的位址。
e.g. pc == 4, 就從 Inst_Mem 裡拿出 offset 為 4 的 4 bytes 資料。

Program_Counter 會從 pc_in_i 訊號拿取下一個 cycle 的 pc 值,並在下一個 cycle 的時候,輸出該 pc 值。

當 stall 發生的時候,下一個 cycle 的 pc 值就不會發生變化,下一個 cycle 持續輸出原本的 pc 值。

例如說,當發生 load-use hazard 的時候,我們會需要把 fetch-stage 跟 decode-stage 暫停 ( stall ),讓 execute-stage/mem-stage/wb-stage 繼續往下走,並且在 execute-stage 插入一個 bubble ( nop )。



note : 為什麼會需要插入 bubble ( nop )

  • fetch-stage, decode-stage 不動
  • execute-stage → mem-stage
  • mem-stage → wb-stage
  • wb-stage → 執行結束

這時候 execute-stage 會空出來,我們需要插入一個不會改變 cpu 狀態的 nop 進去。

  • nop 不會改變 CPU 的 register
  • nop 不會讀寫 memory

nop 簡單來說就是沒有任何效用的 instruction



Full_Adder_32 pc_adder_32

當沒有任何的 branch 發生的時候,我們就順順的在下一個 cycle 執行當前 pc 值 + 4 的 instruction。



Mux_2to1 mux_two_pc

從一開始的設計圖可以了解到,mem-stage 會把

  • branch 發生時,要跳到的 PC 值 傳到 fetch stage
  • branch 是否會發生 傳到 fetch stage

這個 mux 就是看 branch 會不會發生

  • 發生的話,就用 mem-stage 傳來的 pc 值
  • 沒有發生的話,就用 pc + 4


Inst_Mem inst_mem

reg [31:0] memory [0:31];
一個簡單的記憶體。 reg[31:0] 代表了每一個元素的大小是 32 bits,[0:31] 代表總共有 32 個元素

我們可以用 $readmemb("testcase.txt", memory); 把我們想運行的 instruction 載入到 Inst_Mem 裡面,並讓 CPU 可以取得 instruction



Pipeline_Reg_IF_ID pipeline_reg_if_id

fetch-stage 跟 decode-stage 之間的 pipeline register。

當 fetch-stage 要把資料交給下一個 stage,也就是 decode-stage 處理的時候,會需要先把資料暫存在 pipeline register,因為 decode-stage 是在下一個 cycle 才能處理這些資料。

Pipeline_Reg_IF_ID 會傳遞下列資料給 decode-stage

  • instruction
  • 當下的 pc 值 + 4

總結

從 fetch stage 就可以看到,一個 stage 不只乖乖地做自己的事情,也需要跟其他
單元進行合作。

以這個設計來說, fetch-stage 會跟下列的單元合作

  • hazard detection
    • 當 hazard 發生,並需要把 fetch-stage 給 stall 住的時候,會發訊號給 program_counter 以及 pipeline_reg_if_id,讓 program_counter 跟 pipeline_reg_if_id 不發生變化 ( 停住 )。
  • mem-stage
    • mem-stage 會把 branch address 傳給 fetch stage,而且不透過 pipeline register, 也就是fetch stage 在同個 cycle 就會收到資料。
  • decode-stage
    • 從 Inst_Mem 拿出來的 instruction,交給 decode-stage 來解析這個 instruction。

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

尚未有邦友留言

立即登入留言