基于FPGA的原型能為您做些什么
掃描二維碼
隨時(shí)隨地手機(jī)看文章
基于FPGA的原型可滿足不同目的需求
原型設(shè)計(jì)不是一個(gè)按幾個(gè)按鈕就能完成的過程,在它不同的階段需要仔細(xì)的關(guān)注和思考。除說明這個(gè)過程需要完成的工作和涉及到的專業(yè)知識外,我們還應(yīng)解釋在 SoC 項(xiàng)目中該進(jìn)行(或者不該進(jìn)行)原型設(shè)計(jì)的原因。
在與原型設(shè)計(jì)人員多年交談中,我們最常問到的一個(gè)問題是“為什么您這么做?”答案有多種多樣,我們把它們總結(jié)成了表1中幾條常見的理由。系統(tǒng)了解這些項(xiàng)目的目的和我們進(jìn)行原型設(shè)計(jì)的原因,將有助于我們判斷基于FPGA的原型設(shè)計(jì)是否能為我們的下一個(gè)項(xiàng)目提供幫助。
因此,讓我們探究一下表1所述的目的以及基于FPGA的原型方法如何能幫助實(shí)現(xiàn)這些目的。
高性能與準(zhǔn)確度
只有基于FPGA的原型才能提供正確測試設(shè)計(jì)各個(gè)方面所需的速度和準(zhǔn)確度。我們把這個(gè)理由放在首位的原因是,雖然項(xiàng)目有許多需要實(shí)現(xiàn)的給定目的,但對需要進(jìn)行原型設(shè)計(jì)的團(tuán)隊(duì)來說,這可能是所有理由中最根本的原因。舉例來說,這個(gè)團(tuán)隊(duì)的目的可能是驗(yàn)證某些SoC的嵌入式軟件,觀察其在真實(shí)硬件上全速運(yùn)行的情況,但使用原型的根本原因是為了確保高性能與準(zhǔn)確度。我們在虛擬系統(tǒng)中可以在更高的性能水平下驗(yàn)證該軟件,但我們無法達(dá)到使用真實(shí)的RTL所能實(shí)現(xiàn)的準(zhǔn)確度。
實(shí)時(shí)數(shù)據(jù)流
難以驗(yàn)證SoC的原因之一是因?yàn)槠錉顟B(tài)取決于許多變量,包括其之前的狀態(tài)、輸入的次序以及更廣泛的SoC輸出系統(tǒng)效應(yīng)(以及可能的反饋)。將SoC設(shè)計(jì)與系統(tǒng)的其他部分相連并以實(shí)時(shí)速度運(yùn)行,可以讓我們立即觀察到實(shí)時(shí)條件、輸入和系統(tǒng)反饋的變化帶來的效應(yīng)。
葡萄牙波爾圖市Synopsys公司IP團(tuán)隊(duì)開發(fā)的HDMI原型中的實(shí)時(shí)數(shù)據(jù)流就是一個(gè)很好的例子。在本例中,高清(HD)媒體數(shù)據(jù)流經(jīng)處理內(nèi)核的原型輸出到高清顯示器上,如圖1的方框圖所示。
圖1 HDMI 原型方框圖
通過使用投片前的原型,我們可以立即看到和聽到不同的高清數(shù)據(jù)在我們的設(shè)計(jì)上的效果,反之亦然。只有采用基于FPGA的原型方法才支持這種實(shí)時(shí)數(shù)據(jù)流,不僅給此類多媒體應(yīng)用帶來極大好處,也能給許多其他要求對輸入數(shù)據(jù)流做出實(shí)時(shí)響應(yīng)的應(yīng)用帶來諸多裨益。
軟硬件集成
在上述實(shí)例中,讀者可能已經(jīng)注意到原型使用了一塊小型MicroBlazeTM CPU,并備有外設(shè)和存儲(chǔ)器,從而體現(xiàn)了一個(gè) SoC的所有常見模塊。在這個(gè)設(shè)計(jì)中,運(yùn)行在CPU上的軟件主要用于加載和控制A/V處理。然而,在許多SoC設(shè)計(jì)中,軟件最耗精力。
鑒于軟件已成為SoC開發(fā)工作的主體部分,軟件工作在項(xiàng)目日程中占據(jù)關(guān)鍵位置越來越常見。當(dāng)SoC能夠有效達(dá)到量產(chǎn)標(biāo)準(zhǔn)的時(shí)候,決定項(xiàng)目實(shí)際完成日期的是軟件開發(fā)和驗(yàn)證工作。在這種情況下,系統(tǒng)開發(fā)團(tuán)隊(duì)如何才能提升軟件開發(fā)和驗(yàn)證工作的效率呢?要回答這個(gè)問題,我們需要查看軟件開發(fā)團(tuán)隊(duì)把時(shí)間都花在什么地方。
為軟件開發(fā)建立SoC的模型
軟件由于自身的復(fù)雜性,很難做到完美。對我們在日常使用計(jì)算機(jī)的過程中遇到的軟件升級、服務(wù)包和漏洞修補(bǔ)的情況,我們都已經(jīng)司空見慣。但是,具體到嵌入 SoC 中的軟件,這種無休止的軟件改進(jìn)方法就遇到了障礙。另一方面,相比于通用的計(jì)算機(jī)軟件而言,與嵌入式軟件互動(dòng)的系統(tǒng),其設(shè)定的使用模式和環(huán)境條件都更容易確定。而且,為較簡單的系統(tǒng)開發(fā)的嵌入式軟件可以比較簡單,也就更易于全面驗(yàn)證。舉例來說,控制車輛子系統(tǒng)或電子玩具的SoC比在實(shí)時(shí)操作系統(tǒng)(RTOS)上運(yùn)行許多應(yīng)用和流程的智能手機(jī)更容易進(jìn)行全面測試。
如果我們更加仔細(xì)地觀察運(yùn)行在這類智能手機(jī)上的軟件,例如圖2所示的Android軟件,我們可以看到一種多層布置,這稱為軟件協(xié)議棧。
圖2 Android軟件協(xié)議棧
在觀察軟件協(xié)議棧時(shí),我們會(huì)發(fā)現(xiàn),協(xié)議棧的最底層——也就是那些最接近硬件的部分,主要是為了滿足將軟件映射到SoC硬件上的需求。這就需要對硬件有絕對的了解,甚至包括地址和時(shí)鐘周期等。軟件協(xié)議棧最底層的設(shè)計(jì)人員往往稱自己為平臺(tái)工程師,他們的工作就是準(zhǔn)確描述硬件,以便協(xié)議棧的更高層次能夠識別和重復(fù)使用。這種描述被某些 RTOS廠商稱為板支持包(BSP),與我們?nèi)粘J褂玫?PC 的基本輸入/輸出系統(tǒng)(BIOS)類似。
協(xié)議棧從下往上第二層包含 RTOS的內(nèi)核以及將較高層次的軟件與被描述的硬件相連的必要驅(qū)動(dòng)程序。在這些協(xié)議棧的最底層中,平臺(tái)工程師和驅(qū)動(dòng)程序開發(fā)人員需要在真實(shí)的SoC或完全準(zhǔn)確的SoC模型上驗(yàn)證他們的代碼。這個(gè)層面的軟件開發(fā)人員需要全面了解各時(shí)鐘周期軟件的行為。
作為軟件開發(fā)人員的另一極,在協(xié)議棧的頂層,我們可以看到用戶空間,在這里可以同時(shí)運(yùn)行多個(gè)應(yīng)用,比如像智能電話中的聯(lián)系人管理器、視頻顯示器、互聯(lián)網(wǎng)瀏覽器和實(shí)際呼叫的電話子系統(tǒng)。這些應(yīng)用中的每一個(gè)都不能直接訪問SoC硬件,而且實(shí)際上在某種程度上違背了所有硬件考慮事項(xiàng)。這些應(yīng)用依賴運(yùn)行在協(xié)議棧較低層的軟件代表自己與SoC硬件及系統(tǒng)其他部分通信。
我們可以歸納為:在協(xié)議棧的每一層,軟件開發(fā)人員只需要一個(gè)足夠準(zhǔn)確的模型來讓自己的代碼認(rèn)為自己運(yùn)行在目標(biāo) SoC上即可。超過必要的準(zhǔn)確度只會(huì)讓模型在模擬器上的運(yùn)行速度下降。實(shí)際上,任何層面的SoC建模,都要求我們把硬件和協(xié)議棧描述為比當(dāng)前層面更低的一層,以便進(jìn)行驗(yàn)證。而且在理想的情況下,我們應(yīng)該只要求夠用的準(zhǔn)確度,以實(shí)現(xiàn)最高性能。
這種只為軟件層提供“夠用的準(zhǔn)確度”的建模方法為不同的軟件開發(fā)人員提供了多種不同的建模環(huán)境,供他們在SoC項(xiàng)目的不同階段使用??梢圆捎肧ystemC這樣的語言進(jìn)行事務(wù)處理層面的建模,創(chuàng)建出一個(gè)準(zhǔn)確度低但速度足夠快的仿真器模型,用來同時(shí)運(yùn)行許多應(yīng)用。如果實(shí)時(shí)的真實(shí)數(shù)據(jù)的處理不是很重要,那么考慮采用虛擬原型方法比較好。
不過,必須完整運(yùn)行整個(gè)軟件協(xié)議?;蛱幚碚鎸?shí)環(huán)境中的數(shù)據(jù)時(shí),最適合采用基于FPGA的原型方法。
使用原型驗(yàn)證軟件的實(shí)例
只有采用基于FPGA的原型方法才能夠打破建模方法中準(zhǔn)確度與性能之間內(nèi)在的相互牽制關(guān)系。采用FPGA,我們既能實(shí)現(xiàn)實(shí)時(shí)的速度,又能以完全的RTL周期精度建模。這樣,單個(gè)原型不僅能供低層軟件驗(yàn)證要求的準(zhǔn)確模型使用,又能供高層應(yīng)用開發(fā)人員需要的高速模型使用。實(shí)際上,整個(gè)SoC軟件協(xié)議棧都可以在單個(gè)基于FPGA的原型上建模。德克薩斯州奧斯汀市Freescale Semiconductor公司移動(dòng)產(chǎn)品部的Scott Constable及其團(tuán)隊(duì)開展的項(xiàng)目就是采用FPGA驗(yàn)證軟件的一個(gè)很好的例子。
Freescale非常想加快SoC開發(fā)進(jìn)程,因?yàn)槭謾C(jī)市場上產(chǎn)品生命周期短,需要產(chǎn)品盡快打入市場。這不僅是為了贏得競爭,也是為了避免迅速過時(shí)。通過分析流程中耗時(shí)最多的環(huán)節(jié),F(xiàn)reescale發(fā)現(xiàn)通過加快手機(jī)3G協(xié)議測試工作可以帶來最明顯的效果。如果測試工作能夠在流片前完成,F(xiàn)reescale就可以將項(xiàng)目時(shí)間縮短數(shù)月。與通常只有一到兩年的產(chǎn)品生命周期而言,這非常重要。
協(xié)議測試是一個(gè)復(fù)雜的過程,就算以較高的實(shí)時(shí)速度進(jìn)行,也需要一天才能完成。采用FPGA是因?yàn)檫@是實(shí)現(xiàn)必要的時(shí)鐘速度,及時(shí)完成測試的唯一途徑。
[!--empirenews.page--]
協(xié)議測試需要開發(fā)產(chǎn)品的各種軟件特性,包括硬件驅(qū)動(dòng)程序、操作系統(tǒng)和協(xié)議棧代碼。雖然如前所述主要的目的是協(xié)議測試,通過使用 FPGA,所有這些軟件開發(fā)工作都能夠在流片前完成,從而大大加快各種最終產(chǎn)品的開發(fā)進(jìn)度。
Freescale構(gòu)建了一個(gè)多芯片系統(tǒng)的原型,其中包括一個(gè)雙核MXC2基帶處理器和一個(gè)RF收發(fā)器芯片的數(shù)字部分?;鶐幚砥鲀?nèi)置一個(gè)用于調(diào)制解調(diào)器處理的Freescale StarCore DSP內(nèi)核、一個(gè)用于用戶應(yīng)用處理的ARM 926內(nèi)核,以及 60多個(gè)外設(shè)。
Synopsys HAPS-54原型板用來實(shí)現(xiàn)原型(如圖3所示)。該基帶處理器有500多萬個(gè)ASIC門,Scott的團(tuán)隊(duì)使用Synopsys Certify工具將其在原型板上劃分給3個(gè)賽靈思Virtex-5 FPGA,同時(shí)把數(shù)字RF設(shè)計(jì)布置在第四個(gè)FPGA中。Freescale 決定不構(gòu)建模擬部分的原型,而是直接從Antritsu協(xié)議測試盒中以數(shù)字形式提供移動(dòng)網(wǎng)絡(luò)數(shù)據(jù)。
圖3 Freescale的SoC設(shè)計(jì)在HAPS-54原型板上的分區(qū)
較早的內(nèi)核使用的某些設(shè)計(jì)技術(shù)對ASIC來說非常有效果,但對FPGA來說卻不太好用。另外,RTL的一部分是從系統(tǒng)級設(shè)計(jì)代碼中自動(dòng)生成的,由于其過于復(fù)雜的時(shí)鐘網(wǎng)絡(luò),對FPGA來說也是相當(dāng)不利的。因此,必須對RTL進(jìn)行一些調(diào)整,使其更加兼容FPGA,這樣做的成效非常顯著。
僅在完成首個(gè)芯片后一個(gè)月,F(xiàn)reescale團(tuán)隊(duì)就成功地從這個(gè)系統(tǒng)中撥出了第一個(gè)移動(dòng)電話呼叫,把產(chǎn)品開發(fā)進(jìn)度縮短了6個(gè)多月,這非常具有里程碑式的意義。
這個(gè)例子說明基于 FPGA的原型方法能夠給軟件開發(fā)團(tuán)隊(duì)提供什么樣的增值工具,能夠在產(chǎn)品質(zhì)量和項(xiàng)目進(jìn)程方面帶來怎樣顯著的回報(bào)。
接口優(yōu)勢:測試真實(shí)條件下的數(shù)據(jù)效應(yīng)
很難想象有這樣一種 SoC 設(shè)計(jì)可以不遵守輸入數(shù)據(jù)、處理數(shù)據(jù)、生成輸出數(shù)據(jù)的基本結(jié)構(gòu)。實(shí)際上,如果我們深入SoC設(shè)計(jì),就會(huì)發(fā)現(xiàn)無數(shù)的子模塊遵循著同樣的結(jié)構(gòu),直到單個(gè)門級。
要在這些層級中的每一個(gè)層級驗(yàn)證正確的處理,要求我們提供完整的輸入數(shù)據(jù)集,并觀察處理結(jié)果的輸出數(shù)據(jù)是否正確。對單個(gè)門來說,這個(gè)工作很簡單,對小型 RTL 模塊來說,也是可能的。但隨著系統(tǒng)日趨復(fù)雜,從統(tǒng)計(jì)上來說基本沒有可能確保輸入數(shù)據(jù)和初始條件的完整性,尤其是在有軟件運(yùn)行在一個(gè)以上的處理器的時(shí)候。
最后一點(diǎn)非常重要,因?yàn)椴豢深A(yù)測的輸入數(shù)據(jù)能擾亂所有的SoC系統(tǒng),即便是精心設(shè)計(jì)的關(guān)鍵SoC設(shè)計(jì)也難以幸免。與新輸入的數(shù)據(jù)或者輸入數(shù)據(jù)不尋常的組合或序列相結(jié)合的,是非常多的SoC 可能的前置狀態(tài),可能會(huì)使SoC處于某種無法驗(yàn)證的狀態(tài)。當(dāng)然,這種情況不一定是什么問題,SoC可以在無需系統(tǒng)的其他部分干預(yù)的情況下恢復(fù),或者用戶根本就沒有察覺。
但是,不能驗(yàn)證的狀態(tài)必須在最終芯片中避免,因此我們需要盡可能全面地測試設(shè)計(jì)的方法。在設(shè)計(jì)的功能仿真過程中,驗(yàn)證工程師會(huì)采用有力的方法,比如受約束隨機(jī)激勵(lì)和高級測試工具來完成多種測試,旨在達(dá)到可接受的測試覆蓋面。但是,完整性仍受驗(yàn)證工程師選擇的方向和給定的約束條件的限制,并受限于可用于運(yùn)行仿真的時(shí)間。結(jié)果雖然受約束隨機(jī)驗(yàn)證永遠(yuǎn)不可能窮盡,但能夠大大增強(qiáng)我們已經(jīng)測試了所有輸入的組合(包括可能的輸入和極端情況輸入)的信心。
對實(shí)驗(yàn)室可行性實(shí)驗(yàn)的優(yōu)勢
在項(xiàng)目的初始階段,需要對芯片拓?fù)?、性能、功耗以及片上通信結(jié)構(gòu)做出基本決策。部分決策采用算法或系統(tǒng)級建模工具便可良好執(zhí)行,但也可以采用 FPGA 進(jìn)行某些額外的實(shí)驗(yàn)。這是否是真正基于FPGA的原型設(shè)計(jì)呢?我們正使用 FPGA進(jìn)行某個(gè)概念的原型設(shè)計(jì),但這與使用算法或數(shù)學(xué)工具不同,因?yàn)槲覀冃枰承┛赡苁怯蛇@些高級工具生成的 RTL。一旦進(jìn)入FPGA,就可采集早期信息幫助推進(jìn)算法和最終SoC架構(gòu)的優(yōu)化?;贔PGA的原型為項(xiàng)目該階段帶來的優(yōu)勢是,可使用更準(zhǔn)確的模型,而且這些模型的運(yùn)行速度非??欤軌蚺c實(shí)時(shí)輸入互動(dòng)。
這種類型的實(shí)驗(yàn)性原型值得一提,因?yàn)樗鼈兪窃谌娴腟oC項(xiàng)目中使用基于FPGA的原型設(shè)計(jì)硬件和工具的又一途徑,可為我們的投資帶來更高的回報(bào)。
在實(shí)驗(yàn)室外使用原型
基于FPGA的原型設(shè)計(jì)可用于驗(yàn)證SoC設(shè)計(jì)的一個(gè)真正獨(dú)到之處,是其獨(dú)立工作的能力。這是因?yàn)镕PGA可通過閃存EEPROM卡或其他獨(dú)立介質(zhì)進(jìn)行配置,無須主機(jī)PC管理。因此該原型不但可獨(dú)立運(yùn)行,而且還可用于各種環(huán)境下的SoC設(shè)計(jì)測試,這與其他建模技術(shù)(如需要依賴主機(jī)干預(yù)的仿真)提供的環(huán)境儼然不同。
在極端情況下,原型可以完全從實(shí)驗(yàn)室中取出,用于現(xiàn)場真實(shí)環(huán)境中。比如將原型安裝在開動(dòng)的車輛上,研究設(shè)計(jì)對外部噪聲、移動(dòng)、天線場強(qiáng)等條件變化的依賴性。比如,本文作者就曾將移動(dòng)電話的基帶原型安裝在車輛上,通過公共GSM網(wǎng)絡(luò)在移動(dòng)中撥打電話。
芯片架構(gòu)師與其他產(chǎn)品專家需要與早期客戶互動(dòng),展示其算法的重要特性?;贔PGA的原型設(shè)計(jì)在項(xiàng)目極早期的這個(gè)階段可能是非常關(guān)鍵的優(yōu)勢,但這種方法與主流SoC原型設(shè)計(jì)略有不同。
基于FPGA原型的不足
我們撰寫本文的目的是公正地看待基于FPGA的原型的優(yōu)勢與局限性,因此在前面談及各種優(yōu)勢之后,我們將在下面介紹部分局限性。
首先最重要的是,F(xiàn)PGA原型不是RTL模擬器。如果我們的目的是編寫一些RTL,然后盡快在FPGA中實(shí)施,以查看它是否能工作,那么我們應(yīng)該重新思考所忽略的東西。FPGA對運(yùn)行RTL“模型”來說確實(shí)是一種速度更快的引擎,但當(dāng)我們開始設(shè)置該模型的時(shí)候,速度優(yōu)勢就會(huì)大打折扣。此外,模擬器的儀表盤部分能夠完整地控制激勵(lì)和掌握結(jié)果。我們應(yīng)該思考儀表化FPGA的方法,深入了解設(shè)計(jì)的功能性,但即便是在這方面最完善的設(shè)計(jì),也只能提供一部分真正能用于 RTL 模擬器儀表盤的信息。因此,該模擬器是用于重復(fù)編寫和評估RTL代碼更加理想的環(huán)境,因此我們應(yīng)該等到模擬基本完成后,RTL相當(dāng)成熟后才能將其交付給FPGA原型設(shè)計(jì)團(tuán)隊(duì)。
基于FPGA的原型不是ESL
Synopsys的Innovator或Synphony等電子系統(tǒng)級(ESL)工具或算法工具可在SystemC中完成設(shè)計(jì),或通過預(yù)定義模型庫進(jìn)行構(gòu)建。然后,我們不但可在相同的工具中模擬這些設(shè)計(jì),而且還可深入了解其系統(tǒng)級性能,包括運(yùn)行軟件,在項(xiàng)目初期階段進(jìn)行軟硬件權(quán)衡。
使用基于FPGA的原型方法,我們需要RTL,因此它不太適合研究算法或架構(gòu),因?yàn)檫@兩者通常不采用RTL方式表達(dá)。對軟件來說,F(xiàn)PGA原型設(shè)計(jì)的優(yōu)勢是在當(dāng) RTL 成熟得可以構(gòu)建硬件平臺(tái)的時(shí)候,軟件可在更加準(zhǔn)確以及更加真實(shí)的環(huán)境中運(yùn)行。對那些具有天馬行空想法的人來說,可以編寫少量RTL在FPGA上運(yùn)行,進(jìn)行可行性研究。這是一種極少而又非常重要的FPGA原型設(shè)計(jì)的使用方法,但別把它和整個(gè)SoC的系統(tǒng)級或算法研究混淆在一起。
持續(xù)性是關(guān)鍵
優(yōu)秀的工程師往往會(huì)為其工作選擇適當(dāng)?shù)墓ぞ撸珣?yīng)該隨時(shí)有一種方法可以將半成品交給他人繼續(xù)完成。我們應(yīng)該能夠在盡量不增加工作量的情況下,將來自ESL模擬的設(shè)計(jì)移交給基于FPGA的原型。此外,部分ESL工具還可通過高層次綜合實(shí)現(xiàn)設(shè)計(jì),生成RTL供SoC項(xiàng)目整體使用?;贔PGA的原型能夠接收該RTL,并以高周期精度在電路板上運(yùn)行。但我們需要再次等到RTL相對穩(wěn)定下來,這需要等到項(xiàng)目軟硬件分區(qū)和架構(gòu)研究階段完成后。
采用FPGA進(jìn)行原型設(shè)計(jì)的原因
當(dāng)前SoC是從算法研究人員到硬件設(shè)計(jì)人員,乃至軟件工程師和芯片布局團(tuán)隊(duì)等眾多專家的工作結(jié)晶,在項(xiàng)目不斷發(fā)展的同時(shí),各類專家也都有自己的需求。SoC項(xiàng)目的成功很大程度上取決于上述各類專家所使用的硬件驗(yàn)證、軟硬件聯(lián)合驗(yàn)證以及軟件驗(yàn)證的方法,基于FPGA的原型設(shè)計(jì)可為每一類專家?guī)砀鞣N不同的優(yōu)勢。
對于硬件團(tuán)隊(duì)而言,驗(yàn)證工具的速度可對驗(yàn)證吞吐量產(chǎn)生巨大的影響。因此一些團(tuán)隊(duì)采用基于FPGA的原型為這種硬件測試提供具有更高性能的平臺(tái)。例如,我們可以在近乎實(shí)時(shí)的條件下運(yùn)行整個(gè)操作系統(tǒng)的引導(dǎo)程序,節(jié)省需要花上數(shù)天才能達(dá)到相同目的的模擬時(shí)間。
對于軟件開發(fā)團(tuán)隊(duì)而言,基于FPGA的原型可為目標(biāo)芯片提供獨(dú)特的流片前模型,能夠在開發(fā)接近尾聲時(shí)高速、高度準(zhǔn)確地進(jìn)行軟件調(diào)試。
對于整個(gè)團(tuán)隊(duì)而言,SoC項(xiàng)目的關(guān)鍵階段是在軟硬件初次結(jié)合的時(shí)候。硬件將由最終軟件執(zhí)行,而執(zhí)行方式可能是單純硬件驗(yàn)證方案難以預(yù)見或預(yù)測的,從而最終將出現(xiàn)新的硬件問題。這在多核系統(tǒng)中或者在那些運(yùn)行同步實(shí)時(shí)應(yīng)用的系統(tǒng)中特別普遍。如果這種軟硬件的采用要等到第一個(gè)器件制造完畢后,那么毫不夸張地說,到那時(shí)再發(fā)現(xiàn)新的缺陷就不太好了。