【1】8位、16位、32位、64位
除了 CISC與 RISC 之分,處理器指令集架構的位數也是一個重要的概念。通俗來講處理器架構的位數是指通用寄存器的寬度,其決定了尋址范圍的大小、數據運算能力的強弱譬如32位架構的處理器,其通用寄存器的寬度為 32位,能夠尋址的范圍為 232Byte,即4GB的尋址空間,運算指令可以操作的操作數為 32 位。
注意:處理器指令集架構的寬度和指令的編碼長度無任何關系。并不是說 64 位架構的指令長度為 64位(這是一個常見的誤區)。從理論上來講,指令本身的編碼長度越短越好因為可以節省代碼的存儲空間。因此即便在64 位的架構中,也大量存在16位編碼的指
且基本上很少出現過 64 位長的指令編碼。
綜上所述,在不考慮任何實際成本和實現技術的前提下,理論上來講:。通用寄存器的寬度,即指令集架構的位數越多越好,因為這樣可以帶來更大的尋址范圍和更強的運算能力。
指令編碼的長度越短越好,因為這樣可以更加節省代碼的存儲空間常見的架構位數分為8位、16位、32位和64位。早期的單片機以8位和 16 位為主,知名的 8051 單片機是使用廣泛的8位架構。
?
?
目前主流的移動手持、個人計算機和服務器領域,均使用 64 位架構。
【2】CISC、RISC
常見的指令集架構大體上可以分為兩大類:復雜指令集體系(CISC)和精簡指令集體系(RISC)。
RISC全稱Reduced Instruction Set Compute,精簡指令集計算機。
CISC全稱Complex Instruction Set Computers,復雜指令集計算機。
CISC既有簡單指令也有復雜指令,后來人們發現典型程序中80%的語句都是使用計算機中20%的指令,而這20%的指令都屬于簡單指令;因此花再多時間去研究復雜指令,也僅僅只有20%的使用概率,并且復雜指令會影響計算機的執行速度。既然典型程序的80%都是使用簡單指令完成,那剩下的20%語句用簡單語句來重新組合一下模擬這些復雜指令就行了,而不需要使用這些復雜指令,于是RISC就出現了。
RISC的主要特點:
1)選取使用頻率較高的一些簡單指令以及一些很有用但不復雜的指令,讓復雜指令的功能由使用頻率高的簡單指令的組合來實現。
2)指令長度固定,指令格式種類少,尋址方式種類少。
3)只有取數/存數指令訪問存儲器,其余指令的操作都在寄存器內完成。
4)CPU中有多個通用寄存器(比CICS的多)
5)采用流水線技術(RISC一定采用流水線),大部分指令在一個時鐘周期內完成。采用超標量超流水線技術,可使每條指令的平均時間小于一個時鐘周期。
6)控制器采用組合邏輯控制,不用微程序控制。
7)采用優化的編譯程序
CICS的主要特點:
1)指令系統復雜龐大,指令數目一般多達200~300條。
2)指令長度不固定,指令格式種類多,尋址方式種類多。
3)可以訪存的指令不受限制(RISC只有取數/存數指令訪問存儲器)
4)各種指令執行時間相差很大,大多數指令需多個時鐘周期才能完成。
5)控制器大多數采用微程序控制。
6)難以用優化編譯生成高效的目標代碼程序
RISC與CICS的比較
1.RISC比CICS更能提高計算機運算速度;RISC寄存器多,就可以減少訪存次數,指令數和尋址方式少,因此指令譯碼較快。
2.RISC比CISC更便于設計,可降低成本,提高可靠性。
3.RISC能有效支持高級語言程序。
4.CICS的指令系統比較豐富,有專用指令來完成特定的功能,因此處理特殊任務效率高。
復雜指令集最常見的例子是現在絕大多數家用計算機和網絡服務器所使用的 AMD64 指令集(也叫 x86-64、x86_64、Intel 64、EM64T 等等,本文以發明人為基準稱為 AMD64。)除此以外有一定使用量,和有歷史意義的復雜指令集還有 IA-32、MC68000、MOS6502、Intel 8051、Intel 8080 等等。復雜指令集其復雜在于指令種類數量巨大,非常多次常用到不常用的功能都會被整合進處理器指令集中。同時復雜指令集系統每條指令的操作數尋址方式復雜,幾乎所有指令都可以直接訪問內存;相應的指令的機器碼編碼方式復雜,普遍使用不定長指令等。同時,復雜指令集系統一般沒有獨立的專用內存訪問指令,處理器內所設置的通用寄存器數量也偏少。(例如 IA-32 沒有嚴格意義上的通用整數寄存器,到了 AMD64 也才勉強設置了八個通用整數寄存器。)
精簡指令集最常見的例子則是常見于智能設備和嵌入式平臺的 ARM 指令集家族。除此以外除此以外有一定使用量,和有歷史意義的精簡指令集還有龍芯 LoongArch、MIPS、RISC-V、PowerPC、AVR 等等。精簡指令集其精簡在于指保留最基本最必要的指令,將復雜功能完全交給上層的軟件算法和下層的專用外設去解決。同時精簡指令集系統指令尋址方式往往非常單一,除了專門的訪存指令以外所有指令都只能在寄存器范圍內操作,相應的精簡指令集系統普遍使用固定長度指令,也會配備相對比較多的通用寄存器。(例如上個世紀的 ARMv4T、MIPS32 就都已經有 29~31 個通用寄存器了,相比于同時期 IA-32 的 0 個。)
實際到了應用層面上,對于高級語言程序來說,對于處理器設計來說,兩種指令集架構分類的實際差異已經不大了。Intel 和 AMD 的 AMD64 實現都使用了微代碼,而從復雜指令翻譯出來的微代碼普遍都用了類 RISC 設計。本世紀初的時候還普遍認為復雜指令集處理器速度更快,到了現在精簡指令集已經很強大了,完全比CISC更快。有些CISC最終也是轉化為RISC進行執行了。
【3】8位的CISC——8051
8位和CISC兩個似乎是矛盾的,但是8051活生生的輝煌了40年。
說起 8051 內核,幾乎無人不知無人不曉。8051 作為一款生了數十年之久的微處理器內核,在8位入式微處理器內核領域,它是當之無愧的傳“前輩”
自從Inlel于1980年為入式系統開發Intel MCS-51(通常簡稱 8051)單芯片微控制(單片機)至今,8051 內核架構已經走過將近 40個年頭。Intel 還以專利轉讓的形式8051內核轉讓給了許多其他半導體公司,這些公司進一步發展出不同型號基于 8051內核微控制器芯片,因此形成了一個龐大的 8051 家族。
幾十年發展下來的龐大的用戶群和生態環境,以及多年來眾多備受肯定的成功產品,可以說 8051內核幾乎成為8 位微處理器內核的業界標桿。8051 內核架構在 1998 年失去專利保護,久經沙場的它再次進發出強大的二次生命力,各種形式的 8051 架構 MCU(微控制器Microcontroller Unit)進一步涌入市場,各種基于 8051內核的芯片產品層出不窮,各種免費版本的 8051 內核IP 也可以從各種渠道獲取。
當然由于 8051 內核并沒有一個統一的組織和標準進行管理,所以也存在著體系結構浪亂,各種增強型復雜多樣的問題。雖然時常也都自稱為 8051 內核,但是其實各有差別,瑯滿目讓人難以分辨。但是這絲毫不影響 8051 內核的經典地位,時至今日,雖然目前微處理器內核正在經歷著向32位架構遷移的大趨勢,但是 8051內核仍然有著舉足輕重的地位在大量的MCU、數模混合信號芯片、SoC 芯片中仍能看到 8051 內核的身影,并且在相當長的時間內,在適合8位架構處理器內核的應用領域中都將繼續使用 8051 內核,可以說是“廉頗雖老,尚能飯也”。
8051 內核能在嵌入式領域取得如此成功的地位,可以歸功于如下幾個方面的原因。
廣泛的被認知度,簡單的體系結構。
沒有知識產權的限制,商業和開源的版本眾多,非常適合中小型芯片公司采用。
用龐大的用戶群以及相應的生態系統。
成熟且免費的軟件工具鏈支持。
——你似乎感受到RISC-V從其一誕生就符合以上幾條的氣質。
盡管如此,8051作為一款誕生了接近 40 年的8位CISC(復雜指令集)架構內核,雖然是“老驥伏析,壯心不已”,但是由于其性能低下,尋址范圍受限,已經難以適應更多的新興應用領域。隨著IoT的發展和崛起,雖然嵌入式領域對于處理器內核的需求更加井噴,但是更多的是開始采用 32 位架構,且很多傳統的 8 位應用領域也在開始向著32位架構遷移。這樣ARM的Cortex-M系列有了成長的機會。
然而在20世紀80年代該單片機剛剛問世時,半導體的制造工藝還只能達到um 級,處理器所能達到的時鐘頻率偏低。而且當時硬件設計語言還處于起步階段也缺乏自動設計的工具,軟件多以手工匯編編程為主。這就導致流水線設計的優勢無法得到發揮,并且每條指令需要多個時鐘周期才能完成。由于上述原因,當時的指令集設計往往具有以下特點:
(1)盡量在每條指令中實現更多的功能。例如 8051的CJNE 指令,就需要在一條指令中依次實現:
①與累加器做減法
②修改進位標示
③將結果做相等比較
④根據比較結果決定是否跳轉
(2)指令集龐大,以實現更多的復雜功能。例如 8051 雖然是 8 位單片機其指令集卻包含高達 255 種不同的指令和格式
(3)由于以上兩點,導致變長指令的出現,以提高內存利用率。8051的指令就有單字節、雙字節與三字節三種不同的種類,而且除了對指令解碼以外,沒有其他的手段幫助判定指令長度。
(4)尋址方式眾多。例如在 8051 指令集中,對數值的操作包括如下方式
①立即數尋址。將常數包含在指令中。
②?直接尋址。將內存地址包含在指令中。
③間接尋址。將內存地址放入寄存器中,然后將寄存器地址包含在指令中.
④寄存器尋址。將操作數放入寄存器中,然后將寄存器地址包含在指令中
【4】8051具備CISC的所有缺點
1)盡量在每條指今中實現更多的功能
為了在實現這些復雜功能的同時保持高吞吐率,流水線的設計者不得不花更多的時間規劃流水線的各級。即便如此,有些指令依然無法實現單周期吞吐,例如上文提到的CJNE 指令,就需要兩個時鐘周期。
另外,現代的8051 處理器開發,早已經采用C語言代替了早期的匯編語言而高級語言的編譯器往往很難把這類復雜、多功能機器指令的威力全部發揮出來有違當初指令集的設計初衷。
當然,指令集復雜這個特點也并非一無是處。由于 CISC 指令集的指令復雜也使得其代碼密度(Code Density)一般要優于同等字寬的RISC處理器
2)龐大的指令集浪費邏輯資源
龐大的指令集必然導致指令的解碼階段變得更為復雜,需要耗費更多的邏輯資源。指令集被分為兩部分對它們各自的解碼分別占用了流水線的一級。這樣設計的原因之一就是為了在龐大指令集下實現高吞吐率、高時鐘頻率,而不得不做出的妥協。同樣時鐘頻率的RISC-V處理器,由于指今集比較精簡,就無須做這樣的妥協,從而大大節省了邏輯資源,簡化了流水線設計。
3)變長指令的出現,以提高內存利用率
8051的指令有單字節、雙字節和三字節三種不同的種類,除解碼(Decode)外沒有其他的手段幫助判定指令長度。這種變長的指令結構,導致指令之間的邊界很難判定,甚至有可能導致內存的非對齊讀取(Unaligned Memory Access),從而對流水線的取指器(Instruction Fetch)設計帶來挑戰。
8051的內存架構是哈佛架構,其代碼與數據在不同的地址空間中分開存放。這就使得代碼存儲部分可以單獨做一些優化設計。
由于8051指令集沒有其他輔助手段來幫助判定指令長度,為了確定指令的邊界,8051的取指器不得不為此花費比 RISC-V 更多的邏輯資源
4)眾多的尋址方式
由于8051存在眾多的尋址方式,使得指令集中的許多指令都可以訪間內存這導致流水線的數據沖突(Data Hazard)很難判斷,有時不得不通過硬件自動插入空操作(Null Operation,NOP)來保持數據的正確和完整。這樣既消耗了邏輯資源,又降低了流水線的效率,從而對功耗和性能造成雙重打擊。
審核編輯:湯梓紅
評論
查看更多