摘? 要: 一種可在Unix操作系統(tǒng)下編程的模塊化的高級(jí)語(yǔ)言Perl。在簡(jiǎn)要闡述Perl語(yǔ)言的基礎(chǔ)上,以實(shí)例描述了Perl語(yǔ)言在電路仿真測(cè)試中的應(yīng)用,。
??? 關(guān)鍵詞: Perl語(yǔ)言? 功能測(cè)試? 電路仿真? 測(cè)試文件
?
實(shí)用提取和報(bào)表語(yǔ)言(Practical Extraction and Report Language,Perl)是由Larry Wall開(kāi)發(fā)并不斷更新,用于Unix環(huán)境下編程的一種模塊化的,、可擴(kuò)展的高級(jí)語(yǔ)言,。在集成電路后端設(shè)計(jì)中,電路仿真是設(shè)計(jì)的關(guān)鍵,。而一個(gè)完備而準(zhǔn)確的測(cè)試文件,則是電路仿真的基礎(chǔ),。Perl語(yǔ)言編寫(xiě)的應(yīng)用程序可自動(dòng)生成設(shè)計(jì)者所需要的仿真測(cè)試文件,為電路仿真工作提供了一種便利而準(zhǔn)確的方法,。
1? Perl簡(jiǎn)介
Perl是一個(gè)高階程式語(yǔ)言,由Larry Wall和其他許多人所編寫(xiě),融合了許多語(yǔ)言的特性,。它主要由C語(yǔ)言及sed,、awk,UNIX shell和至少十多種其他的工具和語(yǔ)言所演化而來(lái),。其特點(diǎn)如下:
(1)與腳本語(yǔ)言一樣,Perl不需要編譯器和鏈接器來(lái)運(yùn)行代碼,要做的只是寫(xiě)出程序并告訴Perl來(lái)運(yùn)行。Perl提供腳本語(yǔ)言(如sed和awk)的所有功能,同時(shí)還具有sed和awk所不具備的很多功能,。
(2)Perl語(yǔ)言是UNIX系統(tǒng)上最常使用的數(shù)據(jù)處理工具,。該語(yǔ)言本來(lái)的目的就是為了取代UNIX中的sed(或awk)與shell的結(jié)合。在UNIX系統(tǒng)中,Perl語(yǔ)言提供了強(qiáng)有力的搜索字符串模式的功能,。它有很多文件搜索命令,使用這些命令可以非常方便地從文件中進(jìn)行信息檢索,并可將這些命令相互結(jié)合來(lái)完成所需的任務(wù),。
(3)Perl語(yǔ)言是一種編程語(yǔ)言,它能非常方便地處理和加工數(shù)據(jù),并含有非常豐富的函數(shù),覆蓋了輸入/輸出、字符串處理和數(shù)組處理等各方面,可以使用Perl語(yǔ)言來(lái)編寫(xiě)出實(shí)用和簡(jiǎn)潔的程序,。
(4)Perl語(yǔ)言擁有與C語(yǔ)言十分類似的運(yùn)算符和流程控制,并被大多數(shù)人所熟悉,降低了編寫(xiě)程序的難度,。
2? Perl語(yǔ)言在電路仿真中的應(yīng)用
2.1 SRAM電路
圖1是SRAM的結(jié)構(gòu)圖,。它主要由存儲(chǔ)單元、譯碼器,、FIFO及控制單元等部分組成,。電路設(shè)計(jì)者根據(jù)SPEC的要求進(jìn)行電路設(shè)計(jì),并編寫(xiě)出相應(yīng)的測(cè)試文件,對(duì)電路的功能及時(shí)序關(guān)系進(jìn)行仿真測(cè)試,以確保設(shè)計(jì)的正確性。
根據(jù)測(cè)試要求不同,設(shè)計(jì)者為仿真電路設(shè)計(jì)的測(cè)試文件的長(zhǎng)短會(huì)有很大的差別,例如測(cè)試SRAM的功能,需要在十幾個(gè)時(shí)鐘周期內(nèi)反復(fù)讀寫(xiě),以測(cè)試存儲(chǔ)單元是否能按要求存儲(chǔ)數(shù)據(jù),內(nèi)部信號(hào)的時(shí)序是否正確,。對(duì)于編寫(xiě)這種約幾百行的測(cè)試文件來(lái)說(shuō),能否自動(dòng)生成并不太重要,。但是如果希望將所有存儲(chǔ)單元均進(jìn)行一次讀寫(xiě)檢查,手工編寫(xiě)上萬(wàn)行測(cè)試文件是不現(xiàn)實(shí)的。
圖2是某種SRAM的時(shí)序圖,。在SRAM讀取數(shù)據(jù)時(shí),訪問(wèn)時(shí)間(Access time)是一個(gè)非常重要的數(shù)據(jù),它表示從存儲(chǔ)器中重新讀回?cái)?shù)據(jù)所用的時(shí)間,。Taccess=clock cycle-Tsetupclk。在設(shè)計(jì)過(guò)程中,要保證:當(dāng)RD=1時(shí),必須在Access time時(shí)間內(nèi)把數(shù)據(jù)從存儲(chǔ)器中讀出,。這就要求設(shè)計(jì)者在仿真時(shí),關(guān)注Access time結(jié)束時(shí)的RDATA數(shù)據(jù)與希望從存儲(chǔ)器中讀出的數(shù)據(jù)是否一致,。
?
又如,Thd(Time Hold)代表了從存儲(chǔ)器中讀出的RDATA數(shù)據(jù)需要保持的時(shí)間。一般來(lái)說(shuō),SRAM將作為構(gòu)成整個(gè)系統(tǒng)的一個(gè)子模塊,它的輸出必將為另一個(gè)子模塊的輸入信號(hào),。為了保證整個(gè)系統(tǒng)的正常工作,作為子模塊的SRAM的輸出信號(hào)必須滿足整個(gè)系統(tǒng)對(duì)它的要求,即輸出信號(hào)的保持時(shí)間(hold time)要足夠長(zhǎng),。對(duì)于這一點(diǎn),設(shè)計(jì)者在仿真中同樣也要關(guān)注RDATA數(shù)據(jù)是否可以保持足夠長(zhǎng)的時(shí)間。類似要考慮的問(wèn)題還有許多,這些嚴(yán)格的限制條件將給設(shè)計(jì)者帶來(lái)很大麻煩,。例如不同的SRAM,其時(shí)鐘周期,、setup time、hold time,、I/O個(gè)數(shù)都可能不同,。以上問(wèn)題的存在都將導(dǎo)致一個(gè)測(cè)試文件只能用在與其對(duì)應(yīng)的1個(gè)SRAM上。因此如果做1個(gè)系列的SRAM,僅寫(xiě)測(cè)試文件的工作量就足夠大了,。
2.2 應(yīng)用Perl程序生成測(cè)試數(shù)據(jù)的實(shí)現(xiàn)
經(jīng)以上分析,采用Perl語(yǔ)言來(lái)生成SRAM的測(cè)試文件,。該方法有如下要求:
(1)快速、完全,。要確保生成的測(cè)試數(shù)據(jù)可將所有存儲(chǔ)單元均寫(xiě)入,、讀出1次。
(2)測(cè)試文件中必須包含clk上升和下降沿的讀寫(xiě)數(shù)據(jù),同時(shí),必須有set up time,、hold time等關(guān)鍵時(shí)鐘時(shí)刻的讀寫(xiě)數(shù)據(jù),。根據(jù)測(cè)試文件編寫(xiě)的具體要求,可以發(fā)現(xiàn),在UNIX環(huán)境下,通過(guò)編寫(xiě)Perl程序生成測(cè)試將是一個(gè)事半功倍的解決方式。用Perl語(yǔ)言編寫(xiě)的部分程序如下,。
#########################################
generate the title of vector
#########################################
sub gentitle{
? local($title)=@_;
? print $title ″radix 111″;
? print $title &setdata(0,$abit,1),″ ″;
? print $title &setdata(0,$dbit,1),″ ″;
? print $title &setdata(0,$dbit,1),″n″;
? ??? ? ?print $title ″io?? iii″;
?????? ? print $title &setdata(0,$abit,2),″ ″;
? print $title &setdata(0,$dbit,2),″ ″;
?????? ? print $title &setdata(0,$dbit,3),″n″;
?????? ? local($tmp1)=$abit-1;
? local($tmp)=$dbit-1;
chop($clock);
? chop($address) if $address=~/n$/;
? chop($dinput);
? chop($doutput);
? print $title ″vname $clock WR RD″;
print $title ″$address
[$tmp1:0] $dinput
[$tmp:0]$doutput
[$tmp:0]n″;
print $title ″tunit nsn″;
print $title ″trise $trise″;
print $title ″tfall $trise″;
print $title ″vih $vih″;
print $title ″vil $vil″;
print $title ″voh $voh″;
print $title ″vol $vol″;
print $title ″n″; ???????????????????? }
sub setdata{
local($value,$data,$flag)=@_;
?????? local($string)=″″;
?????? local($cl)=″″;
?????????? for(local($j)=0;$j<$data;$j++)
?????????? {
???????????????????? if($flag>0&&$flag<6)
???????????????????? {
??????????????????????????? $str.=″x″if $flag==1;
??????????????????????????? $str.=″i″if $flag==2;
??????????????????????????? $str.=″1″if $flag==3;
??????????????????????????? $str.=″0″if $flag==4;
??????????????????????????? next;
???????????????????? }
???????????????????? $cl.=$str;
???????????????????? $string=$c;
??????????????????????????? }
?????????? $str;
????}
設(shè)計(jì)者需要做的就是根據(jù)SPEC的要求填寫(xiě)由該程序生成的可執(zhí)行文件的表格,就可在Perl的環(huán)境下生成完整的測(cè)試程序,。應(yīng)用Perl語(yǔ)言生成的測(cè)試程序,經(jīng)過(guò)實(shí)際驗(yàn)證,可以滿足上述2個(gè)條件。
Perl語(yǔ)言作為一種具有強(qiáng)大功能的編程語(yǔ)言正迅速被人們認(rèn)識(shí)與接受,。它作為用在Unix環(huán)境下編程的高級(jí)語(yǔ)言,為電路仿真測(cè)試文件的編寫(xiě)提供了一種新的方式,高效,、準(zhǔn)確的特點(diǎn)給設(shè)計(jì)人員帶來(lái)很大的便利。
?
參考文獻(xiàn)
1? Deitel H M,Deitel P J,Nieto T R et al.Perl編程金典.北京:清華大學(xué)出版社,2000
2? Wall L,Schwartz R L.Programming Perl.O′Reilly?Associates Inc,1991
3? BaKer R J,Li H W et al.CMOS Circuit Design,Lay-out,and Simulation.New York:The Institute of Electrical and Electronics Inc,1997
4? 高德遠(yuǎn),康繼昌.超大規(guī)模集成電路——系統(tǒng)和電路的設(shè)計(jì)原理.西安:西北工業(yè)大學(xué)出版社,1998