---
# System prepended metadata

title: SOC Design Study Journel

---

# SOC Design Study Journel
NTHU EE5251 SOC Design

學號:112061619
姓名:王證皓
# Lab 1
## 1.Introduction
此實驗目的為完成tool的虛擬機環境安裝，以及使用乘法器程式實現High-Level Synthesis，將C code 轉成RTL，並使用vivado進行整合ip與合成，最後輸出bitstream到PYNQ-Z2板上做驗證。
## 2.注意事項
Directives Control在synthesis使用如下圖，但進行到Cosimulation時，須將ap_ctrl_none那行拿掉以防錯誤，Export IP階段時，則記得需還原成原本的directive並重新synthesis再匯出IP。
![image](https://hackmd.io/_uploads/ry0ja41Dp.png)

# Lab 2
## 1.Introduction
此次實驗為使用FIR程式透過兩種不同interface來傳遞，第一種為AXI-Master，第二種為AXI-Stream，實驗步驟主要與上次大致相同，都會先使用HLS，不同的部分在於會使用插入兩種interface，引入IP後，Stream會使用到in跟out的DMA，最後驗證的部分MAXI我使用的是PYNQ的板子，Stream則是使用kv260做驗證。
## 2.注意事項
此次實驗在設置directive時，須將AXI-master的depth設超過600，可參考下圖
![image](https://hackmd.io/_uploads/HkDI3r1vp.png)

# Lab 3
## 1.Block Diagram
Function: 
![image](https://hackmd.io/_uploads/H1bu-SyvT.png)
## 2.Operation
### (1)	Tap Parameter in 
  Tap parameter會透過AXI-Lite來輸入，並存放到Tap_RAM裡面，AXI-Lite由wvalid與wready的handshake來做Data的傳遞，address也為相同原理，且須確定Tap parameter的address為0x20-FF，此時tap_We與tap_EN皆須拉起，並從RAM的位址0從小到大依序存放到位址44。
### (2)	Access Tap Parameter
  要存取Tap parameter時，tap_WE須關閉且tap_EN需打開，並依序輸入位址即可存取數值。
### (3)	Ap_ctrl
  當存完tap parameter後，會輸入位址0x00並在資料的第0個bit拉起，也就是ap_start會啟動FIR engine，此時ap_idle會變為0，並在運算結束後拉起ap_done。
### (4)	AXI-Slave & AXI-Master
  在ap_start啟動後，會透過AXI-Slave傳輸X的數值，即ss_tready會拉起以接收資料，並在運算結束後拉起sm_tvalid以輸出結果，並在最後一筆輸入輸出資料分別拉起ss_tlast與sm_tlast。
### (5)	Data-RAM
  此處以bram實現shift ram的效果，首先會將ss_tready拉起後的下一個cycle將data_WE打開，並存放到最底層(位址44)，下一次輸入會存到位址40，依此類推，直到存到位址0時，下一筆資料會從位址44繼續存放，當要存取時，會由counter控制位址從小到大存取。
  
![image](https://hackmd.io/_uploads/SyqTbSyDT.png)
Tap RAM的位址由counter從12’h28依序減4往下數即可，Data RAM則由兩組counter一起去控制輸出位址，一個counter在接收到ss_tready後將數值設為12’h28減去一個offset，並從這個數開始往上數，而這個offset則是由另一個counter，當接收到ss_tready時，會+4並維持，像圖中所示，data_A為紅框中12’h28時，offset為0，另一個data_A為12’h24時，offset則為4，以此類推即可得到shift RAM的效果。
# Lab 4-1
## 1.Introduction
此次實驗需要的背景知識為wishbone的interface，主要需撰寫的部分為counter的部分，當wbs_adr_i為380開頭時開始數10個clk拉起wbs_ack_o，總共會延遲11個clk，至於11個clk的用途會於lab4-2詳細說明，而counter的主要用途為用來存firmware進入bram，之後會將firmware的fir拿出來使用，輸出結果可以下mprj的前16個bit，如下圖為FFE3。
![image](https://hackmd.io/_uploads/Sk1kmBkPp.png)
![image](https://hackmd.io/_uploads/rylU4SJDa.png)
# Lab 4-2
## 1.Introduction
此次實驗在firmware的部分需fir的controller，負責將fir的input透過wishbone輸入至user project，而configuration register則需自行設計，如下圖範例，並透過lab3的verilog fir將資料根據address做decode並運算，最後由輸出由firmware端驗證以及觀察latency。
![image](https://hackmd.io/_uploads/SyYVLSkDp.png)

## 2.Block Diagram
![image](https://hackmd.io/_uploads/r1z0VBkvp.png)
## 3.FSM
S0:將frimware 透過wishbone 存進exmem
S1:當wbs_adr_i 為0x3000_0000 時，將11 筆tap parameter 存進bram11 及傳送data length 總共經過12 個clk
S2:確認wbs_adr_i 為0x3000_0000 時，接收X[n] 並計算11 筆資料的乘積
S3:將計算結果回傳至wbs_dat_o
S4:當計算至data length 時結束運算
![image](https://hackmd.io/_uploads/SkpgrH1Pp.png)

# Lab 5
## 1.	Block diagram
A.	Object: 把Caravel SOC simulation環境放到FPGA上
B.	Step: 
    1.	Load firmware code 檔案參數給PS side DDR，要load進硬體裡面透過AXI-master protocol 藉由read_romcode硬體放到BRAM裡
    2.	Load完後，ResetControl硬體把Reset放掉
    3.	透過Caravel_ps傳遞mprj反映在axilite
 ![image](https://hackmd.io/_uploads/rJvZvBkwp.png)
![image](https://hackmd.io/_uploads/SJhZvrJwT.png)
## 2.注意事項
此次唯一需注意的地方為在load不同的hex時，需設置reset
![image](https://hackmd.io/_uploads/rk4QDrJPa.png)
最後可讀mprj pin
![image](https://hackmd.io/_uploads/rkgqPryPa.png)
# Lab 6
## 1.Introduction
此次實驗會將fir,matmul,qsort,uart整合到firmware上，前三個function每執行完成一個function時需輸入一組address至testbench來驗證，而testbench會在最後進行一個loop back test，loop back的意思是發生interrupt時將一組資料從外部寫入uart的rx端，接收到後會由uart的tx寫回testbench，而user project的部分則須將lab4-1的counter加進來以寫入bram，而configuration register的部分，0x380為counter，0x300為user profect uart，以此address進行decode。
## 2.注意事項
此次實驗有需多細節須注意，像是我們這組在做decode時，我們這組因為一開始不小心有寫到這樣的架構
![image](https://hackmd.io/_uploads/BJ48crywp.png)
變成在執行FIR,QS,Matmul的位置為0x380時，而mprj[6]就會開始吃到錯誤的數值，而非使用uart的輸入輸出，進而產生亂碼，後來只讓uart單獨做控制就能成功解決
而在跑run_vivado時也有出現timing violation的問題可參考https://github.com/bol-edu/HLS-SOC-Discussions/discussions/158，非常感謝同學的幫助