自己动手写CPU(3)逻辑、移位操作与空指令
自己動手寫CPU(3)邏輯、移位操作與空指令
指令說明
MIPS32指令集架構中定義的邏輯操作指令有8條: and、andi、or、ori、xor、xori、nor、lui,其中 ori指令已經實現。
MIPS32指令集架構中定義的移位操作指令有6條: sll、sllv、sra、srav、srl、srlv。
MIPS32指令集架構中定義的空指令有2條: nop、ssnop。其中 ssnop是一種特殊類型的空操作,在每個周期發射多條指令的CPU中,使用ssnop指令可以確保單獨占用一個發射周期。OpenMIPS 設計為標量處理器,也就是每個周期發射一條指令,所以ssnop 的作用與nop相同,可以按照nop指令的處理方式來處理ssnop指令。
此外還有sync、pref這兩條指令,其中sync指令用于保證加載、存儲操作的順序,但對于OpenMIPS而言,它是嚴格按照指令順序執行的,加載、存儲操作也是按照操作順序進行的,所以可以將sync指令當做nop指令處理;pref指令用于緩存預取,OpenMIPS未實現緩存,所以也將該指令當做nop指令處理。
指令格式
and、or、xor、nor指令格式
and指令,功能碼是6’b100100,邏輯“與”運算。
指令用法:and rd, rs,rt (rd <- rs AND rt)
or指令,功能碼是6’b100101,邏輯“或”運算。
指令用法:or rd, rs,rt (rd <- rs OR rt)
xor指令,功能碼是6’b100110,異或運算。
指令用法:xor rd, rs,rt (rd <- rs XOR rt)
nor指令,功能碼是6’b100111,或非運算。
指令用法:nor rd, rs,rt (rd <- rs NOR rt)
andi、xori指令格式
andi指令,指令碼是6’b001100,邏輯“與”運算。
指令用法:andi rt, rs,imm ( rt <- rs AND zero_extended(imm) )
xori指令,指令碼是6’b01110,邏輯“異或”運算
指令用法:xori rt, rs,imm ( rt <- rs XORI zero_extended(imm) )
lui指令格式
指令用法:lui rt,imm ( rt <- imm || 0^16 , 即將指令中的16bit立即數保存到地址為rt的通用寄存器的高16位,低16位用0填充)
sll、srl、sra、sllv、srlv、 srav指令格式
sll指令,功能碼是6’b000000,邏輯左移
指令用法:sll rd,rt,sa ( rd <- rt << sa(logic) rt的值向左移位sa位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)
srl指令,功能碼是6’b000010,邏輯右移
指令用法:srl rd,rt,sa ( rd <- rt >> sa(logic) rt的值向右移位sa位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)
sra指令,功能碼是6’b000011,算術右移
指令用法:sra rd,rt,sa ( rd <- rt >> sa(arithmetic) rt的值向右移位sa位,空出來的位置用rt[31]的值填充,結果保存到地址為rd的通用寄存器中)
sllv指令,功能碼是6’b000100,邏輯左移
指令用法:sllv rd,rt,rs ( rd <- rt << rs[4:0] rt的值向左移位rs[4:0]位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)
srlv指令,功能碼是6’b000110,邏輯右移
指令用法:srlv rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出來的位置用0填充,結果保存到地址為rd的通用寄存器中)
srav指令,功能碼是6’b000111,算術右移
指令用法:srav rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出來的位置用rt[31]填充,結果保存到地址為rd的通用寄存器中)
nop、ssnop、sync、pref指令格式
指令說明:空指令
修改代碼
為了實現邏輯、移位操作與空指令(其中 nop、ssnop不用特意實現,可以認為是特殊的邏輯左移指令sll),只需要修改OpenMIPS 的如下兩個模塊。
- 修改譯碼階段的ID模塊,用以實現對上述指令的譯碼。
- 修改執行階段的EX模塊,使其按照譯碼結果進行運算。
確定指令種類的過程
疑問之處:書上提供的sync指令的op[10:6]=00001,但代碼中判斷認為op[10:6]=00000,查閱MIPS32手冊后發現,op[10:6]為stype碼,可以指定多種類型,全0和00001都在其中,如下圖
仿真結果
邏輯功能測試波形圖
移位功能測試波形圖
與書上提供的匯編代碼結果進行核驗后完全正確,功能正常實現。其中調試邏輯功能波形圖時,寄存器出現X的情況,調試了近兩個小時發現是頂層連線連錯了,真是個低級錯誤,希望大家認真仔細,不要重蹈我的覆轍。
項目鏈接
總結
以上是生活随笔為你收集整理的自己动手写CPU(3)逻辑、移位操作与空指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己动手写CPU(2)流水线数据相关问题
- 下一篇: 计算机组成与架构综述学习报告