--- tags: RISCV, 伴學松, 伴學松活動記錄 --- # 從0到有製作自己的CPU!! 第四周活動記錄 20220726 [TOC] # 直播紀錄連結 {%youtube HoC87GBq2HA%} ## 出席 - [x] KIM_WENG - [x] 名名 - [x] chuan - [x] bill503084699 - [x] 楓糖 - [x] 謝祥辰 - [x] 黑貓 - [x] sixkwnp - [ ] Bonki - [x] ouo314 - [x] Willwho - [x] GYLABA - [x] mikuthebest - [x] Penquuin - [x] 葉子 - [ ] painCake - [x] EZ4ENCE - [ ] 頂漿汗腺 - [ ] 角角 - [ ] adam chen # 討論內容 1. 複習原本前兩周的內容 2. 幫助第三組複習 3. 討論下次這周星期四談論的主題 # 本周作業 - 利用Verilog 實現 Decode 電路 ![](https://i.imgur.com/SL7B0Pp.png) # 討論重點 1. 前兩周的主題ALU,decode,幫大家溫故新知 2. 看還有沒有其他補充 3. 各組組長補充 ## 點子 / 撇步 - decode告訴暫存器跟alu要做什麼,compyler [name= 第三組] - compiler既然這麼運算強,那它怎麼知道這是加法器還是減法器, [name= 黑貓] - rv32i沒有加減除法,不太會用到 [name= kim] - decode 接收risc-v指令並解釋出opcode 跟reg - decode運算完之後再交給alu判斷? [name=第三組] - 將上次的code去做註解 [name=第三組] - 用case寫,opcode 寫r type 看她的function3 若都一樣就是function7,所有type寫完opcode如果寫完就變成六大組 [name=第三組] - timescale 時間單位/時間精度,不用打宣告input [name=第三組] - initial…… - always每多久就會一直lup它 [name=第三組] - alway後面寫錯,要寫在initial外面,alway本身不能裡面有initial, [name=第三組] - always block裡面不能有assign [name=第三組] - 寫指令花比較久的時間,sll左移的情況 [name=第三組] - hdl在做的底層就是在alu在做的,opcode去下一步特地alu去動作給什麼值加減法,decode解出opcode rs1 rs2 imm lui mv 東西拆開去判斷,轉換成alu看得懂的底層機器語言,由二進位去轉換成機器看得懂 [name=willwho] - sel其實就是decode解出來的alu的opcode,rs1等於in1,rs2等於rs2,out=rd [name=第三組] - decipedia, risc v就是壓縮對齊,設備互相傳輸常常用到,tcp的封包也類似risc v的壓縮簡化整理,分成不同6個type位置整理的好了,用同一條線跟路徑可以分到不同alu去處理,dctime有反應輸出的opcode給alu去處理一定要很確定準確,指揮alu做加法你必須告訴他opcode function3 function7可以做什麼,如果都同一路徑會造成電路運算複雜造成要額外增加多工器去處理, [name=willwho] - rs 的s是source,rd的d是destination [name=第三組] - 各種coman壓縮,內容補充, [name=bridan] - absorber,led的閃爍 ,register是outl0,這樣子的cpu怎麼控制閃爍,特殊的memory,register相連alu,out=1 led閃爍 對應MOV OUTL,#1 [name=bridan] - (1)是參數一(2)參數二,register2=cpu的焊角輸出,設一個a空一格,如果這個a扣到0又減1,led由亮變滅的動作,loop往下掉,assembler 程式在幹嘛 [name=bridan] - 為什麼要有dff?,到底資料要怎麼存起來,當初的設想假設一條線循環下去資料就儲存起來,但是在裡面老圈圈沒寫新資料寫進去,再拉一條線來出來,write an able,多工器就像是多工器,像是一個開關,寫資料的開關,寫另一個資料,寫另一個資料,讓資料在裡面群環,當初cpu設計的設想 ,我們的多工器會有問題,里面有很多邏輯砸抖起來的,0變成1一直連閃,組合邏輯compiler loop,會爆掉連閃,那我們設一個牆壁如果衝過來會停住,額外加一個按鈕,inverter,如果設計一個牆壁,depflfot?,加入我們寫資料,跑過來,不想改寫資料,那就clock敲過去就會送過去,牆壁打開才會送過來,讀資料因為已經儲存了,因此register出來就再讀就好了,短短的52行的畫面,沒有很嚇人,write data d d f ,clk是牆壁,震源出發的clock,<=震源數 = 等於<=,那我們read 呢,我們的write讀入reg讀出,用組合邏輯讀出來,到時候我們的電路會長這樣樣子 ,what addr1 addr2 we 輸出reg1_data_i reg2_data_I 我們會把兩個reg讀出ess,add1資料從reg1拿出來,addr2從reg2拿出來 [name=kim] - inshotion ip模塊,我們在解碼的時候,因為code很長,rs1 rs2分別選位置,decode模塊會接在rs1 rs2,接位置選擇的線,rs1 rs2接到register data1 data2 data再傳到decode模塊裡面,到時候會有top module,負責要把top_module把兩個子模塊接起來 [name=Kim] - 有些指令不是從rs2 data2拿指令,而是從imm里偷拿拿資料,我們解碼opcode0到6判斷是否是imm的指令,如果type裡面沒有rs2就要從imm拿值去補沒有rs2的值的type,可以從多工器去挑,id模塊要降階,imm ,register,motiprasher這邊講得東西 [name=第三組] - r i type 長很像,sli,opcode就會往下傳就是因為還有亂七八糟的東西,要讓alu去做更多東西 [name=第三組] - ad sub是不用存取記憶體的,memory要回傳到register去做回傳, [name=第三組] - 最後在實現potecomter 拿指令拿到decode解碼,rs1rs2送到dataregister再送到alu送到memory writer data再寫到register去loop去回傳,decode解碼解出來對不對,再看demodule的波形圖 ,之後要用到子電路寫法 [name=第三組] - write anable放下來就是讀,會多一條線read anable要拉起來就是讀,兩個放下來就是什麼都沒幹嘛,如果兩個都拉出來,會造成延遲,write還沒寫read會先讀出來,會有read1 read2,假如write=read data 就不過 rental,為了過 d d f ,他們兩個一樣的話rdata2 =… [name=will] - rs32i 底層有一個是0,如果因此在設定要額外給一個0的值詳情請看Kim code,write data 就不要寫 [name=kim] - ripe這個軟體就是把多工器放在外面 [name=第三組] - 最陽春版 dff [name=黑貓]