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