本文選自極術專欄“IC設計”,作者芯工阿文,授權轉自微信公眾號芯工阿文,本篇主要講述對DMA的理解和認識。
這些天有個想法,在數字芯片設計中,很多模塊都可以近似為DMA模型,包括CPU。基于該想法進行擴展,一些復雜的模塊可以變得稍微容易理解。
首先描述一下什么是DMA,Direct Memory Access,字面意思就是直接內存訪問。個人認為這個名詞應該是從軟件視角進行定義的。實際上,DMA完成的工作,無非就是從一個接口讀取數據,再發送至另外一個接口,也就是對應著一讀一寫。從硬件角度來看,這個是很常規的操作,但在軟件看來,可以將大量的操作卸載到DMA,從而將CPU釋放出來做更多的事情。所以DMA實際完成的工作也就是數據的轉移,基于轉移的兩個方向之間的差異和特征,從而帶來各種收益。
數據轉移,簡單來說有3個要素,源地址、目的地址和數據長度。一般來說,DMA的實現有兩種方式,一是Direct DMA,另一個是鏈表DMA。Direct DMA就是通過寄存器讀寫的方式直接配置上述的3個要素;鏈表DMA就是將保存上述3要素的描述符存放于內存,再將其地址信息配置至DMA,啟動DMA后,解析描述符后做數據轉移。
鏈表DMA的處理流程近似如下:
1)根據配置信息啟動描述符讀取操作,解析描述符;
2)基于描述信息,獲取源地址和數據長度,啟動數據讀取操作;
3)讀取數據返回后,再將數據發送至目的地址,完成后告知狀態。
以此進行擴展,比如讀取數據返回后,做各種運算,再將結果發送至目的地址,不少加速計算模塊均是基于該思路進行處理的。再比如描述符讀取做一些處理,支持多樣化的描述符,或者描述符再嵌套描述符,等等。
個人認為,在SOC芯片內的幾乎所有計算模塊,均可以基于DMA的模型進行理解,再以此進行擴展開發,包括CPU。
再來看一下CPU是如何工作的,沒有深入了解CPU的結構,僅僅知道大概,如有錯誤,請輕噴。首先,CPU基于起始地址,從該地址讀取指令,再執行。一般來說,執行指令會伴隨著數據讀取,也就是LOAD,將數據搬運過來之后,再對數據做各種運算,完成后再將數據放回去,對應著STORE。這個過程是否跟DMA搬運數據非常類似?如下是對應關系。
圖1
兩者之間有非常近似的對應關系,基本原理是一樣的,只是在具體實現過程中,存在較大的差異。如描述符,對于DMA,僅有有限的幾個格式,不同實現有不同的指令格式,對于CPU,指令集就相當于描述符,類型很多,不同架構有不同的指令集,由此也會引入很多問題,其復雜度是DMA的很多很多倍,如CPU需要Cache,但是從沒聽說過DMA需要使用Cache。
還有一個明顯差別,CPU有計算邏輯ALU,通常來說,DMA將數據從源地址搬回來后,就直接寫到目的地址。這里再換個思路,如果在這兩者中間,加入一點計算邏輯,比如壓縮解壓縮、編解碼等等,是否與很多硬件加速器的架構基本是一致的?
可以看到,CPU和DMA之間,差不多就是兩個極端。CPU是屬于general purpose,DMA是目的性非常強的設計。在這中間取一個點,是否就可以對應GPU、AI、DSA等等場景?
前一段時間想做點事情,設計一個DMA,但在數據讀取和寫入之間開放一個接口,在這接口之內做一些計算邏輯,以此針對各種具體的數據計算場景,基于需求進行設計。也就是說,將這個DMA作為一個平臺,基于該平臺做后續的二次開發。但是,在梳理上述的概念之后,發現其實現在已經有類似的東西,也就是RISC-V。該指令集是完全開放的,當前也有各種各樣的開源代碼,有Verilog實現的,還有chisel,也有spinalHDL,完全可以基于這些代碼做針對需求場景的二次開發,而且可以從更小的數據粒度進行操控。
-
cpu
+關注
關注
68文章
11033瀏覽量
215995 -
接口
+關注
關注
33文章
8941瀏覽量
153197 -
IC設計
+關注
關注
38文章
1346瀏覽量
105244 -
dma
+關注
關注
3文章
572瀏覽量
102314 -
數字芯片
+關注
關注
1文章
112瀏覽量
18711
原文標題:把DMA當作一個模型
文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
DMA 串口傳輸原理解析


F28335 DMA設置代碼的理解
K60的UART模塊帶DMA接口怎么理解
DMA與DMA控制器

dma是什么意思? 什么是dma?

單片機的RAM和FLASH認識理解

16、STM32——DMA詳解

STM32使用DMA控制器試驗總結

STM32F1 ADC和DMA的簡單理解

STM32學習筆記(串口+DMA)

評論