日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自己动手写CPU(1)五级流水线及CPU第一条指令ori

發布時間:2023/12/19 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自己动手写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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。