自己动手写CPU(1)五级流水线及CPU第一条指令ori
自己動手寫CPU(1)五級流水線及CPU第一條指令ori
動機
不知為何研一的自由時間突然多起來,可能人一閑下來就容易焦慮吧,hhhhhh。正好之前看到一本《自己動手寫CPU》,就按照此書從頭實做一遍MIPS指令集的CPU,也當做對大學課程的總結。之前看龍芯杯比賽的代碼震驚到我了,想想那堆大佬本科在搞這東西而我本科在瓜瓜地刷分,感嘆人之間的差距真的好大。痛定思痛,還是先動手做起來這才能假意安慰自己,我好像也不錯。閑言少敘,讓我們開始吧!
由于作者提供了各章實現的具體代碼,所以該系列博客主要記錄我過程中有哪些觀點花了較長的時間才得以理解,文章末尾我也會提供自己照著寫的Verilog源碼,僅供大家學習交流使用,還希望大家多多支持原作。
ori指令說明
ori是進行邏輯“或”運算的指令,指令格式如下圖所示
指令用法為:ori rs,rt,immediate,作用是將指令中的16位立即數immediate進行無符號拓展至32位,然后與索引為rs的通用寄存器進行邏輯“或”運算,將運算結果保存至索引位rt的通用寄存器中。
流水線結構的建立
原始的OpenMIPS五級流水線結構
- 取指:取出指令存儲器中的指令,PC值遞增,準備取下一條指令;
- 譯碼:對指令進行譯碼,依據譯碼結果從通用寄存器中取出源操作數、取出操作碼,將其送到執行階段;
- 執行:依據譯碼階段送入的源操作數、操作碼進行運算;
- 訪存:對于本實驗中的ori指令,在訪存階段無操作;
- 回寫:將運算結果保存到目的寄存器;
下圖是原始的OpenMIPS五級流水線系統結構圖
各模塊的注意點
書本作者雷思磊為提高代碼的可讀性和易懂性,使用的較多的宏,都在文件defines.v中進行定義。且隨著后面OpenMIPS功能的不斷完善,會有更多的宏添加進來,可拓展性很強,以后自己編寫項目代碼時該點要向作者學習;
因為MIPS32架構規定$0的值只能為0,所以不能寫入,大家在看regfile.v的時候需留意這點;
原文作者在譯碼模塊id.v中,在組合邏輯always @(*)里用非阻塞賦值<=且對同一變量賦值兩次(賦默認值),這點我仍存在疑問。在我自己寫的代碼中,將組合邏輯中的賦值全部改用阻塞賦值=;目前功能測試通過;
彎路
我的環境是ubuntu18.04,書本提供的toolchain有點老舊,直接使用gcc-mips-linux-gnu會比較好,安裝代碼如下:
sudo apt-get install gcc-mips-linux-gnu將光盤里提供的Bin2Mem.c拿到linux下重新編譯后再進行調用,不要直接用exe文件;
更新后的Makefile代碼如下(將CORSS_COMPILE的定義修改掉即可),解釋見書本
ifndef CROSS_COMPILE CROSS_COMPILE = mips-linux-gnu- endif CC = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdumpOBJECTS = inst_rom.oexport CROSS_COMPILE# ******************** # Rules of Compilation # ********************all: inst_rom.om inst_rom.bin inst_rom.asm inst_rom.data%.o: %.S$(CC) -mips32 $< -o $@ inst_rom.om: ram.ld $(OBJECTS)$(LD) -T ram.ld $(OBJECTS) -o $@ inst_rom.bin: inst_rom.om$(OBJCOPY) -O binary $< $@ inst_rom.asm: inst_rom.om$(OBJDUMP) -D $< > $@ inst_rom.data: inst_rom.bin./Bin2Mem -f $< -o $@ clean:rm -f *.o *.om *.bin *.data *.mif *.asm在vivado中用$readmemh函數進行ROM的初始化時,要將數據文件補成絕對路徑,不然vivado找不到rom的初始化文件,示例代碼如下所示:
initial $readmemh ("/home/wg/OpenMips/Vivado/Chapter4/rtl/inst_rom.data",inst_mem);波形結果
心得
- 本章通過一個簡單的ori指令,搭建了一個原始的五級流水線結構,后續會逐漸對指令進行完善;
- 實現了一個用于測試的最小SOPC,學習了從匯編代碼到仿真中使用的指令存儲器初始化文件的過程;
項目鏈接
總結
以上是生活随笔為你收集整理的自己动手写CPU(1)五级流水线及CPU第一条指令ori的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDLBits答案(25)_编写Test
- 下一篇: 自己动手写CPU(2)流水线数据相关问题