劉少龍
(海裝重慶局,四川成都 610100)
隨著微處理器性能的不斷增長,尤其是近年來多核處理器的異軍突起,使得外存系統(tǒng)成為整個片上系統(tǒng)(System -on -Chip,SoC)的性能瓶頸[1]。提高片內(nèi)總線的利用效率,降低外部存儲器訪問延遲,是片上系統(tǒng)設(shè)計中的重要內(nèi)容。
設(shè)計為一款SoC設(shè)計能訪問控制片外RAM與ROM的存儲控制器IP軟核,也可用于在不同嵌入式系統(tǒng)中重復(fù)利用。其中,片上總線為功能各異的IP核提供了統(tǒng)一接口標(biāo)準(zhǔn),通過總線協(xié)議將不同的IP核集成在一塊芯片上,從而構(gòu)成了一個完整的片上系統(tǒng)。設(shè)計采用目前業(yè)界主流的AMBA總線作為接口標(biāo)準(zhǔn),完成了一款對外部RAM和ROM高效訪問的存儲控制器。
當(dāng)前,基于IP復(fù)用的SoC設(shè)計技術(shù)業(yè)已成為IC設(shè)計的主流方法,而可復(fù)用設(shè)計技術(shù)的核心在于選擇高效、靈活、易擴展的片上總線(On-Chip Bus,OCB)標(biāo)準(zhǔn)[2]。AMBA(Advanced Microcontroller Bus Architecture)總線即為一款由 ARM公司推出并構(gòu)建以ARM處理器為核心的SoC片上互連標(biāo)準(zhǔn)。由于ARM微處理器在嵌入式領(lǐng)域占絕對市場優(yōu)勢,AMBA協(xié)議已成為事實上的SoC總線標(biāo)準(zhǔn)。雖然AMBA協(xié)議歷經(jīng)演化,但其核心均立足于AMBA2.0標(biāo)準(zhǔn),至今該協(xié)議仍應(yīng)用于諸多高性能SoC產(chǎn)品中,例如歐空局使用的單核Leon3 以及多核Leon4 中[3-4]。AMBA2.0 定義了兩組總線:高級高性能總線(Advanced Highperformance Bus,AHB)和高級外設(shè)總線(Advanced Peripheral Bus,APB),這兩種總線的性能描述,如表1所示。
表1 AMBA2.0總線性能描述
圖1描述了基于AMBA總線的存儲控制器結(jié)構(gòu)示意圖。從所處的總線層次而言,存儲控制器分為控制核心以及配置管理單元兩部分。控制核心掛接于AHB總線上,其作用是完成處理器通過AHB總線發(fā)布對片外RAM和ROM的讀寫訪問,其功能結(jié)構(gòu)可分為3部分:AHB從機接口單元,命令/數(shù)據(jù)緩存單元和外部存儲器接口單元。AHB從機接口單元用于鎖存AHB總線的訪問命令,并對讀寫訪問進行區(qū)分。對于讀訪問,該接口將讀命令注入命令/數(shù)據(jù)緩存單元,并根據(jù)配置管理單元設(shè)定的時序信息將讀數(shù)據(jù)返回傳送到AHB總線;對于寫訪問,區(qū)別僅在于將流水化的地址和寫數(shù)據(jù)分別注入對應(yīng)緩存中。命令/數(shù)據(jù)緩存單元是提高訪存性能的關(guān)鍵,其中命令與寫數(shù)據(jù)FIFO用于提前應(yīng)答總線,通過減少處理器流水線的停頓從而提高寫操作的訪問延遲,讀數(shù)據(jù)FIFO一方面實現(xiàn)數(shù)據(jù)預(yù)取,另一方面用于減少原子操作和“讀-修改-寫”操作的寄生延遲,從而提高了存儲控制器的訪問效率。外部存儲器接口單元主要用于產(chǎn)生RAM和ROM的讀寫控制時序,根據(jù)配置管理單元提供的時序參數(shù)組織訪問過程中的setup、strobe和hold周期,同時精確控制芯片的雙向數(shù)據(jù)PAD的方向轉(zhuǎn)換,避免數(shù)據(jù)沖突。
圖1 存儲控制器結(jié)構(gòu)框圖
配置管理單元掛接于APB總線上,用于在系統(tǒng)初始化時設(shè)置外存位寬、容量分配、等待周期以及模式控制等。在系統(tǒng)初始化完成之前,所有配置值采用默認(rèn)值完成基本指令操作;在初始化設(shè)置完畢后,所有的訪存操作均以更新值進行指令獲取與數(shù)據(jù)的訪問。由于APB總線設(shè)備的訪問頻率較低,因此APB總線的工作時鐘低于AHB時鐘,因此能降低諸如配置管理單元等從設(shè)備的動態(tài)功耗。
AHB從機接口重點描述讀寫時序遵循的狀態(tài)遷移過程,命令/數(shù)據(jù)緩存將給出為提高原子訪問和半字/字節(jié)寫操作效率而設(shè)計的控制邏輯,外部存儲接口主要描述跨時鐘域的解決辦法,并最終給出配置管理單元的基本設(shè)置。
AHB從機接口主要用于接收處理器通過AHB發(fā)出的讀寫訪問命令和寫數(shù)據(jù),并按照協(xié)議返回訪問應(yīng)答及讀數(shù)據(jù)。由于該接口主要用于與AHB時序適配,因此其設(shè)計結(jié)構(gòu)可通過狀態(tài)機進行描述,圖2為AHB從機接口的狀態(tài)遷移圖。
圖2 AHB從機接口狀態(tài)機
AHB從機接口在復(fù)位或空閑時處于IDLE狀態(tài);當(dāng)AHB總線發(fā)出該從機的選通信號hsel后,立即進入CMD_START狀態(tài)。在該狀態(tài)下,從機接口鎖存同周期的總線地址和訪問控制信號,并向總線拉低hready信號以阻塞后續(xù)的處理器訪問,同時本周期進行初級地址譯碼,通過高位地址區(qū)分出訪問對象為RAM或ROM,并根據(jù)讀寫類型轉(zhuǎn)入讀等待狀態(tài)(RAM_RD_WAIT/ROM_RD_WAIT)或?qū)懙却隣顟B(tài)(RAM_WR_WAIT);讀等待狀態(tài)下,RAM和ROM的操作基本相同,即根據(jù)配置管理單元設(shè)置的時間信息形成各自的訪問等待時序,唯一不同在于RAM固定為32位與AHB數(shù)據(jù)總線匹配,而ROM的位寬可以為8、16或32這3種類型,因此當(dāng)ROM位寬為非32位時,總線的一次32位字訪問將在本狀態(tài)下拆分為多次外存訪問,當(dāng)最后一個子數(shù)據(jù)返回時,本狀態(tài)將所有子數(shù)據(jù)拼接為一個完整32位讀數(shù)據(jù)返回總線;寫等待狀態(tài)下,從機接口將分兩周期鎖存AHB流水化的地址和寫數(shù)據(jù),并建立寫地址和寫數(shù)據(jù)相對寫使能的 setup、strobe和hold階段,對于寫字節(jié)/半字操作,狀態(tài)機將先從讀等待狀態(tài)將整字?jǐn)?shù)據(jù)讀出后切換至寫等待狀態(tài),完成對應(yīng)寫數(shù)據(jù)的修改后執(zhí)行全字寫;若在讀等待和寫等待狀態(tài)下檢測到總線上有突發(fā)傳輸,將直接進入到對應(yīng)的讀突發(fā)狀態(tài)(RD_SEQ)和寫突發(fā)狀態(tài)(WR_SEQ)下,從而避免了切換回空閑態(tài)而造成的性能損失。由于突發(fā)傳輸下AHB總線仲裁器具有鎖定主機總線占有權(quán)的特點,因而控制器可直接組織對存儲器的不間斷讀寫訪問,進而減少了訪問延遲;當(dāng)傳輸完畢且無總線訪問時,狀態(tài)返回IDLE態(tài)。
系統(tǒng)的核心處理器采用32位RISC指令集,因此其內(nèi)部總線以及AHB總線位寬均為32位。系統(tǒng)中外存儲器主要包括ROM和RAM,ROM存放處理器運行的指令,其位寬可以是8、16或32位,而處理過程中產(chǎn)生的數(shù)據(jù)則存放于固定32位的RAM中。命令/數(shù)據(jù)緩存作為設(shè)計的關(guān)鍵部件,用于降低多種訪存操作因位寬不匹配而造成的訪問延遲,這些操作包括:指令獲取,寫操作以及原子操作。
指令獲取主要針對ROM位寬為8位和16位兩種情況。AHB總線發(fā)出的一次指令讀取操作需要完整的32位指令碼,因此需存儲控制器能將一次AHB讀操作拆分為多次存儲訪問。為此,命令/數(shù)據(jù)緩存中專門設(shè)置了位寬為8的讀緩存,如圖3所示。其用于配合AHB從機接口發(fā)出的連續(xù)讀時序,用以緩存從ROM讀取的以8 bit為單位的指令字段。當(dāng)每段指令碼片段返回時,均由拼接邏輯進行移位,并在最后一個指令片段返回時拼接為一條完整的32位指令碼返回總線。
寫操作針對外部RAM,分為寫字和寫字節(jié)/半字兩類操作。針對AHB協(xié)議而言,讀操作需讀數(shù)據(jù)返回才能推動總線流水,但對于寫操作,可采用寫緩存的方式提前推動流水而降低處理器的停頓。為此,命令/數(shù)據(jù)緩存中增加了位寬為32的寫緩存,如圖3所示。其用以鎖存總線上針對RAM的寫操作。當(dāng)處理器進行取指操作或?qū)ν庠O(shè)進行訪問時,寫緩存可并行執(zhí)行對RAM的寫,從而降低寫操作的訪問延遲。對于寫字節(jié)/半字操作,本設(shè)計將采用“讀-修改-寫”(Read-Modify-Write,RMW)的方式,利用讀緩存將整字?jǐn)?shù)據(jù)讀出,并在修改邏輯中進行局部數(shù)據(jù)的改寫,然后依靠寫緩存完成最終數(shù)據(jù)的寫入。該種設(shè)計方案不僅能提前使能總線流水,同時也可保證RAM的連續(xù)讀寫時序,降低了訪問的中間延遲。
圖3 命令/數(shù)據(jù)緩存結(jié)構(gòu)圖
原子操作在多核結(jié)構(gòu)下能用來進行同步操作[5]。設(shè)計使用的處理器可發(fā)出LDSTUB原子指令,用于讀取RAM中1個數(shù)據(jù)字,然后向該數(shù)據(jù)地址寫入1 Byte數(shù)據(jù)。從總線角度而言,該條指令將發(fā)起讀字和寫字節(jié)兩次總線訪問,同時第2個寫字節(jié)還需執(zhí)行RMW訪問操作,這將降低同步操作的訪問效率。為此,本設(shè)計利用了原子操作中發(fā)出的總線lock信號,當(dāng)讀緩存在等待RAM返回讀數(shù)據(jù)時檢測到該鎖定信號,則會將讀數(shù)據(jù)返回AHB的同時鎖入臨時寄存器,同時復(fù)用RMW的數(shù)據(jù)路徑完成第2 Byte的修改,并立即寫入RAM。該種設(shè)計結(jié)構(gòu)可避免第2次寫字節(jié)操作產(chǎn)生的冗余讀操作,從而減少了一次RAM讀操作的等待延遲。
存儲控制器的控制核心擁有AHB時鐘域和外存時鐘域兩個時鐘域,其中外部存儲接口工作于外存時鐘域下,該設(shè)計的優(yōu)點在于當(dāng)系統(tǒng)處于休眠模式時,可降低或關(guān)閉該部分邏輯的工作時鐘,以降低部分動態(tài)功耗。不同時鐘域之間將產(chǎn)生同步問題,數(shù)據(jù)同步在文中依靠讀寫緩存予以解決,而對于控制信號的同步則采用如圖4所示的雙級Flip-Flop結(jié)構(gòu)解決。
圖4 跨時鐘域同步電路
控制信號先由AHB時鐘域進行首次鎖存,然后在外存時鐘域下進行了兩周期的同步操作。這是由于第一級寄存器的采樣時刻不能保證該信號的建立保持時間,故可能造成亞穩(wěn)態(tài),若該狀態(tài)未加以解決而傳遞至后續(xù)邏輯,可能造成系統(tǒng)工作狀態(tài)紊亂。因此,需第2級寄存器再次對該信號進行同步,從而恢復(fù)至正確的信號電平。
配置管理單元主要包括控制寄存器和時間寄存器。控制寄存器用于指示外部ROM的位寬、ROM與RAM的空間容量及RMW模式是否開啟。由于包括配置該寄存器的指令均存放于外部ROM,因此必須在系統(tǒng)復(fù)位后立即確定 ROM的位寬。為此,在芯片PAD處增加了ROM位寬指示信號,用于在復(fù)位期間確定ROM位寬,保證讀取首條指令的正確性??臻g容量用于外部存儲接口進行地址譯碼,以區(qū)分出當(dāng)前AHB地址訪問的存儲對象。時間寄存器一方面用以配合外部存儲器的訪問時序,另一方面可計算AHB總線的阻塞延遲時間。
由于該寄存器的參數(shù)設(shè)置對存儲訪問至關(guān)重要,因此要求初始化程序首先配置相應(yīng)參數(shù),防止出現(xiàn)系統(tǒng)訪問錯誤并提高訪問效率。
設(shè)計采用VHDL代碼完成RTL級結(jié)構(gòu)設(shè)計,兼容AMBA2.0總線標(biāo)準(zhǔn),并滿足通用存儲器的訪存時序要求。為驗證此設(shè)計的時序是否滿足預(yù)先設(shè)定的目標(biāo),在此首先利用 Xilinx Virtex-4系列的 xc4vsx35型FPGA對本設(shè)計進行綜合[6]。綜合以速度為優(yōu)化目標(biāo),其綜合結(jié)果顯示,該設(shè)計共使用533個Slices,698個寄存器,最大組合邏輯延遲為7.31 ns,最高主頻可達195 MHz,滿足系統(tǒng)設(shè)計的150 MHz目標(biāo)要求。
為驗證該存儲控制器的功能正確性,將存儲控制器置于一個包含有32位RISC處理器、AHB和APB總線的最小系統(tǒng)中,外接8位ROM和32位RAM模型。仿真工具利用ISE自帶仿真的ISE Simulator,所有運行的程序均編譯后存貯于ROM中,其部分仿真波形如圖5所示。
圖5 原子操作仿真波形
波形顯示為具有代表性的原子操作,該原子操作包括了讀操作和寫操作,同時調(diào)用了內(nèi)部的讀寫緩存實現(xiàn)了字節(jié)的“讀-修改-寫”。可看出,當(dāng)AHB發(fā)出原子操作時,總線上拉起lock信號。AHB發(fā)出的第一次讀操作經(jīng)過一個AHB時鐘域鎖存和兩個外存時鐘域的同步后,即產(chǎn)生了RAM的片選信號。當(dāng)RAM讀數(shù)據(jù)返回后,hready信號第一次拉高以返回該讀數(shù)據(jù)。同時可看到,RAM的片選仍有效,這將有利于縮短重新發(fā)起第二次寫操作的建立時間。當(dāng)AHB接收到返回讀數(shù)據(jù)的同時,控制器立即鎖存將要改寫的字節(jié)數(shù)據(jù),此時無需再次發(fā)起讀操作,直接利用內(nèi)部讀FIFO鎖存的數(shù)據(jù)進行改寫??煽闯觯贏HB發(fā)出寫字節(jié)操作后不久,RAM即可接收到修改后的寫數(shù)據(jù)。仿真結(jié)果表明,設(shè)計的存儲控制器實現(xiàn)了預(yù)期總線時序與存儲訪問時序[7-8]。
采用VHDL語言設(shè)計了一款兼容AHB總線協(xié)議的存儲控制器軟核。該控制器的主要優(yōu)勢在于利用AHB的訪問特點,從而縮短外存的讀寫訪問時長,主要體現(xiàn)在3個方面:(1)對于外部位寬小于AHB總線位寬的指令獲取,內(nèi)部采用讀FIFO進行數(shù)據(jù)移位與拼接,減少狀態(tài)切換插入的等待時長。(2)對于總線寫操作,采用寫FIFO進行命令與寫數(shù)據(jù)的緩存,并提前對總線應(yīng)答,減少了處理器流水線的停頓。(3)對于處理器發(fā)出的原子操作,通過內(nèi)部讀寫FIFO的相互配合,減小了存儲器的重復(fù)訪問,縮短了原子操作的等待時間。仿真結(jié)果表明,該控制器能夠與AMBA系統(tǒng)其它IP形成最小系統(tǒng),功能與時序符合預(yù)期目標(biāo)。
[1]Chang JL,Onur M,Veynu N,et al.Prefetch - aware memory controllers[J].IEEE Transaction on Computers,2011,60(10):1406-1430.
[2]張麗媛,章軍,陳新華.三種SoC片上總線的分析與比較[J].山東科技大學(xué)學(xué)報:自然科學(xué)版,2005,24(2):65-69.
[3]Aeroflex Gaisler.Dual- core Leon3 - FT SPARC V8 processor GR712RC data sheet[M].USA:Aeroflex Gaisler,2014.
[4]Aeroflex Gaisler.Quad - core Leon4 SPARC V8 processor Leon4-N2X data sheet and user's manual[M].USA:Aeroflex Gaisler,2013.
[5]Xiaowen C,Shuming C,Zhonghai L,et al.Cooperative communication based barrier synchronization in on-chip mesh architectures[J].IEICE Electronic Express,2011,8(22):1856-1862.
[6]Xilinx Conpration.UG070 Virtex-4 user guide[M].USA:Xilinx Conpration,2007.
[7]楊海濤,蘇濤,巫幪.基于FPGA的SDRAM控制器的設(shè)計和實現(xiàn)[J].電子科技,2007,20(1):8 -12.
[8]陳明義,連帥軍,周建國.基于FPGA的FLASH控制器系統(tǒng)設(shè)計及實現(xiàn)[J].電子科技,2008,21(7):11-16.