- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
Perl语言在电路设计中的应用
摘 要: 一种可在Unix操作系统下编程的模块化的高级语言Perl。在简要阐述Perl语言的基础上,以实例描述了Perl语言在电路仿真测试中的应用。
关键词: Perl语言 功能测试 电路仿真 测试文件
实用提取和报表语言(Practical Extraction and Report Language,Perl)是由Larry Wall开发并不断更新,用于Unix环境下编程的一种模块化的、可扩展的高级语言。在集成电路后端设计中,电路仿真是设计的关键。而一个完备而准确的测试文件,则是电路仿真的基础。Perl语言编写的应用程序可自动生成设计者所需要的仿真测试文件,为电路仿真工作提供了一种便利而准确的方法。
1 Perl简介
Perl是一个高阶程式语言,由Larry Wall和其他许多人所编写,融合了许多语言的特性。它主要由C语言及sed、awk,UNIX shell和至少十多种其他的工具和语言所演化而来。其特点如下:
(1)与脚本语言一样,Perl不需要编译器和链接器来运行代码,要做的只是写出程序并告诉Perl来运行。Perl提供脚本语言(如sed和awk)的所有功能,同时还具有sed和awk所不具备的很多功能。
(2)Perl语言是UNIX系统上最常使用的数据处理工具。该语言本来的目的就是为了取代UNIX中的sed(或awk)与shell的结合。在UNIX系统中,Perl语言提供了强有力的搜索字符串模式的功能。它有很多文件搜索命令,使用这些命令可以非常方便地从文件中进行信息检索,并可将这些命令相互结合来完成所需的任务。
(3)Perl语言是一种编程语言,它能非常方便地处理和加工数据,并含有非常丰富的函数,覆盖了输入/输出、字符串处理和数组处理等各方面,可以使用Perl语言来编写出实用和简洁的程序。
(4)Perl语言拥有与C语言十分类似的运算符和流程控制,并被大多数人所熟悉,降低了编写程序的难度。
2 Perl语言在电路仿真中的应用
2.1 SRAM电路
图1是SRAM的结构图。它主要由存储单元、译码器、FIFO及控制单元等部分组成。电路设计者根据SPEC的要求进行电路设计,并编写出相应的测试文件,对电路的功能及时序关系进行仿真测试,以确保设计的正确性。
根据测试要求不同,设计者为仿真电路设计的测试文件的长短会有很大的差别,例如测试SRAM的功能,需要在十几个时钟周期内反复读写,以测试存储单元是否能按要求存储数据,内部信号的时序是否正确。对于编写这种约几百行的测试文件来说,能否自动生成并不太重要。但是如果希望将所有存储单元均进行一次读写检查,手工编写上万行测试文件是不现实的。
图2是某种SRAM的时序图。在SRAM读取数据时,访问时间(Access time)是一个非常重要的数据,它表示从存储器中重新读回数据所用的时间。Taccess=clock cycle-Tsetupclk。在设计过程中,要保证:当RD=1时,必须在Access time时间内把数据从存储器中读出。这就要求设计者在仿真时,关注Access time结束时的RDATA数据与希望从存储器中读出的数据是否一致。
又如,Thd(Time Hold)代表了从存储器中读出的RDATA数据需要保持的时间。一般来说,SRAM将作为构成整个系统的一个子模块,它的输出必将为另一个子模块的输入信号。为了保证整个系统的正常工作,作为子模块的SRAM的输出信号必须满足整个系统对它的要求,即输出信号的保持时间(hold time)要足够长。对于这一点,设计者在仿真中同样也要关注RDATA数据是否可以保持足够长的时间。类似要考虑的问题还有许多,这些严格的限制条件将给设计者带来很大麻烦。例如不同的SRAM,其时钟周期、setup time、hold time、I/O个数都可能不同。以上问题的存在都将导致一个测试文件只能用在与其对应的1个SRAM上。因此如果做1个系列的SRAM,仅写测试文件的工作量就足够大了。
2.2 应用Perl程序生成测试数据的实现
经以上分析,采用Perl语言来生成SRAM的测试文件。该方法有如下要求:
(1)快速、完全。要确保生成的测试数据可将所有存储单元均写入、读出1次。
(2)测试文件中必须包含clk上升和下降沿的读写数据,同时,必须有set up time、hold time等关键时钟时刻的读写数据。根据测试文件编写的具体要求,可以发现,在UNIX环境下,通过编写Perl程序生成测试将是一个事半功倍的解决方式。用Perl语言编写的部分程序如下。
#########################################
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;
}
设计者需要做的就是根据SPEC的要求填写由该程序生成的可执行文件的表格,就可在Perl的环境下生成完整的测试程序。应用Perl语言生成的测试程序,经过实际验证,可以满足上述2个条件。
Perl语言作为一种具有强大功能的编程语言正迅速被人们认识与接受。它作为用在Unix环境下编程的高级语言,为电路仿真测试文件的编写提供了一种新的方式,高效、准确的特点给设计人员带来很大的便利。
参考文献
1 Deitel H M,Deitel P J,Nieto T R et al.Perl编程金典.北京:清华大学出版社,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 高德远,康继昌.超大规模集成电路——系统和电路的设计原理.西安:西北工业大学出版社,1998