---
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