Hello,xdm,又該是快樂的計組上機測試了,P3 課下都通過了吧?有沒有自己按照 MIPS 指令集增加一些指令呢~
如果你很順利通過了課下測試,並且簡單的 加控制指令(只需要添加 ALUControl 或 Controller 等等中的信號就可以實現)只需要 15min 以內,複雜一些的 加數據通路的指令(例如 J 型指令 或 lb、sb 等需要增加選通信號)需要 15-30min,那麼 dalao 就是你嘞!
經過了上篇中提到的 P3 課下作業那些 CPU 相關測試之後,是時候在上機測試中展現自己的能力了。
到了第四次課上的測試環節,我們會遇到一些新挑戰:時間會稍微放緩一些,稍一不小心就會出現 bug,有一些奇怪的指令要求等等,不過對於各位來說一次性通過不是問題,甚至 AK 。
我們在這裡展示 2020 秋的 P3 第 1、2 次上機題作為參考。由於每個人的 CPU 都有不同的實現方案,因此在這裡僅提供個人思路。P3 的每一題都有很多實現方法,大家可以自己探索,做完了還可以和夥伴們對拍(對拍的方法在 P0課下已經講過,具體參見:【我的計組生活5'b00001】P0課上測試 底部)
另外,由於 P3 上機測試題僅有第 1、2 次的,所以真正考試難度不一定和這些題目相同,僅供參考~
P3 的課上測試內容:測試基於課下 CPU 設計添加指令的方式進行。每次課上測試共三題,每題對應一條新增指令,且均設有相應的提交點,用以測試{課下指令集+題目新增的一條指令}設計的正確性。
從 P3 課上測試開始,後面的連續 4 次測試都會是添加指令,這些指令都會根據 RTL 語言描述進行,即和 MIPS 中/英指令集描述相同。每次都會在考試中提供 Mars_CO 的魔改版本。這個版本提供新指令行為的 class,導入到 Mars_CO 魔改版本中可以提供新指令的編譯。
*注意:所有題目之間不需要迭代設計(迭代時把指令控制信號限制死,基本上也不會出現問題),即每道題目中要求的新加指令都可以由初始的課下 CPU 直接添加得到,而不需要在已經通過了某道題目的基礎上進行添加。測試時不會出現兩條新加指令同時測試的情況。
參考 CPU 架構:
Branch and Link Register
補充說明:
該指令是一個無條件分支跳轉指令。可以選擇在 Controller 中添加一個輸出端,專門輸出 balr 控制信號,當然也可以使用分布式解碼,在不同的級產生信號,由於開頭 6 位是 110110,並且已經標註是 BALR,所以可以只判斷 Opcode 段即可知道是否是 BALR 指令。
仔細觀察,PC 要求與 beq 要求的地址拼接方式相同,因此這裡在實現的時候可以 借用 beq 的數據通路,選用 PC 計數器的輸入端為 branch | balr;當然你也可以模仿 b 類分支指令一樣再建一條 balr 專屬的 PC 地址拼接通路,但後者明顯麻煩。
由於 GPR[rt] 還需要存入 PC + 4,因此 PC + 4 至少要引線到 GRF寄存器堆 的輸入端,選用 MUX 和原數據源進行選擇,選通控制信號則為 balr,不過到底在什麼位置引就要靠各位來思考了,因為在單周期,只要控制得當,數據只要被選通到存入 GRF 的路徑上就可以成功。
*注意:由於是向 GPR[rt] 中存數據,因此不要忘記改 RegDst 信號。
Word Swap Bytes within Halfwords
補充說明:可以使用 Logisim 所有的內置元件。
HINT:使用Splitter元件為ALU增加功能。
該指令被要求添加在 ALU 中,可以說是較為簡單的,因為可以不需要在 Controller 部件中添加信號輸出端專門控制該指令,而可以靠 ALUController 為媒介來分布控制 ALU。
在 ALU 中添加功能的指令,首先在 Controller 中建立該指令的各器件控制信號,然後把分配的 ALUController 碼在 ALUController 中分配給一個 ALU 的運算解碼,控制 ALU 的運算功能,並在 ALU 中完成交換半字的操作,這樣完成了由 Controller 分布控制 ALU 的效果。
仔細觀察發現,WSBH 指令的特別指令段出現在 Shamt 段,但實際上由於課下指令並沒有與 SPECIAL3 段重複,因此也可以靠判斷 Opcode 來判斷是否是 WSBH指令。
其餘就是交換半字,這部分就是用 Splitter 分成 4 個字節,並在輸出端重新使用 Splitter 把對應位再組在一起。
Load Byte and Insert
補充說明:
HINT:可以使用 Logisim 的Splitter元件將32位的數據分成4組8位的數據,進行位拆分與位拼接操作。
該指令為添加數據通路型的較為複雜的指令,可以選擇在 Controller 中直接生成 LBI 指令的專屬控制信號,並用這個型號控制所有與該指令有關的 MUX 選通器的控制信號。
由於這個指令類似於 LB 或 LW,如果課下沒有做過 LB 指令,可能會略顯複雜。指令大多數更改出現在 DM 模塊,你可以在 DM 模塊外部進行數據通路改造,也可以在內部。具體操作就是將 ALU 模塊輸出的 DM地址 的最後兩位代表字內偏移,並將選中的那一個 Byte 插入到 GPR[rt] 中的對應位,而其他位則不變。
我個人的實現方法是,在 DM 外部進行數據通路改造。用 2 * 4 共 8 組 Splitter 將 DM 中讀出的數據進行選擇,輸出只有被選中 8 位有數據,其餘位為 0 的 32 位數據,而從 GPR[rt] 中出來的數據則反過來,只將被選中的 8 位全部標記成 0。這樣最後兩組數據用加法器連接,就可以做到插入的效果了。
實際上實現方法應該還有很多,但都大同小異,並且改起來也不是很複雜,但是有些同學測試過不去,因為被卡在了 HINT 中:CPU的 RegData 埠要輸出插入字節後的整字數據。這個有同學並沒有在這個 Probe 出現前改掉,因此被判為錯誤,特此標記。
計小組在P3嘗試添加jal指令的過程中出現了bug,jal指令不能正常執行,甚至beq指令都不能運行,已知他的問題出在IFU中,請同學們幫助他找出設計中的問題。
下面是計小組的IFU的電路設計圖:
計小組的設計中Branch信號為1代表當前指令為beq,jal信號為1代表當前指令為jal,zero為1代表當前ALU的兩個輸入相等。
A. beq 和 zero 與或門使用錯誤
B. PC4輸出結果錯誤
C. jal跳轉地址位拼接錯誤
D. 跳轉相對地址符號擴展錯誤
jr的指令格式是:
A. R
B. I
C. J
計小組在控制器內生成jr相關信號時,他生成的RegWrite為1,代表jr寫寄存器;RegDst的編碼對應的是rd,即被寫入寄存器的地址是rd;RegWriteData的編碼對應的是ALU的計算結果,即jr會將ALU的計算結果寫入rd對應寄存器內。
你覺得他的設計正確嗎?
A. 正確
B. 錯誤
計小組查詢指令集發現沒有subiu這條基本指令,他想自行設計並實現。指令格式和addiu一樣,RTL描述為:
但是計大組卻認為完全沒有必要,因為任何一條subiu rt, rs, imm指令都可以等價地用addiu rt, rs, -imm來實現。
例如,subiu $t1, $t2, 1234可以用addiu $t1, $t2, -1234來代替。
請問計大組的說法正確嗎?
A. 正確
B. 錯誤
(所有附加題答案均在推送結尾)
Move Conditional on Zero
補充說明:可以使用Logisim所有的內置元件。
HINT:原版MARS支持該指令。
該指令可以被認為是 R 型指令的變種,但因為在指令前有判斷條件,因此可以選擇在 ALUController 中添加 MOVZ 專屬控制信號(如果你沒有ALUController,可以直接在 Controller 中結合 Opcode 和 Func 段判斷),並和判斷 GPR[rt] == 0 的信號 與 一下,形成 if 後面是否再操作的新信號。這樣可以避免新指令與老指令之間的衝突。
由於這個指令可以算作是 R 型指令的變種,所以其餘的改動還算簡單,在 Controller 、ALUController、ALU中增加指令行為控制即可。
Load Byte and Insert
同(P3s1.Q3),在前文中已描述過。
其實如果你前面掛過,就知道有些上機測試會出現前幾次測試的原題或變種。
Branch on Less Than Zero and Link Register
補充說明:
該指令是 b 類分支跳轉指令 BLTZ 的變種。前面的 if - endif 段與 BLTZ 指令一模一樣,而只是增加了 GPR[rt] ← PC + 4,即在 rt 寄存器存入 PC + 4。
b 類分支跳轉指令均可以使用 beq 指令的數據通路,當然使用的時候要和 branch 組合成新的 b 類跳轉控制型號,所以會省力很多,當然還有很多別的實現方法。
而存入 PC + 4,則類似於 jal 指令,所以可以借用 jal 指令的數據通路,用新信號和專屬控制 jal 指令的信號 或 一下,這樣就可以顯得改動不會很多。
仔細觀察 RTL 與何種已有指令類似,類似的可以借用數據通路則借用,不可借用的注意模塊之間的控制是否有衝突。
加載每個指令的 class 文件,觀察 Mars 的行為,有時候不通過可能是自己理解的 RTL 和事實意思不同。
Logisim 中,有的器件在偶數個輸出端時,為了保證上下對稱,所以去除了中間的埠,已經有不少同學坑到,上機的時候一定要注意。
仔細閱讀 HINT,不要被某個檢查輸出的輸出端錯誤擋住了 AC 的腳步。
時間還算比較富裕,不要患得患失,短時間一直做不出來,可以換個題做,換換腦子,當然如果每個題目中都有幾個點(尤其是都是相同的點)錯誤,那有可能是課下 bug 了,建議不要放棄,一次上機的機會很難得,當然要面向評測機 debug(但是一般很難de出來)。
可以在設計文檔當中帶一些課下測試的代碼,用來測試課上課下指令是否有衝突,不過一般用不上。
推薦一個可以反彙編代碼的網站,但由於沒有 PC 初地址,所以建議手動更改或者在 CPU 中加入選通忽略 0x0000_3000 的初地址。
http://shell-storm.org/online/Online-Assembler-and-Disassembler/
好啦,以上就是 重製版的第 8 期【我的計組生活】!
希望能有幫助到你哦!!童鞋們可以來一波贊和在看,甚至是不是還可以來一波打賞~哈哈哈!
如果看到有錯誤還請一定聯繫作者更改,可以在後臺直接進行留言~,拜託各位大佬們了!
謝謝大家,我們 P4 課下見~ Verilog ready?Don't be anxious.
附加題不定項答案:
debug:ABCD
jr控制信號設計:A A
subiu設計:B