黃光紅++王昊
摘要:分析VLIW架構(gòu)處理器特點(diǎn),設(shè)計(jì)周期級(jí)精確的指令集模擬器。模擬器被按照功能劃分為若干具有規(guī)范接口的模塊。通過修改、替換模塊可快速構(gòu)建新模型,具有較好的可擴(kuò)展性。采用高效的二進(jìn)制指令譯碼算法和JIT-CCS技術(shù)提高性能。實(shí)踐表明,本模擬器在處理器設(shè)計(jì)過程中起到重要作用。
關(guān)鍵詞:超長指令字;處理器設(shè)計(jì);指令集模擬器;周期級(jí)精確
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)18-4286-04
Design of Simulator for VLIW Processor
HUANG Guang-hong, WANG Hao
(East China Research Institute of Electronic Engineering, Hefei 230031 , China)
Abstract: Analyzing VLIW architecture processor, this paper designs a instruction set simulator with cycle accurate. According function, the simulator is divided to several module which with standard interface. The simulator is flexible and is able to become other processor prototype fast by modification and replacing。Adopting efficient decoding arithmetic for binary instruction and JIT-CCS, the simulator obtains excellent performance. The result demonstrates that the simulator can work effectively for design VLIW processor.
Key words:VLIW; processor design; instruction set simulator; cycle accurate
處理器研究和設(shè)計(jì)是一項(xiàng)消耗資源多、持續(xù)時(shí)間長的科研工程。特別是嵌入式處理器設(shè)計(jì),面對(duì)競(jìng)爭(zhēng)日益激烈的市場(chǎng)環(huán)境,研發(fā)人員必須盡量縮短上市時(shí)間獲取市場(chǎng)先機(jī)。為了在有限時(shí)間內(nèi)設(shè)計(jì)功能正確、性能高效的處理器,指令集模擬器(Instruction Set Simulator,簡(jiǎn)稱ISS)不可或缺。指令集模擬器在各階段發(fā)揮著重要作用。在研發(fā)初期,可以為處理器架構(gòu)設(shè)計(jì)提供評(píng)估、分析系統(tǒng)瓶頸。在設(shè)計(jì)和驗(yàn)證階段,更精確的模型可以為硬件模型提供設(shè)計(jì)參考和驗(yàn)證比對(duì)。到用戶使用階段,指令集模擬器為軟硬件系統(tǒng)并行開發(fā)提供基礎(chǔ)。指令集模擬器按照模擬精確度分為指令精確 (Instruction Accurate)和周期精確 (Cycle Accurate) [1]。若需要精確模擬目標(biāo)處理器流水線行為,則必須實(shí)現(xiàn)周期精確模型。該文研究的目標(biāo)處理器是一款數(shù)據(jù)信號(hào)處理器(DSP),屬于計(jì)算密集的嵌入式處理器。通過分析指令的流水線行為可以優(yōu)化算法。因此本文研究的模型器是周期精確的。
1 VLIW架構(gòu)DSP建模技術(shù)
本文DSP采用超長指令字(Very Long Instruction Word,簡(jiǎn)稱VLIW)體系架構(gòu)。VLIW是提高指令級(jí)并行性的主要技術(shù)之一。VLIW處理器包含多個(gè)獨(dú)立的計(jì)算單元,具有同時(shí)執(zhí)行多條指令的能力。與超標(biāo)量多發(fā)射處理器不同,VLIW處理器的指令級(jí)并行性由軟件編譯器發(fā)掘。這就減小了硬件設(shè)計(jì)復(fù)雜度。編譯器采用靜態(tài)調(diào)度的方式將多條可以并行發(fā)射的指令,組裝為一條長指令,稱為指令束[2]。指令束中的指令必須滿足編程約束,由約束檢查器保證。該文DSP最大發(fā)射寬度為8指令字,即32bit至256bit。
本文DSP具備指令并行性高和計(jì)算性能強(qiáng)等特點(diǎn),屬于哈弗結(jié)構(gòu),采用獨(dú)立的程序空間和數(shù)據(jù)空間。指令集為RISC類型,指令字占用32bit,數(shù)據(jù)存儲(chǔ)器只能通過load/store指令訪問。從軟件模擬器建模角度分析,其硬件系統(tǒng)架構(gòu)如圖1所示。
硬件系統(tǒng)架構(gòu)如圖顯示,處理器具有4個(gè)完全相同的計(jì)算單元X、Y、Z、T。計(jì)算單元包含一組計(jì)算部件,由4個(gè)加法器(ALU)、2個(gè)乘法器(MUL)、2個(gè)移位器(SFT)和64個(gè)寄存器組成。每個(gè)計(jì)算單元只能使用自身的寄存器作為操作數(shù)。計(jì)算單元通過單元間寄存器賦值指令傳輸數(shù)據(jù)。為了提升訪存效率,處理器設(shè)計(jì)了專用的地址產(chǎn)生單元,它包括3個(gè)完全相同的地址產(chǎn)生器,能同時(shí)產(chǎn)生3個(gè)訪存地址供訪存指令使用,每個(gè)地址產(chǎn)生器具有16個(gè)地址寄存器。充足的計(jì)算部件和地址產(chǎn)生器提高了指令級(jí)并行性。
軟件模擬器有三個(gè)重要指標(biāo):精確度、性能、可擴(kuò)展性[3]。為了評(píng)估流水線性能、協(xié)同驗(yàn)證硬件流水線模型、指導(dǎo)用戶編寫盡可能少的數(shù)據(jù)相關(guān)匯編程序,該文模擬器必須設(shè)計(jì)周期級(jí)精確的流水線模型。性能主要指模擬器的指令模擬運(yùn)行速度,精度越高,速度越慢。對(duì)于運(yùn)行計(jì)算密集的大型測(cè)試程序,性能顯著影響驗(yàn)證效率??蓴U(kuò)展性反映模擬器的修改、重用難易程度。對(duì)于快速修改已有模擬器用于新處理器架構(gòu)評(píng)估情況,可擴(kuò)展性越好越易實(shí)現(xiàn)。三個(gè)指標(biāo)相互影響,設(shè)計(jì)時(shí)需要綜合考慮。該文設(shè)計(jì)目標(biāo)是達(dá)到周期級(jí)精確要求、采用優(yōu)化技術(shù)提升性能、提供較好可擴(kuò)展性滿足易于修改和重用的需求。
2 VLIW架構(gòu)模擬器設(shè)計(jì)
指令集模擬器建模,首先需要建立目標(biāo)處理器的狀態(tài)機(jī),每個(gè)時(shí)鐘周期都對(duì)應(yīng)確定狀態(tài),它主要由處理器的寄存器、存儲(chǔ)器體現(xiàn)。目標(biāo)處理器指令序列是狀態(tài)機(jī)的輸入,隨著每個(gè)時(shí)鐘周期的指令輸入,狀態(tài)機(jī)都有確定狀態(tài)輸出。再者,是組合邏輯建模。狀態(tài)機(jī)的變換過程是由組合邏輯完成的,如流水線各級(jí)的處理邏輯、計(jì)算部件的計(jì)算邏輯、程序控制模塊的控制邏輯等。該文設(shè)計(jì)周期級(jí)精確的流水線模型,指令流過流水線各級(jí)對(duì)狀態(tài)機(jī)影響都具有精確反映。譯碼模塊是影響模擬器性能的關(guān)鍵節(jié)點(diǎn),該文采用優(yōu)化技術(shù)重點(diǎn)優(yōu)化譯碼模塊。為了增強(qiáng)可擴(kuò)展性,采用面向?qū)ο笤O(shè)計(jì)技術(shù)和模塊化的設(shè)計(jì)思想構(gòu)建模擬器的軟件體系架構(gòu),使用C++高級(jí)語言實(shí)現(xiàn)模擬器。endprint
2.1 軟件模擬器架構(gòu)設(shè)計(jì)
模擬器軟件架構(gòu)與性能、可擴(kuò)展性緊密相關(guān),設(shè)計(jì)合理的架構(gòu)會(huì)提升性能、改善可擴(kuò)展性。根據(jù)硬件處理器結(jié)構(gòu),將模擬器按照功能劃分為若干模塊。軟件模擬器架構(gòu)如圖2所示。
CMD Interface為用戶命令行接口模塊,接收用戶參數(shù)。Program Memory、Data Memory和Register分別模擬程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器和寄存器。Unit模擬計(jì)算部件。Fetch為取指令模塊,從cache或程序存儲(chǔ)器取指令發(fā)射到流水線上執(zhí)行。Decode是指令束譯碼模塊。Predictor是分支預(yù)測(cè)模塊。controller是程序控制器。Pipeline為流水線模塊。Debug為調(diào)試驅(qū)動(dòng)模塊,接收調(diào)試器命令驅(qū)動(dòng)模擬器執(zhí)行,返回調(diào)試結(jié)果。Simulator Kernel即模擬器內(nèi)核,按照時(shí)鐘周期驅(qū)動(dòng)所有模塊運(yùn)行。根據(jù)目標(biāo)處理器建模需要,圖中有些模塊是可選的。每個(gè)模塊對(duì)外具有規(guī)范接口,易于集成和替換。下文詳細(xì)描述若干重要模塊設(shè)計(jì)。
2.2 流水線模型設(shè)計(jì)
流水線是提高指令并行性的重要技術(shù)之一,是處理器設(shè)計(jì)的核心。流水線是由若干流水段(Stage)串聯(lián)組成的。指令束執(zhí)行過程就是依次流過各流水段的過程。該文流水線包含7段,如圖3所示。
圖中灰色方框表示各流水段的狀態(tài)集,保存流水段信息,如流水段PC值,流水段指令束等。圖中的箭頭連線表示各段的處理邏輯。各段依次表示取指令、緩存指令、發(fā)射指令、譯碼、取操作數(shù)、執(zhí)行和寫回。數(shù)據(jù)相關(guān)會(huì)造成流水段停頓(stall),控制相關(guān)會(huì)操作流水段清空(flush)。流水段需要具有stall和flush屬性。流水段和流水線類型定義如圖4所示,其中Pipeline::addPipelineStage接口具有定制流水線功能,從而增強(qiáng)流水線的可擴(kuò)展性。
2.3 譯碼和計(jì)算部件設(shè)計(jì)
處理器在執(zhí)行指令束前,必須先對(duì)每個(gè)指令字譯碼。該文DSP譯碼位于流水線DC段。DC段處理邏輯調(diào)用Decode模塊實(shí)現(xiàn)譯碼。譯碼是根據(jù)指令編碼規(guī)則提取操作碼和操作數(shù)。操作碼掩碼和操作數(shù)掩碼體現(xiàn)編碼規(guī)則。操作碼掩碼是與指令等長、對(duì)應(yīng)操作碼位域?yàn)?、其它位為0的比特序列。操作數(shù)掩碼定義同理。同一指令可有多個(gè)操作數(shù)和操作數(shù)掩碼。該文使用指令索引號(hào)標(biāo)識(shí)每條指令。指令的編碼規(guī)則等信息使用Operator類型表示。
譯碼的關(guān)鍵是快速匹配指令字與Operator。該文采用基于決策森林的二進(jìn)制指令譯碼算法,實(shí)現(xiàn)高效譯碼。算法過程是先構(gòu)建由多棵決策樹組成的決策森林,給定指令字,依次遍歷每棵決策樹,直到找到匹配的操作碼葉子節(jié)點(diǎn)則返回成功,否則譯碼失敗。譯碼得到的信息保存在InstructionInfo中。Operator類型和InstructionInfo類型定義如圖5所示。
譯碼是模擬器執(zhí)行的關(guān)鍵路徑,優(yōu)化譯碼模塊對(duì)模擬器性能提升作用顯著。該文采用JIT-CCS(Just-in-time cache compiled simulation) [4]優(yōu)化技術(shù)提高譯碼效率。它借用cache原理,將已經(jīng)譯碼的指令信息保存在緩存中,若指令再次執(zhí)行,則直接使用譯碼信息,從而節(jié)約譯碼時(shí)間提高性能。為了獲取較好性能,該文實(shí)現(xiàn)一個(gè)大小為8M指令字的譯碼cache,使用LRU算法作為cache替換策略。
計(jì)算部件的行為可以抽象為給定輸入,經(jīng)過處理,返回唯一輸出,這與函數(shù)的特性一致。模擬器使用仿真函數(shù)模擬計(jì)算部件,每個(gè)指令都有對(duì)應(yīng)的仿真函數(shù)。為了快速定位指令仿真函數(shù),該文采用指令索引號(hào)直接映射仿真函數(shù)指針的方法,有效提升模擬器性能。
2.4 程序控制器設(shè)計(jì)
程序控制器主要作用是計(jì)算NextPC,即下一個(gè)取指令地址。一般情況下,取指模塊按照地址遞增順序取指令。但跳轉(zhuǎn)指令、子程序調(diào)用和返回指令、中斷響應(yīng)事件和中斷返回指令會(huì)改變程序流,它們是通過改變NextPC值實(shí)現(xiàn)的。跳轉(zhuǎn)指令、子程序調(diào)用和返回指令、中斷返回指令在改變程序流的同時(shí),需要清空流水線的某些段。如條件跳轉(zhuǎn)指令流到EX段時(shí),EX段之前的所有段都必須清空,NextPC修改為跳轉(zhuǎn)目的地址。取指模塊從跳轉(zhuǎn)目的地址處重新取指。當(dāng)程序控制器檢測(cè)到中斷請(qǐng)求時(shí),計(jì)算中斷是否被響應(yīng)。若響應(yīng),則修改NextPC為中斷處理函數(shù)地址,并清空EX段之前的所有段。改變程序流的指令對(duì)流水線性能影響較大,針對(duì)這類指令的設(shè)計(jì)優(yōu)化能顯著提高處理器性能。因此對(duì)它們進(jìn)行周期級(jí)精確模擬尤為重要。
2.5 調(diào)試模塊設(shè)計(jì)
模擬器調(diào)試模塊具有硬件調(diào)試仿真器和JTAG調(diào)試電路的功能,通過調(diào)試模塊可以實(shí)現(xiàn)多種調(diào)試功能,如讀寫寄存器、讀寫存儲(chǔ)器、斷點(diǎn)、運(yùn)行、單步等。調(diào)試模塊通過TCP/IP協(xié)議與軟件調(diào)試器通信,接收調(diào)試器命令,執(zhí)行命令,并向調(diào)試器返回執(zhí)行結(jié)果[5]。調(diào)試模塊提供的主要調(diào)試接口見表1。具備調(diào)試接口的模擬器與調(diào)試器集成形成完整平臺(tái),為盡早進(jìn)行軟硬件系統(tǒng)協(xié)同驗(yàn)證提供條件。
表1 調(diào)試功能接口
3 結(jié)束語
本文實(shí)現(xiàn)了一款VLIW架構(gòu)的、周期級(jí)精確的軟件模擬器。文中詳細(xì)講述了軟件架構(gòu)設(shè)計(jì),給出了流水線、譯碼和調(diào)試等關(guān)鍵模塊設(shè)計(jì)方法。通過對(duì)模擬器部分功能模塊的修改、替換,能快速適應(yīng)處理器設(shè)計(jì)變化,易于移植到新處理器。高效譯碼算法和JIT-CCS顯著提高了模擬器性能。為了進(jìn)一步提高運(yùn)行效率,模擬器程序的并行化運(yùn)行是下一步研究內(nèi)容。
參考文獻(xiàn):
[1] 嚴(yán)迎建,徐勁松.基于指令集模擬器的處理器建模與驗(yàn)證[J].計(jì)算機(jī)工程, 2008,34 (5):248-250.
[2] John L.Hennessy,David A.Patterson.Computer Architecture: A Quantitative Approach, Fourth Edition[M].Publishing House of Electronics Industry, 79-82.
[3] 許建衛(wèi),陳明宇.計(jì)算機(jī)體系結(jié)構(gòu)模擬器技術(shù)和發(fā)展[J].系統(tǒng)仿真學(xué)報(bào),2009, 21(20):6325-6331.
[4] Achim Nohl,Gunnar Braun etc.A universal Technique for fast and Flexible Instruction set Architecture simulation[C].Design Automation Conference, 2002.
[5] 邵作之,劉莉娟.基于SystemC 的ISS與軟件調(diào)試器集成方法分析[J].華北電力大學(xué)學(xué)報(bào),2006, 33(5):85-88.endprint
2.1 軟件模擬器架構(gòu)設(shè)計(jì)
模擬器軟件架構(gòu)與性能、可擴(kuò)展性緊密相關(guān),設(shè)計(jì)合理的架構(gòu)會(huì)提升性能、改善可擴(kuò)展性。根據(jù)硬件處理器結(jié)構(gòu),將模擬器按照功能劃分為若干模塊。軟件模擬器架構(gòu)如圖2所示。
CMD Interface為用戶命令行接口模塊,接收用戶參數(shù)。Program Memory、Data Memory和Register分別模擬程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器和寄存器。Unit模擬計(jì)算部件。Fetch為取指令模塊,從cache或程序存儲(chǔ)器取指令發(fā)射到流水線上執(zhí)行。Decode是指令束譯碼模塊。Predictor是分支預(yù)測(cè)模塊。controller是程序控制器。Pipeline為流水線模塊。Debug為調(diào)試驅(qū)動(dòng)模塊,接收調(diào)試器命令驅(qū)動(dòng)模擬器執(zhí)行,返回調(diào)試結(jié)果。Simulator Kernel即模擬器內(nèi)核,按照時(shí)鐘周期驅(qū)動(dòng)所有模塊運(yùn)行。根據(jù)目標(biāo)處理器建模需要,圖中有些模塊是可選的。每個(gè)模塊對(duì)外具有規(guī)范接口,易于集成和替換。下文詳細(xì)描述若干重要模塊設(shè)計(jì)。
2.2 流水線模型設(shè)計(jì)
流水線是提高指令并行性的重要技術(shù)之一,是處理器設(shè)計(jì)的核心。流水線是由若干流水段(Stage)串聯(lián)組成的。指令束執(zhí)行過程就是依次流過各流水段的過程。該文流水線包含7段,如圖3所示。
圖中灰色方框表示各流水段的狀態(tài)集,保存流水段信息,如流水段PC值,流水段指令束等。圖中的箭頭連線表示各段的處理邏輯。各段依次表示取指令、緩存指令、發(fā)射指令、譯碼、取操作數(shù)、執(zhí)行和寫回。數(shù)據(jù)相關(guān)會(huì)造成流水段停頓(stall),控制相關(guān)會(huì)操作流水段清空(flush)。流水段需要具有stall和flush屬性。流水段和流水線類型定義如圖4所示,其中Pipeline::addPipelineStage接口具有定制流水線功能,從而增強(qiáng)流水線的可擴(kuò)展性。
2.3 譯碼和計(jì)算部件設(shè)計(jì)
處理器在執(zhí)行指令束前,必須先對(duì)每個(gè)指令字譯碼。該文DSP譯碼位于流水線DC段。DC段處理邏輯調(diào)用Decode模塊實(shí)現(xiàn)譯碼。譯碼是根據(jù)指令編碼規(guī)則提取操作碼和操作數(shù)。操作碼掩碼和操作數(shù)掩碼體現(xiàn)編碼規(guī)則。操作碼掩碼是與指令等長、對(duì)應(yīng)操作碼位域?yàn)?、其它位為0的比特序列。操作數(shù)掩碼定義同理。同一指令可有多個(gè)操作數(shù)和操作數(shù)掩碼。該文使用指令索引號(hào)標(biāo)識(shí)每條指令。指令的編碼規(guī)則等信息使用Operator類型表示。
譯碼的關(guān)鍵是快速匹配指令字與Operator。該文采用基于決策森林的二進(jìn)制指令譯碼算法,實(shí)現(xiàn)高效譯碼。算法過程是先構(gòu)建由多棵決策樹組成的決策森林,給定指令字,依次遍歷每棵決策樹,直到找到匹配的操作碼葉子節(jié)點(diǎn)則返回成功,否則譯碼失敗。譯碼得到的信息保存在InstructionInfo中。Operator類型和InstructionInfo類型定義如圖5所示。
譯碼是模擬器執(zhí)行的關(guān)鍵路徑,優(yōu)化譯碼模塊對(duì)模擬器性能提升作用顯著。該文采用JIT-CCS(Just-in-time cache compiled simulation) [4]優(yōu)化技術(shù)提高譯碼效率。它借用cache原理,將已經(jīng)譯碼的指令信息保存在緩存中,若指令再次執(zhí)行,則直接使用譯碼信息,從而節(jié)約譯碼時(shí)間提高性能。為了獲取較好性能,該文實(shí)現(xiàn)一個(gè)大小為8M指令字的譯碼cache,使用LRU算法作為cache替換策略。
計(jì)算部件的行為可以抽象為給定輸入,經(jīng)過處理,返回唯一輸出,這與函數(shù)的特性一致。模擬器使用仿真函數(shù)模擬計(jì)算部件,每個(gè)指令都有對(duì)應(yīng)的仿真函數(shù)。為了快速定位指令仿真函數(shù),該文采用指令索引號(hào)直接映射仿真函數(shù)指針的方法,有效提升模擬器性能。
2.4 程序控制器設(shè)計(jì)
程序控制器主要作用是計(jì)算NextPC,即下一個(gè)取指令地址。一般情況下,取指模塊按照地址遞增順序取指令。但跳轉(zhuǎn)指令、子程序調(diào)用和返回指令、中斷響應(yīng)事件和中斷返回指令會(huì)改變程序流,它們是通過改變NextPC值實(shí)現(xiàn)的。跳轉(zhuǎn)指令、子程序調(diào)用和返回指令、中斷返回指令在改變程序流的同時(shí),需要清空流水線的某些段。如條件跳轉(zhuǎn)指令流到EX段時(shí),EX段之前的所有段都必須清空,NextPC修改為跳轉(zhuǎn)目的地址。取指模塊從跳轉(zhuǎn)目的地址處重新取指。當(dāng)程序控制器檢測(cè)到中斷請(qǐng)求時(shí),計(jì)算中斷是否被響應(yīng)。若響應(yīng),則修改NextPC為中斷處理函數(shù)地址,并清空EX段之前的所有段。改變程序流的指令對(duì)流水線性能影響較大,針對(duì)這類指令的設(shè)計(jì)優(yōu)化能顯著提高處理器性能。因此對(duì)它們進(jìn)行周期級(jí)精確模擬尤為重要。
2.5 調(diào)試模塊設(shè)計(jì)
模擬器調(diào)試模塊具有硬件調(diào)試仿真器和JTAG調(diào)試電路的功能,通過調(diào)試模塊可以實(shí)現(xiàn)多種調(diào)試功能,如讀寫寄存器、讀寫存儲(chǔ)器、斷點(diǎn)、運(yùn)行、單步等。調(diào)試模塊通過TCP/IP協(xié)議與軟件調(diào)試器通信,接收調(diào)試器命令,執(zhí)行命令,并向調(diào)試器返回執(zhí)行結(jié)果[5]。調(diào)試模塊提供的主要調(diào)試接口見表1。具備調(diào)試接口的模擬器與調(diào)試器集成形成完整平臺(tái),為盡早進(jìn)行軟硬件系統(tǒng)協(xié)同驗(yàn)證提供條件。
表1 調(diào)試功能接口
3 結(jié)束語
本文實(shí)現(xiàn)了一款VLIW架構(gòu)的、周期級(jí)精確的軟件模擬器。文中詳細(xì)講述了軟件架構(gòu)設(shè)計(jì),給出了流水線、譯碼和調(diào)試等關(guān)鍵模塊設(shè)計(jì)方法。通過對(duì)模擬器部分功能模塊的修改、替換,能快速適應(yīng)處理器設(shè)計(jì)變化,易于移植到新處理器。高效譯碼算法和JIT-CCS顯著提高了模擬器性能。為了進(jìn)一步提高運(yùn)行效率,模擬器程序的并行化運(yùn)行是下一步研究內(nèi)容。
參考文獻(xiàn):
[1] 嚴(yán)迎建,徐勁松.基于指令集模擬器的處理器建模與驗(yàn)證[J].計(jì)算機(jī)工程, 2008,34 (5):248-250.
[2] John L.Hennessy,David A.Patterson.Computer Architecture: A Quantitative Approach, Fourth Edition[M].Publishing House of Electronics Industry, 79-82.
[3] 許建衛(wèi),陳明宇.計(jì)算機(jī)體系結(jié)構(gòu)模擬器技術(shù)和發(fā)展[J].系統(tǒng)仿真學(xué)報(bào),2009, 21(20):6325-6331.
[4] Achim Nohl,Gunnar Braun etc.A universal Technique for fast and Flexible Instruction set Architecture simulation[C].Design Automation Conference, 2002.
[5] 邵作之,劉莉娟.基于SystemC 的ISS與軟件調(diào)試器集成方法分析[J].華北電力大學(xué)學(xué)報(bào),2006, 33(5):85-88.endprint
2.1 軟件模擬器架構(gòu)設(shè)計(jì)
模擬器軟件架構(gòu)與性能、可擴(kuò)展性緊密相關(guān),設(shè)計(jì)合理的架構(gòu)會(huì)提升性能、改善可擴(kuò)展性。根據(jù)硬件處理器結(jié)構(gòu),將模擬器按照功能劃分為若干模塊。軟件模擬器架構(gòu)如圖2所示。
CMD Interface為用戶命令行接口模塊,接收用戶參數(shù)。Program Memory、Data Memory和Register分別模擬程序存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器和寄存器。Unit模擬計(jì)算部件。Fetch為取指令模塊,從cache或程序存儲(chǔ)器取指令發(fā)射到流水線上執(zhí)行。Decode是指令束譯碼模塊。Predictor是分支預(yù)測(cè)模塊。controller是程序控制器。Pipeline為流水線模塊。Debug為調(diào)試驅(qū)動(dòng)模塊,接收調(diào)試器命令驅(qū)動(dòng)模擬器執(zhí)行,返回調(diào)試結(jié)果。Simulator Kernel即模擬器內(nèi)核,按照時(shí)鐘周期驅(qū)動(dòng)所有模塊運(yùn)行。根據(jù)目標(biāo)處理器建模需要,圖中有些模塊是可選的。每個(gè)模塊對(duì)外具有規(guī)范接口,易于集成和替換。下文詳細(xì)描述若干重要模塊設(shè)計(jì)。
2.2 流水線模型設(shè)計(jì)
流水線是提高指令并行性的重要技術(shù)之一,是處理器設(shè)計(jì)的核心。流水線是由若干流水段(Stage)串聯(lián)組成的。指令束執(zhí)行過程就是依次流過各流水段的過程。該文流水線包含7段,如圖3所示。
圖中灰色方框表示各流水段的狀態(tài)集,保存流水段信息,如流水段PC值,流水段指令束等。圖中的箭頭連線表示各段的處理邏輯。各段依次表示取指令、緩存指令、發(fā)射指令、譯碼、取操作數(shù)、執(zhí)行和寫回。數(shù)據(jù)相關(guān)會(huì)造成流水段停頓(stall),控制相關(guān)會(huì)操作流水段清空(flush)。流水段需要具有stall和flush屬性。流水段和流水線類型定義如圖4所示,其中Pipeline::addPipelineStage接口具有定制流水線功能,從而增強(qiáng)流水線的可擴(kuò)展性。
2.3 譯碼和計(jì)算部件設(shè)計(jì)
處理器在執(zhí)行指令束前,必須先對(duì)每個(gè)指令字譯碼。該文DSP譯碼位于流水線DC段。DC段處理邏輯調(diào)用Decode模塊實(shí)現(xiàn)譯碼。譯碼是根據(jù)指令編碼規(guī)則提取操作碼和操作數(shù)。操作碼掩碼和操作數(shù)掩碼體現(xiàn)編碼規(guī)則。操作碼掩碼是與指令等長、對(duì)應(yīng)操作碼位域?yàn)?、其它位為0的比特序列。操作數(shù)掩碼定義同理。同一指令可有多個(gè)操作數(shù)和操作數(shù)掩碼。該文使用指令索引號(hào)標(biāo)識(shí)每條指令。指令的編碼規(guī)則等信息使用Operator類型表示。
譯碼的關(guān)鍵是快速匹配指令字與Operator。該文采用基于決策森林的二進(jìn)制指令譯碼算法,實(shí)現(xiàn)高效譯碼。算法過程是先構(gòu)建由多棵決策樹組成的決策森林,給定指令字,依次遍歷每棵決策樹,直到找到匹配的操作碼葉子節(jié)點(diǎn)則返回成功,否則譯碼失敗。譯碼得到的信息保存在InstructionInfo中。Operator類型和InstructionInfo類型定義如圖5所示。
譯碼是模擬器執(zhí)行的關(guān)鍵路徑,優(yōu)化譯碼模塊對(duì)模擬器性能提升作用顯著。該文采用JIT-CCS(Just-in-time cache compiled simulation) [4]優(yōu)化技術(shù)提高譯碼效率。它借用cache原理,將已經(jīng)譯碼的指令信息保存在緩存中,若指令再次執(zhí)行,則直接使用譯碼信息,從而節(jié)約譯碼時(shí)間提高性能。為了獲取較好性能,該文實(shí)現(xiàn)一個(gè)大小為8M指令字的譯碼cache,使用LRU算法作為cache替換策略。
計(jì)算部件的行為可以抽象為給定輸入,經(jīng)過處理,返回唯一輸出,這與函數(shù)的特性一致。模擬器使用仿真函數(shù)模擬計(jì)算部件,每個(gè)指令都有對(duì)應(yīng)的仿真函數(shù)。為了快速定位指令仿真函數(shù),該文采用指令索引號(hào)直接映射仿真函數(shù)指針的方法,有效提升模擬器性能。
2.4 程序控制器設(shè)計(jì)
程序控制器主要作用是計(jì)算NextPC,即下一個(gè)取指令地址。一般情況下,取指模塊按照地址遞增順序取指令。但跳轉(zhuǎn)指令、子程序調(diào)用和返回指令、中斷響應(yīng)事件和中斷返回指令會(huì)改變程序流,它們是通過改變NextPC值實(shí)現(xiàn)的。跳轉(zhuǎn)指令、子程序調(diào)用和返回指令、中斷返回指令在改變程序流的同時(shí),需要清空流水線的某些段。如條件跳轉(zhuǎn)指令流到EX段時(shí),EX段之前的所有段都必須清空,NextPC修改為跳轉(zhuǎn)目的地址。取指模塊從跳轉(zhuǎn)目的地址處重新取指。當(dāng)程序控制器檢測(cè)到中斷請(qǐng)求時(shí),計(jì)算中斷是否被響應(yīng)。若響應(yīng),則修改NextPC為中斷處理函數(shù)地址,并清空EX段之前的所有段。改變程序流的指令對(duì)流水線性能影響較大,針對(duì)這類指令的設(shè)計(jì)優(yōu)化能顯著提高處理器性能。因此對(duì)它們進(jìn)行周期級(jí)精確模擬尤為重要。
2.5 調(diào)試模塊設(shè)計(jì)
模擬器調(diào)試模塊具有硬件調(diào)試仿真器和JTAG調(diào)試電路的功能,通過調(diào)試模塊可以實(shí)現(xiàn)多種調(diào)試功能,如讀寫寄存器、讀寫存儲(chǔ)器、斷點(diǎn)、運(yùn)行、單步等。調(diào)試模塊通過TCP/IP協(xié)議與軟件調(diào)試器通信,接收調(diào)試器命令,執(zhí)行命令,并向調(diào)試器返回執(zhí)行結(jié)果[5]。調(diào)試模塊提供的主要調(diào)試接口見表1。具備調(diào)試接口的模擬器與調(diào)試器集成形成完整平臺(tái),為盡早進(jìn)行軟硬件系統(tǒng)協(xié)同驗(yàn)證提供條件。
表1 調(diào)試功能接口
3 結(jié)束語
本文實(shí)現(xiàn)了一款VLIW架構(gòu)的、周期級(jí)精確的軟件模擬器。文中詳細(xì)講述了軟件架構(gòu)設(shè)計(jì),給出了流水線、譯碼和調(diào)試等關(guān)鍵模塊設(shè)計(jì)方法。通過對(duì)模擬器部分功能模塊的修改、替換,能快速適應(yīng)處理器設(shè)計(jì)變化,易于移植到新處理器。高效譯碼算法和JIT-CCS顯著提高了模擬器性能。為了進(jìn)一步提高運(yùn)行效率,模擬器程序的并行化運(yùn)行是下一步研究內(nèi)容。
參考文獻(xiàn):
[1] 嚴(yán)迎建,徐勁松.基于指令集模擬器的處理器建模與驗(yàn)證[J].計(jì)算機(jī)工程, 2008,34 (5):248-250.
[2] John L.Hennessy,David A.Patterson.Computer Architecture: A Quantitative Approach, Fourth Edition[M].Publishing House of Electronics Industry, 79-82.
[3] 許建衛(wèi),陳明宇.計(jì)算機(jī)體系結(jié)構(gòu)模擬器技術(shù)和發(fā)展[J].系統(tǒng)仿真學(xué)報(bào),2009, 21(20):6325-6331.
[4] Achim Nohl,Gunnar Braun etc.A universal Technique for fast and Flexible Instruction set Architecture simulation[C].Design Automation Conference, 2002.
[5] 邵作之,劉莉娟.基于SystemC 的ISS與軟件調(diào)試器集成方法分析[J].華北電力大學(xué)學(xué)報(bào),2006, 33(5):85-88.endprint