# 計算機結構_Computer Strcture ## 學期報告 * 因為突發的身體狀況(低燒+重感冒=>目前陰性!)不太適合到現場講解報告,如果老師有疑問,很歡迎臉書私訊我詢問,我會盡可能的將自己理解的部分以文字的方式做敘述。然後首先我先自首自己不擅於使用 git 做上傳程式碼的部分,所以使用 wiki 繳交... * 這學期對我來說是目前最硬的一學期,無論是心理上還是實際上...,數位邏輯設計與計算機結構同時修課,真的蠻硬的,雖然好處是這兩者相輔相成,建構我對邏輯設計與結構的觀念,但壞處是太硬體了 orz。在這門計算機結構上的努力我敢說的是所有科目(甚至從轉系以來)裡面最認真付出最多心力的...還有就是同時推甄準備研究所,幸好有錄取想去的學校,希望最後兩門必修可以順利過關 QAQ * Nand2tetris 的作業與以下的期末報告等,都是我使用零碎的時間去慢慢累積去完成的(21 學分 + 推甄、擔任 TA、撰寫論文等繁瑣事),花費的時間應該比大部分人都還長,Nand2tetris 中 Chp1 ~ Chp3 前半都是自己依照老師上課的內容去重複思考理解寫出,從 Chp3 後半 ~ Chp5 題目逐漸變困難,我在寫作業時有在幾個小地方卡住,之後開始大量閱讀 github 上各路網友們的解題思路與詢問相關背景的朋友慢慢拼湊理解出來的,讀懂與聽過講解後,再依照自己的理解不斷思考重新從空白的檔案撰寫出。 * 完成 Nand2tetris 後,我開始閱讀 RISC-V 手冊,也許是 Nand2tetris 對我來說雖然有趣但又些許燒腦XD,在首次在閱讀完畢後我必須對 RISC-V 架構師致上最高的敬意。本書展示了非常多指令的用法,也突出了很大一部份的 RISC-V 的特色-簡潔、降低成本、減少耗能等優勢,他目標是成為一個通用的 ISA,下列依照這 3 大項特性做書中的舉例 : 1. 簡潔化 -> 使用的方式是透過去掉部分擁有延遲分支特性的指令集與無條件跳轉,避免額外負擔條件分支及程式上的調用 2. 降低成本與耗能減少 -> 以整數做運算,單獨的移位指令加上低寬數的數據訪問減少大量能量,並還可以同時縮小晶片面積 而在閱讀完畢這整本教科書後,我能體會到 RISC-V 的重要性與為何這麼多人投入這項道路中。他加深了我對整體組合語言與指令的了解程度,更似乎理解了老師將此書目放進可讀的書籍目錄中的目的 - 我看到了不同以往(軟體)的計算機世界,一個截然不同以往視角去看資工系的好夥伴 - 計算機(電腦)的誕生與暫存器之間的交疊 - 而這也是我們逐步從 Nand2tetris 慢慢從邏輯閘到最後了解簡易的電腦架構的本課程最終目的。 * 即便目前已經閱讀完畢 RISC-V 手冊,我必須坦承還有些地方沒有琢磨透徹(主要是第八章的向量部分,其於篇章大致有 7~8 成左右的理解,但我打算過年期間再閱讀另外一本 RISC-V 相關的教科書相互對照理解),需要再多一些時間思索才有辦法更好的完整掌握(當然本書帶給我的更多的是驚喜與意外的領悟啟發,對上課以及自我查找資料的疑惑也有所解決)。但我已經安排好自己接下來的任務 : 將之前修的系統程式的期末老師曾經推薦的 [kilo](https://viewsourcecode.org/snaptoken/kilo/index.html) 再閱讀理解並加上自己的註解後(有一小部分為參考 kilo.c 的註解,一樣有將自己對於整體的理解與註記寫於程式碼中),並在接下來於假期中重新利用自己在這學期學習到的組合語言以及計算機結構、指令集等觀念實際實作一次,相信在這學期紮實的訓練之後,肯定可以完成這個目標。還有可惜這學期繁瑣事情較多,即使我將幾乎所有空暇時間分配給這門科目仍不太足夠,不然想嘗試將老師列舉出的期末作業等內容都閱讀、實作...((寒假與下學期待嘗試事項確立XD,希望到時候有所問題還能向老師您討教! ps.)學校的修課課綱是有存在的必要性,如果先修了數位邏輯(大一必修),再來修計算機結構(大二必修),最後則是系統程式(大三必修),我可以很肯定的說,我學的會更加穩固順利 OAQ (我的修課順序是 : 數位邏輯與單晶片實習 -> 系統程式 -> 數位邏輯 & 計算機結構...),這也導致這學期修課的我在有些時候彷佛在補之前的坑,終於理解為什麼當初在修系統程式的時候有一小部分怎麼讀 & 寫都沒辦法通透...(這學期已經將原先知識坑補的更完整,還跑回去複習之前的上課影片XD) * 本科目我的自我要求還有一份報告是閱讀 rv32emu 的專案並將自己理解之後寫下閱讀筆記,在經過上學期的閱讀原始碼的經驗,我非常熟能生巧的開始看所有的程式碼,((題外話:老師!!!我終於知道什麼是專案自有黃金屋了!!而且也終於懂為什麼您非常推薦我們直接閱讀完整的專案了!裡面真的好多用法、邏輯思維都非常巧妙,學習到的各式寫程式的小技巧跟整體架構比還在新手村自己閉門造車進步的還快且更完整簡潔))。本專案閱讀筆記有於不懂專案之處參考 [Computer Architecture](http://csiewiki.crboy.net/arch/schedule-old)、[Writing a simple RISC-V emulator in plain C](https://fmash16.github.io/content/posts/riscv-emulator-in-c.html)、[透過 RISC-V 模擬器搞懂指令管線化](https://ithelp.ithome.com.tw/m/articles/10264836)、[rv32emu 開發紀錄](https://hackmd.io/@Risheng/rv32emu#rv32emu-%E9%96%8B%E7%99%BC%E7%B4%80%E9%8C%84)以及 [rv32emu/issues](https://github.com/sysprog21/rv32emu/issues) 等觀念,以下的內容皆在自行理解後撰寫出,或許可能有自己閱讀理解上的觀念謬區,請老師見諒。這份 rv32emu 專案是實現 32 位 RISC-V 處理器模型的 ISA 模擬虛擬機,在這份專案中是藉由軟體的方式來模擬 RISC-V 的處理器與表現指令等的行為。首先先敘述 main 的部分,有 : 解析、讀取使用者輸入命令及輸入的執行檔、建立 I/O 界面等,在建立 I/O 界面中,有用到一個名為 riscv_io_t 的結構函式,定義會在 riscv.h 中理解皆是分別存取 word、half 及 byte 的指標。那在模擬器的結構中,還有個 riscv_t 將定義整個 I/O 的介面、program counter、general purpose registers 等硬體部分,除此之外,把他們包成物件的樣式好在後續做操作。接著來到可以根據使用者的輸入決定模擬器的執行模式、統計輸出等,最後則是 RISC-V 完成運行時將已建立的動態記憶體移除。根據之前在 RISC-V 手冊學習到的觀念 : 處理器有取得、解碼、執行與 pc 等指令,有了這些觀念,就能理解 rv_step 中的幾個巨集 : RV32_HAS、EXEC、DISPATCH(\_RV32C)、TARGET 分別的作用。 1. RV32_HAS : 判斷要使用 computed goto ( label address -> jump table) 還是使用函式指標 (call function) 2. EXEC : 執行各項相異指令 3. DISPATCH(\_RV32C) : 取得指令 + 判斷取得資料的指令是否未壓縮 + jump into label -> \_RV32C : 以 RV32C 的狀況為核心 ( 可以設定 pc 對應寬度的大小) 4. TARGET : 把上述的巨集整個封裝為物件後執行迴圈直至被終止 除了上述外,還有提供了一組基本測試給 RISC-V 架構,用於確認在執行應用時是否符合 RISC-V 標準,而這項基本測試主要以測試模擬器寫入的特定數據位置與輸出的檔案做相互的比較,來確定測試的成功與否。 * 以上提到的學習內容 ( Nand2tetris 作業、完整閱讀完畢 RISC-V 手冊、理解後重新整理筆記註解 kilo、閱讀 rv32emu 的專案筆記 ) 外,我將上課的筆記整理出,並多方吸收各種額外與本科目相關的知識,整理於下方的課堂筆記中,閱讀參考資料有附在筆記內且關於邏輯閘與真值表的部分是我使用 ppt 或手會自行繪製出。這份筆記非常的重要,因為計算機結構是各種邏輯閘與暫存器慢慢交疊而成的,這也是我對於這份科目努力的證明之一,更是我從最基礎的邏輯閘到最終可以理解 Nand2tetris 最後一章的內容 Memory、CPU、Computer 的過程,而學習報告資料來源已標示於內頁置頂。 ## Nand2tetris 作業 * [Nand2tetris Hw](https://github.com/4YCAaaa/co111a/wiki) - [x] Chp1 - 2022/09/22 Thurs. Done - [x] Chp2 - 2022/10/10 Mon. Done - [x] Chp3 - 2022/10/31 Mon. Done - [x] Chp4 - 2022/11/18 Wed. Done - [x] Chp5 - 2022/12/10 Sat. Done ## 書籍閱讀 & 閱讀加上註解或寫下閱讀筆記 - [x] [閱讀 RISC-V 手冊](http://riscvbook.com/chinese/RISC-V-Reader-Chinese-v2p1.pdf)(心得於學期報告中) - [x] [完成重新整理 kilo 的加上註解與閱讀筆記](https://hackmd.io/@44YCAaaa/HJm4KrL9o)(註解與筆記) - [x] [閱讀 rv32emu 寫下閱讀筆記](https://github.com/sysprog21/rv32emu)(筆記於學期報告中) ## Note 課程學習筆記 - [x] 完成計算機結構的課程學習筆記 - [第1週_上課使用教材 & 邏輯閘 & Verilog & Mux & DMux & 實際介面操作](https://hackmd.io/@44YCAaaa/Sy4cna8eo) - [第2週_布林代數 & 迪摩根定理 & 七段顯示器 & 半加器 & 全加器 & 半+半=全](https://hackmd.io/@44YCAaaa/rJ6dMUlWi) - [第 3 & 4 週_各種邏輯閘組合(1)](https://hackmd.io/@44YCAaaa/rkdS1Yuqj) - [第 5 & 6 週_各種邏輯閘組合(2)](https://hackmd.io/@44YCAaaa/SJ68m9uci) - [第7週_組合語言 & 常見的機器架構 & 機器碼](https://hackmd.io/@44YCAaaa/S1olivJHo) - [第8週_ARM & About C & CPU0 & 組譯器 & 連結與載入](https://hackmd.io/@44YCAaaa/HJoc1LL5o) - [第9週_ HDL 與從 CMOS 到 EDA](https://hackmd.io/@44YCAaaa/BJzVW5Dqj) - [第10週_竹科發展史與半導體產業](https://hackmd.io/@44YCAaaa/BJtu6qu9o) - [第11週_ ChatGPT 介紹](https://hackmd.io/@44YCAaaa/HkDkzO8qi) - [第12週_補充 FLAGS & MIPS](https://hackmd.io/@44YCAaaa/SJtFgsu5j) - [第13週_ 關於助憶符號 & Assembler & X86介紹 & CPU 的架構 & CPU擴展指令集](https://hackmd.io/@44YCAaaa/Hk9bbP_Yi) - [第14週_ CPU 的工作模式 & 記憶體組織模式 & Interrupt](https://hackmd.io/@44YCAaaa/r1RMKAFKo) - [第15週_ QEMU & KVM & QEMU-KVM & RISC-V & RISC-V 的協同式多工](https://hackmd.io/@44YCAaaa/ryKteII5s) - [第16週_如何讓電腦運行速度更加的快速?](https://hackmd.io/@44YCAaaa/rJtISouqi)(突發奇想的持續思考與查找資料 ing...隨時可能補充更新中) ###### tags: `Computer Strcture`