本發(fā)明涉及cpu流水線模擬,尤其涉及一種基于延遲槽補償?shù)膁sp流水線模擬方法。
背景技術(shù):
用軟件來模擬硬件,可以帶來許多好處。比如硬件的生產(chǎn)需要成本,而且硬件易損壞,而軟件在被正確開發(fā)之后,就幾乎不再需要成本。用來模擬計算機的軟件,模擬器,其出現(xiàn)給軟件的開發(fā)、調(diào)試帶來了巨大的效率提升,比如有了安卓模擬器,當(dāng)程序員在開發(fā)安卓軟件的時候,只需在pc上進行程序開發(fā),然后由模擬器來直接運行,而不需要把開發(fā)的程序下載到真實的安卓機上。
對于計算機來說,核心是處理器(cpu),而cpu的核心可以說是流水線,流水線驅(qū)動著cpu的工作。所以模擬器最重要也最困難的任務(wù)就是cpu流水線的模擬。
對于dsp流水線的模擬,傳統(tǒng)上是按行為來模擬流水線,比如dsp流水線有pg、ps、pw、pr、dp、dc、e1、e2……e10等共16個階段,即一個時鐘內(nèi)流水線做了16種不同的工作,對于硬件來說,這16種工作是并行的,流水線越深,在一定程度上程序就跑得越快,而對軟件模擬來說,是串行執(zhí)行的,流水線越深,需要模擬的行為就越多,效率就越低。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是針對傳統(tǒng)的dsp流水線模擬方法的不足,提供一種基于延遲槽補償?shù)膁sp流水線模擬方法。
本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的:一種基于延遲槽補償?shù)膁sp流水線模擬方法,具體包括如下步驟:
(1)解析目標文件,得到代碼段和程序入口點,把代碼段加載到模擬內(nèi)存中。
(2)對代碼段的指令進行譯碼,保存譯碼后的信息,得到pc到譯碼后的信息的映射關(guān)系。
(3)初始化延遲槽,初始化pc為程序入口點,清空延遲槽內(nèi)的所有結(jié)點。
(4)令cpu向前迭代一個時鐘,根據(jù)當(dāng)前的pc值,通過步驟(2)得到的映射關(guān)系,得到當(dāng)前指令對應(yīng)的譯碼后的信息,解釋執(zhí)行當(dāng)前指令,如果該指令在非e1階段寫回,則在延遲槽中新增一個結(jié)點,該結(jié)點保存了需要寫回的目的寄存器、寫回的結(jié)果值以及寫回的時間(cpu時鐘數(shù));如果該指令在e1階段寫回,則直接將結(jié)果寫回寄存器;
(5)檢查延遲槽內(nèi)所有結(jié)點寫回的時間是否與當(dāng)前時間一致,若結(jié)點寫回的時間與當(dāng)前時間保持一致,則將結(jié)點記錄的信息進行寫回,然后移除該結(jié)點。
(6)循環(huán)步驟(4)-步驟(5),直到最后一條指令執(zhí)行完畢,完成了流水線的模擬。
進一步的,在所述步驟(3)中初始化延遲槽,即初始化一個含空結(jié)點的鏈表或哈希表,將其作為指令結(jié)果寫回的暫存結(jié)構(gòu)。
本發(fā)明的有益效果是,在保證正確性的基礎(chǔ)上,大大加快了流水線模擬方法的效率,加快了目標程序執(zhí)行的速度:
(1)剪裁了模擬中的流水線,提高了負載程序的執(zhí)行速度。
(2)通過延遲槽補償機制,在流水線剪裁的情況下,保證流水線的正確流動。
附圖說明
圖1是本發(fā)明的流程圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明做進一步的說明。
如圖1所示,一種基于延遲槽補償?shù)膁sp流水線模擬方法,具體包括如下步驟:
(1)加載目標文件,根據(jù)目標文件的格式進行解析,得到程序入口點、代碼段等信息。代碼段是指令的目標碼集合,將代碼段加載到模擬內(nèi)存中。對每條指令目標碼進行譯碼,將譯碼后的結(jié)構(gòu)保存起來,得到一個指令到指令譯碼后的一個映射。
(2)對代碼段的指令進行譯碼,保存譯碼后的信息,得到pc到譯碼后的信息的映射關(guān)系。
(3)初始化延遲槽,即初始化一個含空結(jié)點的鏈表或哈希表,將其作為指令結(jié)果寫回的暫存結(jié)構(gòu),初始化pc為程序入口點,清空延遲槽內(nèi)的所有結(jié)點。
(4)令cpu向前迭代一個時鐘,根據(jù)當(dāng)前的pc值,通過步驟(2)得到的映射關(guān)系,索引得到當(dāng)前指令對應(yīng)的譯碼后的信息,解釋執(zhí)行當(dāng)前指令,如果該指令在非e1階段寫回,如branch等指令,則在延遲槽中新增一個結(jié)點,該結(jié)點保存了需要寫回的目的寄存器、寫回的結(jié)果值以及寫回的時間(cpu時鐘數(shù));如果該指令在e1階段寫回,如abs、mv等指令,則直接將結(jié)果寫回寄存器;
(5)檢查延遲槽內(nèi)所有結(jié)點寫回的時間是否與當(dāng)前時間一致,若結(jié)點寫回的時間與當(dāng)前時間保持一致,則將結(jié)點記錄的信息進行寫回,然后移除該結(jié)點。延遲槽可用隊列或者哈希表來實現(xiàn)。隊列是一個一維的線性結(jié)構(gòu),是一個鏈表,只能在表尾插入,任何位置可刪除。延遲隊列是延遲事件的容器,一個延遲事件包含了要延遲寫回的寄存器名,以及要寫回的值,以及當(dāng)前延遲事件在延遲隊列中的存活期。延遲隊列每個時鐘更新一次,每次更新遍歷隊列中的所有結(jié)點一次,并把每個結(jié)點的存活期減一,當(dāng)存活期為零時,把該結(jié)點從延遲隊列中移除,并把結(jié)果寫回到寄存器。在指令執(zhí)行時,根據(jù)當(dāng)前指令的延遲槽個數(shù)來確定延遲事件的存活期。哈希表是一個二維數(shù)組,它也是每個時鐘更新一次,但與延遲列隊不同。延遲哈希表相當(dāng)于是延遲隊列的一維數(shù)組,是延遲隊列的容器。但延遲哈希表里的延遲列隊所包含的延遲事件的存活期是相同的,也就是在增加延遲事件時,延遲哈希表根據(jù)當(dāng)前延遲事件的存活期將其加入到具體的某個隊列中。比如當(dāng)前隊列為0,延遲為2,則加入到(0+2)%n的隊列中,其中n是延遲哈希表的長度,即二維數(shù)組的第一維長度。然后不斷的對當(dāng)前隊列+1并對n取余即可。當(dāng)前隊列就表示當(dāng)前存活期為0的延遲隊列了。延遲哈希表在性能上要優(yōu)先延遲隊列。
(6)循環(huán)步驟(4)‐步驟(5),直到最后一條指令執(zhí)行完畢,完成了流水線的模擬。