學(xué)習(xí)事物是怎樣工作的有其內(nèi)在價值:處理器是如何工作的對于我們普通人來說一直是個秘密勘伺,我們將從零開始構(gòu)建一個流水線處理器,為了實現(xiàn)這一處理器的軟硬件,我們有大量的前提知識要學(xué)習(xí)四濒,包括:指令系統(tǒng)蔬螟、硬件設(shè)計背景知識(hcl)、以及流水線的通用原理铁孵。學(xué)習(xí)完這些內(nèi)容以后我們才開始YY一個我們自己的86處理器锭硼。
本章內(nèi)容
※ YY一個指令集Y86:各種狀態(tài)、指令集蜕劝、編碼账忘、編程規(guī)范、異常處理熙宇;
※數(shù)字硬件設(shè)計背景:處理器的基本構(gòu)件鳖擒,如何連接操作,介紹hcl語言烫止;
※流水線原理蒋荚,如何實現(xiàn)高效的五個步驟;如何處理冒險與沖突馆蠕;
※開始實現(xiàn)我們自己的Y86期升;
筆記
一、基礎(chǔ)知識部分
1互躬、介紹一個精簡的Y86指令集
①狀態(tài)碼
②所支持的指令
說明:
? ? ? ? 1] 字段 fn 指明是某個整數(shù)操作:OPL、數(shù)據(jù)移動條件:cmovXX寺酪、分支條件:jXX坎背;
? ? ? ? 2] 圖中最后的pushl、popl指明不需要訪問任何寄存器0xF表示寄雀;
? ? ? ? 3] xxmovl中:i代表立即數(shù)得滤,r代表寄存器,m代表存儲器盒犹;
? ? ? ? 4] OPL代表的是:add sub and xor懂更;jXX代表:jmp眨业、jle、jl沮协、je坛猪、jne、jge皂股、jg墅茉。
【疑惑:不允許:存儲器——存儲器 ;立即數(shù)——存儲器 為什么呜呐?】
③一條普通指令的編碼:
其他具體的編碼如下:
根據(jù)功能進行最優(yōu)化的存儲方式蘑辑,比如rrmovl與條件傳送有相同的code編碼洋机,這是因為其行為相當(dāng)于無條件傳送。
洋魂!我們還需要訪問寄存器绷旗,為了訪問的便利我們給寄存器編號,統(tǒng)一存放在CPU的一個寄存器文件中副砍。就如學(xué)生時代的學(xué)號一樣衔肢,唯一、明確豁翎,也像收監(jiān)的犯罪嫌疑人角骤,你從入獄的那一天起將沒有名字,沒有身份心剥,只是一個簡化的號碼邦尊。
舉例說明:rmmovl %esp 蝉揍, ? 0x12345(%edx)
? ? ? ? ? ? ? ? rmmovl ——>4 ?0
? ? ? ? ? ? ? ? esp|edx—③—>4 2
? ? ? ? ? ? ? ? 0x12345——>00,01畦娄,23又沾,45(小端法存儲)
合成到最后的指令就是:[40] [42] [45] [23] [01] [00]
任何一個指令序列都是一個唯一的編碼
④異常
狀態(tài)碼如下:
⑤我們寫一段代碼試一試
翻譯成x86和y86匯編形式,基本上沒什么不同
(特別注意:pushl 將棧指針esp減去4纷责,并將內(nèi)容寫入存儲器中捍掺。當(dāng)我們執(zhí)行push esp時撼短,我們約定:首先雅鹿esp的原始值再膳,然后壓入減去4的esp的值)
2、邏輯設(shè)計和硬件控制語言
我們將會學(xué)到:計算對位進行組合的邏輯曲横;存儲位的存儲原理和更新時鐘信號三部分內(nèi)容喂柒。
① 對單個為進行操作:邏輯門
② 組合邏輯用HCL表示:一個邏輯門肯定實現(xiàn)不了很多功能灾杰,我們來組合一下
用于檢測兩個Bit是否相等:
當(dāng) a = b = 0時:上與邏輯為0艳吠,下與邏輯為1 或邏輯輸出eq為1麦备;
當(dāng)a = b = 1時:上與邏輯為1,下與邏輯為0 或邏輯輸出eq為1昭娩;
多路復(fù)用器:根據(jù)s的值選擇是輸出a或者b
當(dāng) s = 0時凛篙,上與為b, 下與為0栏渺,或邏輯輸出out = b呛梆;
當(dāng) s = 1時, 上與為0磕诊, 下與為a填物,或邏輯輸入out = a;
四路復(fù)用器:
字級組合電路:單個的bit位并沒太大用途
多路復(fù)用組合電路:使用32個MUX組合而成滞磺,只是非門是統(tǒng)一的一個
算術(shù)邏輯單元:ALU
③ 集合關(guān)系
在處理器設(shè)計中,很多時候需要將一個信號與許多可能匹配的信號做比較莱褒,以此來檢驗正在處理的信號是否屬于某一類指令代碼雁刷;
④ 存儲器和時鐘:存儲原理(組合電路本身不能存儲信息保礼,只是一個時間序列電路)
分類:
1] 時鐘存儲器(寄存器):存儲單個位或字沛励;
2] 隨機訪問存儲器(存儲器):存儲多個字;(虛擬存儲系統(tǒng)炮障,寄存器文件目派,)
硬件寄存器和程序寄存器的區(qū)別:
? ? ? 硬件寄存器:在硬件中寄存器直接將輸入和輸出連接到電路的其他部分;
? ? ? 程序寄存器:CPU中位數(shù)不多的可尋址的寄存器胁赢,地址就是寄存器ID企蹭。
a.硬件寄存器:當(dāng)時鐘信號處于高頻上升階段時,才將輸入的信號加載
b.寄存器文件
有兩個讀:A、B端口系馆,和一個寫:W端口送漠。允許同時進行多個讀寫操作,可以同時讀兩個寄存器和寫一個寄存器的值由蘑。srcX闽寡、desW代表地址代兵,valX、valW代表要數(shù)據(jù)爷狈。如我們要訪問3號寄存器ebx的值植影,就將srcA=3,然后valA就是要訪問的數(shù)據(jù)涎永。
c.隨機訪問存儲器
假如我們要訪問一個地址address上的數(shù)據(jù)思币,就將該地址傳入address中,同時設(shè)置write=0羡微,那么在data out上的數(shù)據(jù)就是我們要訪問的值了支救。
3 流水線通用原理
以自動化洗車設(shè)備為例,車子需要按照一定的速度通過流水線拷淘,增加了一部分處理量各墨。也就是不用等前面的車子洗完,就可以開入另一輛車子了启涯;但這個系統(tǒng)有時候也會增加延遲贬堵,比如你只需要給車子打蠟,但也必須要經(jīng)過噴水结洼、抹干階段黎做。
①未加入流水線的系統(tǒng):
②加入流水線的:
通過將指令分成了3個階段,我經(jīng)過一個120ps周期鸣峭,每條指令就行進下一個階段
③流水線操作詳細說明:
說明:詳細說明240-360的時鐘周期的故事
1] 點①時鐘開始上升之前(239):階段A中計算的指令I(lǐng)2已經(jīng)到達第一個流水線寄存器的輸入宏所,圖中藍色區(qū)域表示。但是該流水線寄存器Reg的值仍然是I1中的深灰色區(qū)域摊溶;指令I(lǐng)1在階段B中計算的值已經(jīng)到達第二個流水線流水線寄存器的輸入Comb logic B爬骤,深灰色表示;
2] 點②時鐘開始進入上升階段(241):兩個組合邏輯輸入:A和B莫换,將結(jié)果放入到流水線寄存器中霞玄,形成圖2的形式。藍色Reg和深灰色Reg拉岁,并將組合邏輯A設(shè)置成發(fā)起指令I(lǐng)3計算坷剧;
3] 點 ③階段信號開始傳播,信號通過不同的速率通過各個不同的部分喊暖;
4] 點④360來到之前惫企,指令I(lǐng)3完成組合邏輯A處的加載,形成淺灰色區(qū)域哄啄。
④流水線的局限性:
1] 不一致的劃分:由于階段的延遲并不一樣雅任,這樣空閑的空間就增加了延遲风范;
2] 流水線過深咨跌,收益下降沪么;
⑤帶反饋的流水線系統(tǒng):許多指令前后相關(guān),如何建立帶反饋的指令
二锌半、從零開始構(gòu)建我們的Y86處理器
1禽车、一個Y86的順序?qū)崿F(xiàn)(簡易方式)
為了要實現(xiàn)一個通用的框架,我們通常要找到這個框架的層次結(jié)構(gòu)刊殉,使得許多不同的指令可以共享相同的硬件殉摔,這是降低復(fù)雜度的一個有效的方法。
①跟蹤一塊指令序列的執(zhí)行:
②以 subl %edx记焊, %ebx為例:
③SEQ硬件結(jié)構(gòu)圖:
(注:為什么是逆序從下往上寫的逸月?我們以后講流水線的時候再講解。)
④SEQ的時間和執(zhí)行順序:
一條重要的原則是:處理器從來不需要為了完成一條指令的執(zhí)行而去讀該指令更新了的狀態(tài)遍膜。
比如我們之前講到的push %esp指令碗硬,如果是分步執(zhí)行,先將esp-4瓢颅,然后將更新后的值作為寫地址效率就太低了恩尾。我們的做法是在執(zhí)行階段計算出valE的值,然后在訪存和寫會階段同時完成更新寄存器和存儲器的操作挽懦。
我們再來看一段代碼:
我們重點來看一下翰意,第3和第4條指令的執(zhí)行:
我們來簡單的講解一下執(zhí)行的過程:
1] 在時鐘周期3開始的時候點①狀態(tài)元素保存的是周期2執(zhí)行irmovl時的更新后的狀態(tài),用淺灰色表示信柿。點②:隨著時鐘周期開始上升時冀偶,地址0x00c載入pc中,這樣就取出了addl指令渔嚷,值沿著Combinational Logic流動蔫磨,充滿了淺藍色區(qū)域。在這個時候ebx就是加了以后的0x300新值圃伶,以及pc的新值0x00e堤如。但是指令的狀態(tài)仍然保留的是irmovl指令設(shè)置的值。
2] 時鐘周期4:點③開始的時候窒朋,會更新程序計數(shù)器搀罢、寄存器文件、和條件碼寄存器侥猩。也就是addl更新的狀態(tài)榔至。同樣的會取出je指令,用深灰表示欺劳,ZF=0不會選擇分支唧取。在④的時候铅鲤,pc產(chǎn)生新值0x013,Combinational Logic已經(jīng)被更新過枫弟,但是狀態(tài)還是保持的是addl指令的設(shè)置的值邢享。
我們再重申一下原則:通過時鐘周期來控制元素的更新,通過組合邏輯來傳播淡诗,每次時鐘周期由低到高時骇塘,處理器開始執(zhí)行一條新指令。處理器從來不需要為了完成一條指令的執(zhí)行而去讀該指令更新了的狀態(tài)韩容。
⑤Seq階段的實現(xiàn):
1] 取指階段
說明:第一個字節(jié)為Split,字節(jié)0標(biāo)號為:icode和ifun群凶;1-5字節(jié)為Align:寄存器指示符和常數(shù)字的組合插爹。
2] 譯碼和寫回階段:這兩個階段都需要訪問寄存器文件
同時支持兩個讀,A请梢、B赠尾;和兩個寫:E、M溢陪;
3] 執(zhí)行階段
根據(jù)ALU fun信號設(shè)置是否進行,加減乘除操作形真。ALU的輸出就是valE
4] 訪存階段
5] 更新PC階段
2.Y86的流水線實現(xiàn)
我們說過,我們的目的是建立一個流水線化的處理器Y86咆霜,學(xué)了這么久的基礎(chǔ)知識邓馒,也建立了一個簡化的Seq模型,我們終于可以開始我們的內(nèi)容了蛾坯,首先我們來優(yōu)化一下簡易設(shè)計中的seq光酣,我們稱之為seq+:
①SEQ+:重新安排計算pc階段
SEQ+中沒有單獨的硬件寄存器來存放pc,而是通過pIconde脉课、pCnd等寄存器計算pc的值救军。
設(shè)計原則:只要處理器能夠正確的執(zhí)行機器語言,我們不需要程序猿可見狀態(tài)進行編碼倘零,只要能產(chǎn)生正確的值就可以了唱遭。
詳細的seq+圖如下:
②插入流水線寄存器的pipe-處理器結(jié)構(gòu):
說明:圖中以深藍色區(qū)域表示的就是我們加入的5個流水線寄存器拷泽,白色方塊代表不同的字段;
F : 保存pc預(yù)測值;
D :位于取指和譯碼之間司致,保存最新的指令信息拆吆,即將由譯碼階段處理;
E :位于譯碼和執(zhí)行之間脂矫,保存最新譯碼指令和從寄存器讀出的值枣耀,即將由執(zhí)行階段處理;
M :位于執(zhí)行和訪存之間羹唠,保存最新執(zhí)行指令的結(jié)果奕枢,條件分支和分支目標(biāo)娄昆,即將由訪存處理佩微;
W :位于訪存和反饋之間,提供給寄存器文件寫萌焰,完成ret指令哺眯,向pc提供返回地址。
③ 對信號進行重新排列和標(biāo)號
在pipe-中有4個標(biāo)號為stat的白色區(qū)域扒俯,就是不同指令的狀態(tài)碼:D_stat奶卓、E_stat、M_stat撼玄、W_stat來區(qū)分夺姑。而小寫的:f、d掌猛、e盏浙、m、w指的是流水階段荔茬。
④ 預(yù)測一下一個pc:除了分支和ret指令外废膘,我們基本上能夠用valC和valP的值來預(yù)測下一條指令的地址,這樣就可以通過之前學(xué)到的流水線技術(shù)使得每個周期執(zhí)行一條指令慕蔚。
⑤ 流水線的冒險和處理方法
什么是流水線的冒險丐黄?一條指令更新后面指令會用到的值。
當(dāng)irmovl $3, %eax在第六個時鐘周期的時候孔飒,寫回階段eax還未得到正確的值3灌闺,而流水線的系統(tǒng)中,addl %edx, %eax已經(jīng)需要使用eax的值坏瞄,這時侯得到的就是錯誤的值桂对。
冒險的分類:1)數(shù)據(jù)冒險;2)控制冒險惦积;3)加載\使用數(shù)據(jù)冒險
我們之前講到流水線的反饋中接校,提到過如果兩條相鄰數(shù)據(jù)存在關(guān)聯(lián)該如何處理成為了一個問題。特別是在使用流水線技術(shù)的情況下,如果一條指令要修改一個寄存器的內(nèi)容蛛勉,而下一條指令又剛剛需要引用該處的內(nèi)容鹿寻。如何使得兩條指令執(zhí)行正確。
方法一:暫停 ? ?
將指令阻滯在譯碼階段诽凌,相當(dāng)于加入一條nop指令毡熏,直到獲得正確的值,才讓其他指令繼續(xù)執(zhí)行侣诵。優(yōu)點是實現(xiàn)容易痢法,缺點是性能不佳
方法二:轉(zhuǎn)發(fā)
圖中可以看出杜顺,我們不是在被動的等待irmovl執(zhí)行完畢财搁,而是在addl指令需要用到eax值的時候,我們將irmovl的W階段的中間值躬络,W_valE=3轉(zhuǎn)發(fā)到addl指令中去尖奔,賦值給eax。
5個用作源的有:e_valE穷当、m_valM提茁、M_valE、W_valM馁菜、W_valE茴扁;兩個目的:valA、valB
有一類比較特殊的數(shù)據(jù)冒險:加載\使用數(shù)據(jù)冒險汪疮,我們特別講一下峭火?
上面的兩條指令铲咨,我們具體來看一下流水線的執(zhí)行過程:
我們執(zhí)行0x018指令躲胳,要在第八個時鐘周期的時候才能獲得eax的值,而0x01e指令在第七個時鐘周期就需要這個eax纤勒,我們不可能將這個值從第八個周期傳回第七個周期坯苹。就像不能穿越時間線回到過去一樣。遇到這種情況我們的處理方式是:使用暫停和轉(zhuǎn)發(fā)相結(jié)合的方法摇天,確切的講就是暫停addl執(zhí)行的一個時鐘周期粹湃,使得在周期8的時候?qū)崿F(xiàn)轉(zhuǎn)發(fā)。
⑥ 異常處理
異常分為:halt指令、有非法指令和功能碼組合的指令、訪問非法地址
處理方法:有多條指令引起異常孟害,由流水線最深的指令優(yōu)先級最高
? ? ? ? ? ? ? ? ?多條分支中有異常,取消預(yù)測指令
? ? ? ? ? ? ? ? ?出現(xiàn)異常孤钦,根據(jù)狀態(tài)碼的stat值歧斟,禁止其他指令更新程序狀態(tài)
⑦ PIPE各個階段的實現(xiàn):
1] PC選擇和取指階段
PC選擇器必須要選擇出正確的pc值,一般來說有三種方式可選:當(dāng)預(yù)測錯誤分支進入訪存偏形,選擇M_valA中的valP静袖;當(dāng)ret指令進入寫回階段時,選擇W _valM俊扭;其他情況下選擇F_predPC队橙。
2] 譯碼和寫回階段:
疑問:對于轉(zhuǎn)發(fā)邏輯和不同的轉(zhuǎn)發(fā)源還不明白;對Sel+Fwn的具體功能不明確
3] 執(zhí)行階段:
4] 訪存階段
⑧ 流水線控制邏輯
1]特殊情況的處理
ret指令實際的處理過程是在取指階段反復(fù)的取出ret指令后面的指令萨惑,在譯碼階段插入氣泡捐康;
當(dāng)分支結(jié)果還未計算出來的時候,保持預(yù)測指令執(zhí)行在FD階段庸蔼,這樣可以防止解总,如果預(yù)測錯誤,預(yù)測指令不會修改程序狀態(tài)朱嘴。如果決定不執(zhí)行分支倾鲫,取消指令的執(zhí)行不會帶來錯誤的影響粗合;實現(xiàn)的方法是根據(jù)stat的值:禁止執(zhí)行階段中的指令設(shè)置條件碼萍嬉;向存儲階段插入氣魄,以禁止寫入隙疚;當(dāng)寫回階段有異常的時候壤追,暫停寫回。
2]流水線的控制機制:加入氣泡和暫停
當(dāng)暫停stall=1的時候行冰,狀態(tài)保持先前的值不變;
當(dāng)bubble=1的時候伶丐,用nop覆蓋當(dāng)前的狀態(tài)
3]控制條件的組合
我們需要處理的情況為組合B:加載指令設(shè)置寄存器esp的值悼做,而ret指令將esp用作源操作數(shù),因為它必須從棧中彈出返回地址哗魂,流水線控制應(yīng)將ret指令阻滯在譯碼階段肛走。
(注:系統(tǒng)分析的重要性,僅僅運行正確其實并不可靠)
4]最終控制模型:
⑨ 未完成的工作:與存儲器的接口和多周期指令录别。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2016-12-25日晚朽色,閱讀完成
- 文/潘曉璐 我一進店門趣效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猪贪,你說我怎么就攤上這事跷敬。” “怎么了热押?”我有些...
- 文/不壞的土叔 我叫張陵西傀,是天一觀的道長。 經(jīng)常有香客問我桶癣,道長拥褂,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任牙寞,我火速辦了婚禮饺鹃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘间雀。我一直安慰自己悔详,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布惹挟。 她就那樣靜靜地躺著茄螃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪连锯。 梳的紋絲不亂的頭發(fā)上归苍,一...
- 文/蒼蘭香墨 我猛地睜開眼吗购,長吁一口氣:“原來是場噩夢啊……” “哼医男!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捻勉,我...
- 正文 年R本政府宣布识窿,位于F島的核電站,受9級特大地震影響脑融,放射性物質(zhì)發(fā)生泄漏喻频。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一肘迎、第九天 我趴在偏房一處隱蔽的房頂上張望甥温。 院中可真熱鬧,春花似錦妓布、人聲如沸姻蚓。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽史简。三九已至,卻和暖如春肛著,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跺讯。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 題庫 分析論述題 指令級并行、數(shù)據(jù)級并行暂雹、線程級并行的思想和發(fā)展歷程 (L05-P5~ 首装、L06-P32?書本P2...
- 閱讀經(jīng)典——《深入理解計算機系統(tǒng)》06 本文杭跪,我們要做一件大膽的事情仙逻,從零開始實現(xiàn)一個全新的指令集架構(gòu)驰吓,以此深入理...
- 一、概要 1系奉、數(shù)據(jù)的表示:數(shù)制及其轉(zhuǎn)換檬贰、原碼、反碼缺亮、補碼翁涤、移碼、浮點數(shù)萌踱、溢出迷雪、算...
- 今日秋分章咧,距離2017年還有100天,真的這么巧嗎能真?一百天很短嗎赁严?不短,一百天足夠培養(yǎng)一個習(xí)慣粉铐,改變一種狀態(tài)疼约。一百...