--- tags: RISCV, 伴學松, 伴學松活動記錄 --- # 從0到有製作自己的CPU!! 第三周活動記錄 20220719 [TOC] # 直播紀錄連結 {%youtube SOXLZGi5xwI %} ## 出席 - [x] KIM_WENG - [x] 名名 - [x] chuan - [x] bill503084699 - [ ] 楓糖 - [x] 謝祥辰 - [x] 黑貓 - [x] sixkwnp - [ ] Bonki - [x] ouo314 - [x] Willwho - [ ] GYLABA - [x] mikuthebest - [x] Penquuin - [ ] 葉子 - [ ] painCake - [x] EZ4ENCE - [ ] 頂漿汗腺 - [ ] 角角 - [ ] adam chen # 討論內容 1. 熟悉decode前的背景知識跟用ripes運行decode的基礎操作。 2. risc-v的各種type(CPU指令)。 3. Q&A補充。 4. 討論下禮拜主題。 # 本周作業 1. 沒寫指令的請補完 # 討論重點 1. 學習Decode前的背景知識概述。 2. Decode基礎概念。 3. Ripes實作RiscV的各種type指令。 4. Compiler, Assembler, Linker 5. 用心智圖描述,Vivado實作Decode。 ## 點子/步驟 - 介紹基礎程式執行概念(高階語言->組合語言->機械語言、連結器、載入器)。 [name=第二組] - 可參考[淺談編譯到鏈結的過程](https://medium.com/@alastor0325/https-medium-com-alastor0325-compilation-to-linking-c07121e2803)、[編譯器(Compiler)與連結器(Linker)的運作原理](https://rexpighj123.pixnet.net/blog/post/207609288-%E7%B7%A8%E8%AD%AF%E5%99%A8(compiler)%E8%88%87%E9%80%A3%E7%B5%90%E5%99%A8(linker)%E7%9A%84%E9%81%8B%E4%BD%9C%E5%8E%9F%E7%90%86) - all srl sra的算數邏輯。 [name=第二組] - CPU架構。 [name=第二組] - Decode運行概念。 [name=第二組] - 基礎電路學。 [name=第二組] - 操作軟體(Ripes),[安裝教學](https://hackmd.io/@accomdemy/BJprQ8Xjc/https%3A%2F%2Fhackmd.io%2F%40accomdemy%2FSyoatR-sc)。 [name=第二組] - 用ripes輸入不同指令下去跑不同cpu架構。 [name=第二組] - 用ripes介紹[riscV的各種type編碼指令](http://riscvbook.com/chinese/RISC-V-Reader-Chinese-v2p1.pdf)(P.27) [name=謝祥辰,Willwho ] - 點名名教那個ripes軟體操作。 [name=第二組] - 透過上次各組作業(CPU指令表)計算。 [name=第二組] - 用程式計算機下去將decode下去把16進制轉換2進制。 [name=第二組] - 判斷R type, I type...,再判斷opecode, fuction3, function7 [name=第二組] - 算成二進位刪除末七碼成為opcode,再五碼為rd... - 舉 **I type** 為例 | `指令` | imm | rs1 | function3 | rd | opcode | `ALU_SIGN` | | ---- |:----:|:----:|:---------:|:----:|:-------:| -------- | | | 七碼 | 五碼 | 三碼 | | 兩種各七碼 | | - 再從opcode分辨是甚麼type。 [name=第二組] - 再從模擬器去對應各個type表格上的資料。 [name=第二組] - function3如果有function7資料我們就看function7的資料。 [name=第二組] - 我打錯S type的單位了是bit 不是byte [name=第二組] - 只有R type有function7 [name=第二組] - 如R type加法運算或減法運算等要依照Function7的code去對照。 [name=第二組] - 每一個type都是以32bit為基底下去區分是甚麼資料。 [name=第二組] - DC問所以decode是根據opecode跟function3(and function7)把instruction memory傳來的東西切成特定的片段們嗎。 [name=第二組] - 每一個指令都要佔據一個opcode,riscV很優雅的盡量塞在32bit裡頭但很有限,R type 17個opcode判斷一個指令,如果我們把opcode全展開幾乎就變成R type,所以riscv盡量精簡化下去變成各種type例如:I type如果是x86對應一個function,就會變成有100bit造成memory效能不佳?因此會造成很多指令,riscV就是將指令精簡化,讓100多bit精簡成32bit里縮減指令減少運算效能。 [name=Willwho] - ripes有藏彩蛋,全0或全1是會用一個有趣的代稱去取代表示? [name=第二組] - 先解opcode再下function3,下去解,如果這個type如果有funciton7要額外算。 [name=第二組] - 介紹額外的開源專案。 [name=第二組] - vivado在做的事情就是ripes,原本要從vivado寫decode下去接個上次的ALU但中間少了registers這個module,所以沒辦法直接用vivado下去用decode接上次的ALU程式。 [name=第二組] - riscV盡量把指令塞成32bit,12bit的數字拆成兩個imm下去除,為何拆,因為S type是儲存,不需要rd,function左移右移都沒關係但線路走的會有問題要固定,rd寫入riscv的功能,rs1 rs2是儲存riscv的功能,盡量分工,為了節儉電路,不然要多拉一個多工器去精簡化,S type是操作記憶體,一個(rs1)存要儲存在記憶體的位置,(rs2)一個是存內容(數值),程式區域跟陣列,還有平移1byte,willwho舉例……,進入ripes的memory介紹viewer [name=第二組willwho] - S type儲存指令 - ex: sb 1bytes - sh 2bytes - sw 4bytes - sd 8bytes [name=第二組] - 位置加平移量,存到rs2這個位置。 [name=第二組] - c語言不是有指標嗎?指定到某一個位置,就像是register,某些高階語言,compiler不是直接轉換,會分兩個階段,不同的平台cpu不同,轉換就會不同。高階語言先compiler成組合語言,assembler再轉換成機器語言,透過Linker連結外部的函式庫、外部變數、Library輸出成執行檔。 [name=Bridan補充] - Rv32I 47種指令,c語言的擴充指令。 [name=willwho] - Linker要將不同程式之指令的位址連結起來,並跳躍到正確的記憶體位址中。 [name=第二組] - Linker類似像編輯一樣,將哪個程式指令放在哪裡,外部library linker指定哪個library的哪一頁。 [name=Bridan補充] - 編譯(留下需要填的空格)->彙編(組譯)->連結(把空格填入真正的指令位址)。 [name=Bridan補充] - dc問那compiler linker都是用電路實現嗎? (世界上第一台電腦)whillwho回答用verilog實現電路。 [name=第二組willwho] - 會先執行build,幫你整合compiler linker跟……,按一個鍵就幫你做完,一般programer不會注意到這麼細節的地方或是這種細節。fortran是一個很古老的科學程式語言,當時30年前寫的,當時計算機要建築物等級,當時寫程式要用fortran開發非常早的language, 很多後來的系統繼續延用,寫一個program模擬感應電動機交流電壓,應用數學模型描寫術感應電動機,大約30年前的事情,當時覺得之後幾年之後或是30年後?(不確切bridan讀研究所的年紀)用不到,但讀海洋研究所,有用到超船模擬機,模擬船的運動動態航行,當時是用Fortran,改寫成其他Lauguage。我只有在這邊用到Fortran,未來有用到fortran的各位通常是在有點老舊的研究單位才會碰到。 [name=bridan補充] - 伴伴學是各個領域或是資深人士或是老師或是學生一起學習的地方,討論下次周四的東西。 [name=黑貓] - 簡單做個decode,用code接起來,照著will的想法下周四內容 [name=黑貓跟名名] # 補充 - (我的電腦程式學習歷程)https://4rdp.blogspot.com/2021/09/blog-post.html?m=0