第七章 完事開頭難嗎 一切從取指令開始(1)

2022-09-09 19:42:26 字數 1075 閱讀 3608

取指模組目標:以最快速度連續不斷地從儲存器取出指令供處理器核執行

取指模組效能指標

首先需要保證儲存器讀延遲越小越好。片外ddr儲存器或者flash儲存器可能需要幾十個週期的延遲,片上地sram也可能要幾個週期的延遲。為了能快速取值,通常使用itcm和i-cache的方法。

itcm(instruction tightly coupled memory)

i-cache(instruction cache)

itcm和i-cache的儲存一般用sram實現。sram讀埠往往寬度固定,以32位sram為例,每個時鐘週期可以按照乙個位址讀出乙個32位的資料。若一條指令處於位址不對其的位置,則需要兩個時鐘週期進行讀取再拼接。所以要想辦法實現非對齊的指令也能乙個週期進行讀取。

分支跳轉指令非對齊:如果跳轉目標位址與32位位址邊界不對齊,且需要取出32位,此時剩餘快取無法實現。可以採用兩塊32位sram交錯儲存,位址不對齊的指令可以在同乙個時鐘週期訪問兩個sram各取16位進行拼接

1、分支指令型別

無條件跳轉/分支

帶條件跳轉/分支

為防止帶條件跳轉造成流水線空週期,採用分支**技術。

2、**方向

靜態**:僅依靠這條分支指令本身的資訊進行**

動態**:依賴已經執行過的指令的歷史資訊和分支指令本身的資訊綜合進行**

3、**位址

常見技術

取值時能盡快解碼獲得當前取出的指令型別

長度資訊放於低位,如果是16位指令也可以一取得就能判斷是16還是32,不必等待取完另外16指令字。而若不必支援壓縮指令子集,指令低幾位還可以忽略不計,減少指令快取開銷。

可以通過編譯器優化**,使向後跳轉的分支指令比向前跳轉的分支指令更大概率跳轉,配合硬體靜態分支**,提高效能。

使用jal指令,若目標暫存器索引值rd為x1或x5,則進行ras壓棧

對於jalr指令

軟體編譯器按照原則生成彙編**,可以保證硬體行為和軟體行為吻合,ras**準確性。

萬事開頭難,幹就完事兒了

總結今天在學習c語言巨集定義的時候發現了乙個問題。定義是這樣的 define sum a,b a b define sharp a,b a b 我們都知道c c 的巨集定義僅僅是進行字元替換。1.sum a,b 會將代入,然後求和 2.sharp a,b 會將a b組合在一起,成為乙個字串 然後進行...

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

第七章 函式

1.ansi c 允許函式原型的使用,函式宣告提供給編譯器和之後的呼叫函式返回值型別,引數型別和數量的資訊,而k c用單獨的列表給出引數的型別,編譯器只記住函式的返回值型別,但不儲存函式的引數數量和型別 2.沒有return語句的函式,隱式的返回 3.函式的原型可以單獨放於乙個標頭檔案中,一定要具有...