IP驗證增量仿真技術(shù)的運用
驗證涉及每個(gè)階段的迭代循環(huán):仿真、檢查結果,改變激勵或設計或調試設置,重新仿真并不斷重復。在系統調試過(guò)程中,軟硬件在多次運行之間可能會(huì )有改變,因此系統調試也變得更為復雜。
某些驗證可以被分解成多個(gè)可以并行運行的小型仿真。這種方法對許多旨在確認硬件本身的測試來(lái)說(shuō)是非常有效的,但并不是所有測試都適合。像視頻流處理這類(lèi)測試就很難被分解成多個(gè)較小的測試,因為這種處理的對象是整個(gè)數據流,而且每個(gè)幀都依賴(lài)于它前面的幀。
對系統硬件或軟件所做的修改可能并不會(huì )立即影響系統行為,對不是馬上要執行的軟件所做的代碼修改在它運行之前不會(huì )改變系統行為。例如,雖然對一個(gè)1,000個(gè)周期后才被調用的軟件例程做了修改,但系統行為在前面1,000個(gè)周期內是不變的。
設計師需要能夠從代碼或設計修改開(kāi)始起作用的那點(diǎn)開(kāi)始恢復仿真。在上述例子中,這意味著(zhù)設計師應該在第1,000個(gè)周期時(shí)作出代碼修改并重新啟動(dòng)仿真,不用再次運行前面1,000個(gè)周期。
當設計已經(jīng)改變、新的塊可能已經(jīng)增加到系統模型中時(shí),問(wèn)題就比較難解決了。設計師沒(méi)有這個(gè)新塊過(guò)去保存的數據用于恢復。另外,設計師可能有許多IP塊由于各種理由(如編譯的,受保護的IP塊)而表現為黑盒子,這些塊將無(wú)法參與保存/恢復操作。
假如設計師可以對設計作出修改,相信寄存器值沒(méi)有變化,并能重新啟動(dòng)修改后的仿真,那么設計師如何能根據硬件或軟件變化而知道系統行為將要改變的確切點(diǎn)呢?不知道這點(diǎn)的話(huà),設計師將要么重新啟動(dòng)得太早而浪費不需要的仿真周期,要么重新啟動(dòng)得太晚而錯過(guò)一些變化了的行為。
另外,如果系統行為很早就改變了,但只是發(fā)生在設計的很小部分又會(huì )怎樣呢?即使系統的小部分受到影響,系統的絕大部分模塊在上千個(gè)周期內也不會(huì )受到改變的影響。
理想的解決方案是只在系統行為即將從上一次運行基礎上發(fā)生改變時(shí)的那個(gè)點(diǎn)重新啟動(dòng)系統中的每個(gè)主要模塊。然而這樣做顯然行不通,因為只要任何一個(gè)模塊開(kāi)始執行,它就要求與其他模塊發(fā)生交互,就需要來(lái)自這些模塊的信號,并發(fā)送信號給這些模塊。
圖:在少量修改后運行的仿真經(jīng)常會(huì )完全重復前次仿真過(guò)程已經(jīng)完成的工作。
解決這個(gè)問(wèn)題的方法之一是考慮在I/O邊界處保存每個(gè)塊的行為,使得捕捉到的I/O信號可用于復用,而不用實(shí)際計算每個(gè)模塊的仿真行為。復用保存在I/O邊界的信號可以節省重新計算該模塊行為所需的計算工作,減少工作量,進(jìn)而提升系統性能。
當設計運行到修改開(kāi)始影響特定模塊的仿真時(shí),設計師可以再次開(kāi)始仿真,并停止使用保存的信號值。
設計師如何知道仿真何時(shí)已經(jīng)改變了呢?除了復用保存的模塊輸出值外,設計師還保存了輸入信號。在每個(gè)周期內,設計師可以將實(shí)際的輸入信號值與保存的輸入信號值進(jìn)行比較。當保存值與實(shí)際值匹配時(shí),設計師就能知道輸出結果與上次運行結果是相同的。
這種方法的效果取決于假設執行信號和檢查點(diǎn)讀取所需的時(shí)間小于執行實(shí)際仿真所需時(shí)間,從而加速仿真的能力。顯然,具有內部活動(dòng)和少量I/O引腳的大模塊的速度提升幅度要比具有許多I/O信號的小模塊顯著(zhù)得多。在前一種情況下,保存和恢復I/O信號的成本要低于仿真模塊行為所需付出的代價(jià)。在后一種情況中,在某些點(diǎn)保存和恢復信號數據的成本將超過(guò)仿真模塊的代價(jià)。
有助于減少必須保存的數據量的一種方法是只在時(shí)鐘周期上采樣I/O信號。通用使用周期級(cycle-level)接口,設計師可以確保他或她只需要一個(gè)周期采樣或分析信號值一次,而不是每個(gè)周期內以隨機次數進(jìn)行采樣。因為大多數總線(xiàn)接口是周期精確型接口,因此這種方法通常沒(méi)有什么問(wèn)題。
實(shí)現這種系統所需要的功能要求設計師:
. 監視和捕捉特定模塊的輸入和輸出。
. 將接口轉換成在周期邊界上工作。
. 以指定間隔查明所有寄存器值。
. 從保存文件中恢復出信號用作輸出值。
. 將保存的輸入值與實(shí)際值進(jìn)行比較。
. 發(fā)現失配時(shí),加載最近的檢查值,只允許該模塊仿真到當前時(shí)間,然后從該點(diǎn)開(kāi)始繼續正常的仿真。
Carbon設計系統公司在周期級模型編譯器的“重放”特性中實(shí)現了上述功能。該模型編譯器接收寄存器傳輸級代碼,創(chuàng )建周期級編譯后的模型,并提供周期級模塊接口。其余功能則在編譯期間于基本的I/O模型邊界創(chuàng )建的部分包裝器(wrapper)中實(shí)現。
評論