Chisel芯片開發入門系列 -- 18. CPU芯片開發和解釋8(流水線架構的代碼級理解)

以【5 Stage pipeline CPU】搜索圖片,選取5幅有代表性的圖列舉如下,并結合Chisel代碼進行理解和點評。

圖1:原文鏈接如下

https://acsweb.ucsd.edu/~dol031/posts/update/2023/04/10/5stage-cpu-pipeline.html

點評:黑色的部分是“數據通路”。藍色的部分是“控制通路”。這個圖的新穎之處就在于數據通路和控制通路在一張圖中呈現并且通過顏色明顯區分!在搜索引擎列出的一大堆圖中很快關注到這個圖,并以此作為“標桿”,關注數據通路+控制通路 都有的“全景圖”,而不是只有數據通路的“裁剪圖”。

圖2:原文鏈接如下:

https://github.com/shivpvtel/Five-Stage-Pipelined-CPU-Verilog

點評:同樣有那個Control Unit單元以及它所控制的信號鏈條,代表了控制通路!此圖的亮點有兩處:一是控制通路帶了箭頭更清晰地表達了控制的過程。二是和ChipCamp/riscv-chise-book的代碼中所展示的5-Stage Pipeline的命名是一致的,都是IF-ID-EXE-MEM-WB這樣5個Stage。其中,ID/EXE的右側寄存器,都增加了一個e代表EXE。EXE/MEM的右側寄存器,將e改為m代表MEM。ME/WB的右側寄存器,將m改為w代表WB。命名也比較規范。

圖3:原文鏈接如下:

https://nlitz88.github.io/projects/mipscpu/mipscpu/

點評:這個圖同樣有一個控制單元CU以及它所控制的信號鏈條,代表了控制通路。此圖相對于上圖來說有更多的細節之處,在于清晰地標識了多個階段的控制信號“反饋”到CU上!也就是mm, mm2reg等指向CU的箭頭。CU對除了Regfile外的各個電路單元的直接控制信號也更加多一些,比如對ID階段的多個Mux的控制,而對EXE階段的ALU及MUX的控制則和上一幅圖基本一樣。

?圖4:原文鏈接如下:

https://github.com/shivpvtel/Five-Stage-Pipelined-CPU-Final-Project-Verilog

點評:這個圖同樣有一個控制單元CU以及它所控制的信號鏈條,代表了控制通路。此圖相對于上圖來說有更多的細節之處,在于反饋和正饋的控制信號都更多了。

圖5:原文鏈接如下:

https://github.com/Ammarkhan561/RISCV-32I-5-Stage-Pipelined-Processor

點評:這個圖其實是和第一幅圖比較接近,但增加了下面的Hazard Unit(冒險單元),和上面的Control Unit相對應。而且合格Hazard Unit直觀一眼看到的“特征”就是全局控制----直接控制位于多個Stage內的電路。與此相對應的是,Control Unit單元是分級正向控制(正饋) + 直接獲取多級反饋。這在前面的圖3和圖4中特別明顯。正向的控制,通過多級模塊之間的寄存器傳輸以及位于級內的控制模塊響應這一側的信號變化,時鐘信號主要用于驅動寄多級模塊之間的寄存器傳輸!

圖6:原文鏈接如下(是圖5文章的一個對照,5-Stage-pipeline-processor vs Single-cycle-processor,意外地收獲到這樣的“對比”,太稀罕了):

https://github.com/Ammar-10xe/RISCV-32I-Single-Cycle-Processor

點評:這個單周期處理器(Single Cycle Processor)同樣也有Control Unit。這個Control Unit有什么特點呢,在上面的圖5的例子中Hazard Unit就是直接控制位于多個Stage內的電路模塊,而本圖中的Control Unit也是!這正是Single Cycle Processor的特點,即控制單元直接控制“全局”的眾多信號。而與此對應,5-Stage Pipeline Processor則是通過多級Inter-Stage的Register來分域控制!Inter-Stage Register在Clock的控制下實現左側->右側的寄存器傳輸,每個Stage的組合電路則受本Stage的Register的變化而實現響應(組合電路響應)。

Control Unit單元是分級正向控制(正饋) + 直接獲取多級反饋。這在前面的圖3和圖4中特別明顯。那么代碼中是怎么樣的呢?

下面的例子是05_riscvtests/Core.scala文件的一部分,其中第87行,在設置if_pc_next的時候(也就是對IF Stage進行正向控制的時候),讀取了exe_br_flg和exe_jmp_flg以及if_inst等變量,這些讀取的變量位于EXE和IF等不同的階段,說明了Control Unit是直接獲取了多級電路模塊的反饋的。事實上,所有這些多級模塊的變量,在整個Control Unit中(也就是Core.scala文件的Core模塊中),都是全局可訪問的,可以直接讀取。當然理論上也可以直接寫入,但5-Stage Pipeline的“范式”就是不要直接寫入,是保持架構原則的“不要”而非"不能"!

繼續這一架構原則,看看Exe階段的執行以及Mem階段的執行,如下圖所示。

Exe階段,就是一個純的組合邏輯電路,直接對exe_reg_exe_fun、exe_reg_op1_data等信號的變化進行響應、響應結果體現在exe_alu_out和exe_br_flag、exe_br_target、exe_jmp_flag中。前面的信號中的任何一個信號變化,都會導致響應結果的變化,這個響應是無條件的、立即的,不需要等待clock信號!只是在exe之前的階段,由Inter-Stage Register(也就是ID/EXE Register),響應(等待)clock邊緣信號到達時才會把exe_reg_exe_func、exe_reg_op1_data等通過賦值進行改變,進而【立即觸發】Mem這個Stage上的組合邏輯電路的響應。

而Exe階段的組合邏輯電路的響應,也僅僅只到達EX/MEM Register的左側,不影響EX/MEM Register的右側!EXE/Mem的右側各值的變化,要等待clock邊緣的到來!當clock邊緣到來后,Ex/Mem Register右側的mem_xxx值才會賦值上。注意注意注意:這里說的左側右側是對照此前的Pipeline示意圖而說的因為示意圖中的Pipeline都是從左邊到右邊(箭頭方向)!下面代碼中的245-255行里面的表達式的左側對應示意圖中的右側,表達式的右側則對應示意圖的左側!

至此,本文結合CPU的多級流水線的架構圖、深入介紹了CPU的多級流水線的代碼原理,并通過對比多級流水線處理器(5-Stage Pipeline Processor)和單周期處理器(Single Cycle Processor),理解它們在代碼原理上的差異和原則。總結一下:

單周期處理器:控制單元全局直接控制整個芯片的眾多端口

多級流水線:每個流水線階段的電路(組合邏輯電路)局部地響應Inter-Stage Register上的寄存器變量,而這些寄存器變量則是由Inter-Stage Register在Clock的驅動下從左到右傳輸。Inter-Stage Register不是一個啞的Register而是一個有左側寄存器、右側寄存器、寄存器傳輸控制的電路模塊,這個電路模塊的傳輸控制的輸入信號可以來自多個階段,而直接的輸出信號則原則限定在單個Stage內。

PS:Inter-Stage Register的這種電路行為,十分匹配寄存器傳輸級Register Transfer Level的概念,對理解RTL的概念應該很有益處。

PS:Inter-Stage Register是本文使用的一個詞,在業界似乎沒有嚴格的定義,有叫pipeline register的,也有叫interface register的,但在芯片架構圖中這個概念圖卻是高度一致的,都是從左到右的Stage之間過度的高寬比很大的長方形加一個以下邊為邊的三角形。這個圖示非常好,只是業界并沒有架構圖的標準,因此本文把這個圖示稱作"Inter-Stage Register"并進行了解釋(如上)。

PS:從分類學的角度,數字電路被分為組合邏輯電路和時序邏輯電路,這是一個“完備”的分類。高階的思維方式下,(前人所做的)“完備”的分類可以幫助理解復雜事務如CPU。從目前為止的梳理(到5-Stage Pipeline CPU)來看,CPU的設計“套路”十分簡單,就是:

1、一切都是組合邏輯電路、直到寄存器/鎖存器打破組合邏輯電路的“直接響應”!

2、只有Inter-Stage Register實現了時序邏輯,這是通過寄存器傳輸實現的,理解RTL的概念。

3、注意寄存器和連接到寄存器上的導線/信號線/Wire/Signal的區分。Inter-Stage Register的左側和右側,連接的是導線/信號線。

4、Inter-Stage Register右側的Register和這一側的組合邏輯電路,可以看做是一體的(即同一個組合邏輯電路),因為這部分是以Register右側的組合邏輯為主導,組合邏輯是“直接響應”的。

5、Inter-Stage Register左側的Register 和 這一側的組合邏輯電路,也可以看做一體的(即同一個組合邏輯電路),只不過這個是以Register左側的組合邏輯為主導,什么時候寫寄存器/鎖存器,是由左側電路決定的。但左側電路卻不決定左側右側Register之間的傳輸,而是確保在時鐘邊緣到達之前完成對寄存器/鎖存器的寫入。

6、Inter-Stage Register的左側Register和右側Register完全隔離并在控制電路的控制下進行寄存器之間的傳輸,是一個顯著的分界線。單個寄存器/鎖存器也可以通過“時序/時域”控制來實現時序電路(就像Single Cycle Processor所做的那樣),但使用左側Register和右側Register的“空間域”劃分的方式,更解耦更簡單(當然也有代價就是寄存器資源消耗)!這大概是現有的數字電路“分類學”所沒有談到的----ChipCamp從代碼和架構實踐中總結出來的“設計模式”----寄存器復制&賦值。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94439.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Docker容器中文PDF生成解決方案

在Docker容器中生成包含中文內容的PDF文件時,經常遇到中文字符顯示為方塊或亂碼的問題。本文將詳細介紹如何在Docker環境中配置中文字體支持,實現完美的中文PDF生成。 問題現象 當使用wkhtmltopdf、Puppeteer或其他PDF生成工具時: 中文字符…

2.java集合,線程面試題(已實踐,目前已找到工作)

1線程的創建方式 繼承Thread類實現Runnable接口實現Callable接口 2.這三種方式在項目中的使用有哪些,一般都是怎么用的 繼承thread類實現線程的方式通過實現run方法來實現線程,通過run進行線程的啟用實現runnable方法實現run方法,然后通過thr…

站在前端的角度,看鴻蒙頁面布局

從Web前端轉向鴻蒙(HarmonyOS)開發時,理解其頁面布局的相似與差異是快速上手的核心。鴻蒙的ArkUI框架在布局理念上與Web前端有諸多相通之處,但也存在關鍵區別。以下從五個維度系統分析: 📦 一、盒子模型&a…

JavaWeb遺傳算法、TSP、模擬退火、ACO算法等實戰應用

Java Web中實現遺傳算法的應用 以下是關于Java Web中實現遺傳算法的應用場景和實例的整理,涵蓋不同領域的解決方案和實現方法: 遺傳算法基礎結構 在Java Web中實現遺傳算法通常需要以下核心組件: 種群初始化:隨機生成初始解集。 適應度函數:評估個體優劣。 選擇操作:輪…

【圖像算法 - 09】基于深度學習的煙霧檢測:從算法原理到工程實現,完整實戰指南

一、項目背景與需求 視頻介紹 【圖像算法 - 09】基于深度學習的煙霧檢測:從算法原理到工程實現,完整實戰指南今天我們使用深度學習來訓練一個煙霧明火檢測系統。這次我們使用了大概一萬五千張圖片的數據集訓練了這次的基于深度學習的煙霧明火檢測模型&a…

間接制冷技術概念及特征

1、基本概念 (1)間接制冷技術即二次制冷技術。常規做法:二次冷卻液儲液罐增加放置于制冷系統管路,促使冷量再快捷的傳遞給載冷劑,繼而載冷劑冷量促使冷庫達到制冷效果。間接制冷技術:通過常壓的二次冷卻介質進行大循環傳送冷量,在直接制冷劑不易應用的位置或者不可運用直…

Antlr學習筆記 01、maven配置Antlr4插件案例Demo

文章目錄前言源碼插件描述pom引入插件案例:實現hello 標識符 案例1、引入Antlr4的pom運行依賴2、定義語義語法,配置.g4文件實現java代碼3、編寫完之后,執行命令實現編譯4、編寫單測測試使用參考文章資料獲取前言 博主介紹:?目前…

PostGIS面試題及詳細答案120道之 (101-110 )

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

第十七天:原碼、反碼、補碼與位運算

原碼、反碼、補碼與位運算 一、原碼、反碼、補碼 1、原碼 定義:原碼是一種簡單的機器數表示法。對于一個有符號整數,最高位為符號位, 0 表示正數, 1 表示負數,其余位表示數值的絕對值。示例:以 8 位二進制…

一次完整的 Docker 啟動失敗排錯之旅:從 `start-limit` 到 `network not found

一次完整的 Docker 啟動失敗排錯之旅:從 start-limit 到 network not found 你是否也曾自信地敲下 sudo systemctl start docker,卻只得到一個冰冷的 failed?這是一個開發者和運維工程師都可能遇到的場景。本文將通過一個真實的排錯案例&…

Tdengine 時序庫年月日小時分組匯總問題

年月分組select to_char(collection_time ,"yyyy-mm") AS date, cast(SUM(a.stage_value)as DOUBLE) as stage_value from TABLE GROUP BY date年月日分組select to_char(collection_time ,"yyyy-mm-dd") AS date, SUM(a.stage_value)as DOUBLE) as stage_…

數據結構(01)—— 數據結構的基本概念

408前置學習C語言基礎也可以看如下專欄:打怪升級之路——C語言之路_ankleless的博客-CSDN博客 目錄 1. 基本概念 1.1 數據 1.2 數據元素 1.3 數據項 1.4 組合項 1.5 數據對象 1.6 數據類型 2. 數據結構 2.1 邏輯結構 2.2 存儲結構 2.3 數據的運算 在學…

什么是模型并行?

模型并行c 簡單來說,就是把一個模型拆開來放到多個 GPU 上,一起訓練,從而化解“顯存塞不下模型”的問題!更多專業課程內容可以聽取工信部電子標準院《人工智能大模型應用工程師》課程獲得詳解!

跑yolov5的train.py時,ImportError: Failed to initialize: Bad git executable.

遇到的問題&#xff1a; Traceback (most recent call last):File "D:\miniconda\envs\yolov5\lib\site-packages\git\__init__.py", line 296, in <module>refresh()File "D:\miniconda\envs\yolov5\lib\site-packages\git\__init__.py", line 287…

TCP如何實現可靠傳輸?實現細節?

TCP如何實現可靠傳輸&#xff1f;實現細節&#xff1f;如何實現可靠傳輸&#xff1f;擁塞控制的主要機制TCP流量控制怎么實現的&#xff1f;如何實現可靠傳輸&#xff1f; TCP通過自身的序列號、確認應答、數據效驗、超時重傳、流量控制、擁塞避免&#xff0c;確保了數據傳輸的…

Linux 服務器性能監控、分析與優化全指南

Linux 服務器性能監控、分析與優化在現代 IT 架構中&#xff0c;Linux 服務器作為承載業務系統的核心載體&#xff0c;其性能表現直接決定了服務的穩定性、響應速度與用戶體驗。無論是高并發的 Web 服務、數據密集型的數據庫集群&#xff0c;還是承載虛擬化平臺的宿主機&#x…

基于wenet和模型做企業直播敏感語音屏蔽技術

本文介紹了基于Wenet語音識別工具包的實時敏感詞屏蔽技術方案。該方案通過客戶端緩存25秒直播內容&#xff0c;利用Wenet的流式識別和斷句檢測功能&#xff0c;實時檢測講師語音中的敏感詞&#xff0c;并將對應位置的語音替換為"嗶"聲。文章詳細闡述了Wenet的兩種識別…

42.MySQL視圖

1.一個需求emp 表的列信息很多&#xff0c;有些信息是個人重要信息 (比如 sal, comm, mgr, hiredate)&#xff0c;如果我們希望某個用戶只能查詢 emp 表的 (empno、ename, job 和 deptno ) 信息&#xff0c;有什么辦法&#xff1f;表的數據&#xff1a;想讓用戶查詢到的&#x…

MinIO01-入門

零、文章目錄 MinIO01-入門 1、介紹 &#xff08;1&#xff09;介紹 MinIO 是一款基于 Apache License v2.0 的開源對象存儲系統&#xff0c;專為海量非結構化數據&#xff08;如圖片、視頻、日志文件等&#xff09;設計&#xff0c;兼容 Amazon S3 API&#xff0c;支持高性…

*Docker數據卷(Volume)核心機制剖析:持久化與共享的終極解決方案

根本問題當容器被刪除時&#xff0c;其內部產生的所有文件&#xff08;包括配置文件、數據庫、日志&#xff09;都會不可逆丟失。數據卷&#xff08;Volume&#xff09;通過外置存儲方案徹底解決此痛點。一、數據卷與普通容器存儲對比實驗 場景1&#xff1a;無卷模式下的寫入悲…