之前我們寫過or的裸機程式,寫過基于or的linux裝置驅動程式,也反彙編過or的機器碼。
本小節,我們将通過一個簡單的實驗,對or的彙編(指令集)做一個簡單的梳理和測試。
要想了解or的指令集,其實隻要查查openrisc architecture manual就可以了,但是不是最好的熟悉方式,也沒有必要将其所有指令集記下來。我認為,通過一個實際的工程或者例子,從中了解or的指令集是比較好的一種方式。
那麼,通過什麼例子呢?
一般risc的指令集包括,運算指令,分支指令,和訪存指令,三類。是以我們這個實驗最好能用到這三類指令,碰巧,我最近在測試ddr控制器,是以我們下面将通過一個讀寫記憶體的例子來熟悉or的指令集。
在開始編碼之前,我們首先需要考慮如下幾個問題:
a,如何對彙編源程式(.s檔案)進行編譯,生成機器碼。
b,如何加載機器碼使or的指令總線能讀到。
c,如何檢視機器碼的執行過程和結果。
根據前面,我們積累下來的經驗,可知,利用bootrom進行rtl仿真,可以很好的解決上面三個問題。并且都是自動化的。
在了解并解決了上面幾個問題之後,剩下的就是具體的操作了。
a,修改soc-design/orpsocv2/sw/bootrom目錄下的board.h
b,修改soc-design/orpsocv2/sw/bootrom目錄下的bootrom.s
這個檔案,是需要我們自己手動編寫or的彙編了。
需要注意的有幾點。
首先,如何讓仿真自動退出:使用“l.nop 1”這條指令,具體原因可參考or1200_monitor.v檔案中的相關内容。
其次,如何判斷讀寫記憶體的成功與失敗,分别使用“l.nop 4”和“l.nop 3”。
最後,這些彙編,都很容易了解,唯一需要注意的是or支援延遲槽。
下面是具體代碼清單:
c,建立c語言裸機測試目錄和程式
由于我們想利用orpsoc現成的測試環境,是以我們還需要編寫一個假的,隻是為了滿足原有的測試環境的目錄和檔案。
在soc-design/orpsocv2/board/xilinx/ml501/sw/tests目錄下建立目錄和檔案:
編輯mem.c:
由于我們隻運作bootrom.s中的指令,是以mem.c裡面寫什麼語句不重要。
d,測試與驗證
完成編碼之後,我們就可以運作我們剛才寫的彙程式設計式了,方法我們之前已經介紹過多次了,這裡重複如下:
在 soc-design/orpsocv2/board/xilinx/ml501/sim/run目錄下執行如下:
很快,我們就可以仿真結束,然後,我們就可以檢視仿真日志檔案和仿真波形。
從中可以看出,對記憶體的讀寫都是正确的。
or1200_monitor輸出的日志檔案:mem-general.log

vcd波形檔案:
對于cpu來說,對所有外設(uart,i2c,vga......)的控制都可以通過load/store來完成,和讀寫記憶體的實質是完全相同的,是以,通過上面的彙編,我們隻要改變一下讀寫位址修改成對應外設的位址,我們就可以實作對該裝置的控制了。
當然,編寫出優秀的彙程式設計式也不是一件太容易的事情,這就需要詳細閱讀or的架構手冊,掌握gpr和spr的使用方法。甚至,我們還要檢視or32-elf-asm來了解更準确的or的指令集。