- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于Verilog HDL描述的802.11a基带芯片的测试方案
摘 要: 从提高测试效率和代码覆盖率的角度,提出一种利用Verilog HDL语言中的task来复用测试代码,进行分层分模块验证的测试方案。用该方案测试802.11a基带芯片,可对设计模块进行功能仿真,找出设计中的错误,以保证802.11a基带芯片在功能上的正确性和可行性。
关键词: Verilog HDL语言 测试平台 代码复用 行为级 无线局域网 802.11a标准
Verilog HDL是一种硬件描述语言,用于从算法级、寄存器传输级(RTL)、门级到开关级的多种抽象设计层次的数字系统建模。Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。而且,该语言可用于生成模拟激励矢量,并且可以指定测试的验证约束条件(例如设定输入值)。
设计验证是芯片设计过程中保证其可靠性的重要环节。随着芯片规模不断扩大,复杂度不断提高,验证已成为现代化IC设计中的主要瓶颈,影响到成本以及产品投放市场的时间。在大型芯片的设计中,功能验证或模拟通常会占据整个验证工作量的40%~70%。模拟验证是通过对芯片设计施加伪随机的或确定性的矢量,来检测设计方案的行为是否正确。在设计验证的初期(即前仿真时期),常常采用人工编写的矢量集作为模拟激励。
1 测试系统的设计思想
测试验证的速度包括仿真速度和验证速度,其中仿真占据了验证过程80%以上的CPU资源和时间。因而,仿真过程效率的提高对保证验证质量和缩短验证周期十分重要。
一个完整的IC设计需要进行从上到下的多层仿真才能将出错的可能性降到最低。RTL级仿真是最高层仿真,也是仿真速度最快的设计层。因此应该在RTL级进行最全面的仿真,将出错的可能性在该层降到最低,从而缩短整个系统的验证时间。
1行RTL级设计描述需要1.5行以上的验证代码。对于大规模的设计,验证程序也需要采用可复用的设计方法。本设计采用结构化、层次化设计方法来提高仿真验证程序的复用率。结构化设计是指验证程序由能够独立完成一定任务的模块构成。这些模块不但能够提供仿真激励、响应监控、覆盖率统计等功能,而且可以被各验证小组共享,也可以应用于仿真验证的各个阶段。层次化设计是指较高层次的仿真程序的功能通过调用处于较低层次的己有程序来完成,这种调用关系可以一直延续到最底层。层次化设计减小了对仿真程序的修改,即某一层次的改变不会造成别的相关模块的大改动,可以将改动限制在一个较小的范围内(与网络的七层协议类似),从而提高了验证程序的复用率。
为了更好地利用结构化和层次化的验证方法,提高编写测例的效率,从而提高验证的效率:(1)在进行分层、分模块设计时,应该尽量将不相关的信号划分在不同的模块中,将有先后顺序的信号划分在不同的层次中。这样在仿真和调试时就可以快速定位出错点,节省验证时间。(2)在编写测试程序时,尽量使测试程序具有通用性,当需要测试不同的项目时只需进行简单的开关设置,或者利用不同的数据文件做不同的测试即可。
2 测试系统的总体结构及测试流程
2.1 802.11a基带芯片系统结构
802.11a是基于正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)技术的无线局域网标准。802.11a工作在5GHz的未授权频段,数据传输速率最大可达54Mbps。OFDM技术是802.11a的物理层(PHY)标准,是一种编码技术,但是它与已有的码分多址编码技术(Code Division Multiple Access,CDMA)在实现方法上却不相同。CDMA利用复杂的数学变换将多路传输数据调制到1路载波上,而OFDM将1路传输数据编码到多路子载波上,而且使用一个较宽的带宽,将其分成多个子信道,每个子信道都可以传输数据。这样多个较慢的子信道就复用成为一个较快的复合信道。OFDM对每一个子信道进行编码,并且利用快速傅立叶逆变换来生成由每个子信道构成的复合波形。OFDM接收器利用快速傅立叶变换就可以从接收到的波形中提取每个子载波信号的振幅。
按照802.11a协议标准,OFDM物理层由以下二部分组成:
(1)物理层汇聚子层(PLCP)。MAC层和PLCP通过物理层服务访问点(Service Access Point,SAP)利用原语进行通信。MAC层发出指示后,PLCP就开始准备需要传输的IEEE 802.11物理层服务数据单元(Physical Sublayer Service Data Units,PSDUs)。PLCP也从无线介质向MAC层传递引入帧。PLCP是PSDU附加字段,字段中包含物理层发送和接收所需的信息。PLCP将MAC协议数据单元映射成适合被物理介质依赖子层(PMD)传送的格式,从而降低MAC层对PMD层的依赖程度。
(2)物理介质依赖(Physical Medium Dependent,PMD)子层。在PLCP下方,PMD支持2个工作站之间通过无线介质实现物理层实体的发送和接收。为了实现以上功能,PMD需直接面向无线介质(大气空间),并对数据进行调制和解调。PLCP和PMD之间通过原语通信来控制发送和接收功能。
因此设计符合802.11a标准的无线局域网芯片的主要工作就是设计基带芯片。本文设计的802.11a基带芯片的ONIE系统结构如图1所示。
整个基带芯片由内核、接口电路和外围控制电路三大部分组成。为了将相对独立的各个模块组成一个完整的系统,需要定义一个顶层模块,用来规定各个模块之间的数据信号和控制信号的连接关系。在图1中,顶层模块取名为ONZE。基带芯片内核实现接收数据和发送数据的功能,即接收数据时,如果侦测到正确的数据帧适配头(Frame Preamble,包含数据帧的长度、速率等信息),则开始通过射频模块接收从网络传输过来的数据帧,同时对数据帧进行解调,生成PSDU数据后再发送给上面的MAC层;发送数据时,首先将数据帧适配头和PSDU数据组装成数据帧,然后对数据帧进行调制,再通过射频模块传送到网络上去。图1中的基带芯片内核模块取名为OFDM_CORE,其接收数据功能用模块TX_CORE来实现,发送数据功能用RX_CORE模块来实现。接口电路主要实现基带芯片内核与射频模块和MAC层之间的数据传输以及控制信号的转化,其中模块OFDM_RIF是射频模块与内核之间的接口,模块MAC_IF是MAC层与内核之间的接口。外围控制电路有以下几种:第1种是用来产生内核、接口电路和外围控制电路所需的工作时钟(在图1中取名为ONZE_CLK);第2种是用来产生内核、接口电路和外围控制电路所需的异步复位信号和同步复位信号(在图1中取名为ONZE_RST);第3种是用来产生内核、接口电路和外围控制电路所需的工作使能信号(在图1中取名为BOSS_TOP);第4种是用来设置芯片内核、接口电路和外围控制电路的控制参数以及读取其相关状态(在图1中取名为RGB);第5种是一些辅助的外围模块,如用于CRC校验的CRC CHECK模块和用于响应异常状况的中断控制模块等。
由图1可知,ONZE是顶层,OFDM_RIF、MAC_IF、OFDM_CORE、RGB及外围模块是下一层模块,其中模块OFDM_CORE中又包含了子模块TX_CORE和RX_CORE。验证时,可以先验证底层模块,再验证顶层模块。在同一个层次上,分别验证各个相对独立的模块。验证主要通过各个接口对ONZE施加激励向量。因此各个接口的功能对各个层次及各个模块的验证具有通用性,可以利用task来编写这些接口功能,用于分层分模块验证。
2.2 测试平台组织结构
构建测试系统结构的主要思想是在靠近DUT(Design Under Test)即所要测试验证的对象ONZE的地方,将对各个端口的各种操作编写成task,然后在testbench中调用这些task对ONZE加载测试向量。这样做的好处是分层分模块验证时可以提高测试代码的复用率。针对要测试对象ONZE的系统结构,设计了如图2所示的整个测试系统的总体结构。
根据802.11a基带芯片的系统结构,将不同接口处要实现的验证功能编写成相应的task,供不同的测例程序复用。整个测试平台系统由7个模块组成,每个模块完成相对独立的任务,分述如下。
(1)模块ONZE_TB。生成顶层模块ONZE;与此同时生成系统时钟和复位信号,作为输入激励信号提供给ONZE内部各个模块使用。task包含:sys_reset,将整个ONZE系统复位到初始状态。
(2)模块TB_MAC_IF。通过MAC interface向ONZE发送和接收测试向量,并且通过与正确值比较来进行验证。task包含psdu_rev_check(psdu_exp,len,rate),对接收到的psdu进行校验,其中参数psdu_exp是期望接收到的psdu,len是期望接收到的psdu的长度,rate是期望接收到的plcp中的速率;receive_enabel,设置开始接收;check_display,显示psdu数据部分校验的结果;psdu_snd_if(psdu_send,len,rate),通过mac_if接口发送数据,其中参数psdu_snd是要发送的psdu数据,len是要发送的psdu数据的长度,rate是要发送psdu数据的速率;mac_if_reset,复位mac接口模块的输出信号和内部所使用的寄存器。
(3)模块TB_RF_IF。通过RF interface向ONZE发送和接收测试向量,同时进行校验。
(4)模块TB_SPI_BUS。通过SPI总线对ONZE内部的RGB(寄存器组)进行读写,完成各个模块参数的设置和读取。task包含:spi_read(spi_out_data,spi_addr),通过spi端口读取RGB的值,其中参数spi_out_data为读出的数据,spi_addr为要读的RGB地址;spi_write(spi_in_data,spi_addr),通过spi端口向RGB中写入数值,其中参数spi_in_data是将要写入RGB的数据,spi_addr是准备写的RGB地址;spi_reset,对spi端口的输出信号和内部用到的寄存器进行复位。
(5)模块PSDU_DATA。负责从数据文件中读取测试用的各种数据,包括I、Q二路数据和期望的PSDU值。
(6)不同测试所用到的数据,其数据长度、速率、有无频偏等各不相同,为了统一管理以及程序上的简洁,将不同测例用到的不同数据的相关参数放在同一个文件中,形成了模块TB_SYS_CONST。
(7)模块Testbench。是真正用于测试的测例程序,针对不同模块的各个测例都包含在这个文件中。其中,每个测例程序都是通过调用前面所述各个模块中的task来完成测试的。
2.3 测试验证流程
测试验证分2个阶段进行:第一阶段测试基本的接收和发送功能是否能正常工作,第二阶段分别测试各个外围模块的功能。因为验证流程与测试流程类似,在此仅以测试接收和发送功能的回环测试为例加以说明。
首先,调用onze_tb.sys_reset、onze_tb.U_tb_mac_if.mac_if_reset、onze_tb.U_tb_spi_bus.spi_reset 3个task,对系统和MAC端口、SPI端口进行复位;然后调用onze_tb.U_tb_spi_bus.spi_write(spi_in_data,spi_addr)task来设置psdu数据的长度和速率;最后调用onze_tb.U_tb_mac_if.psdu_snd_if(psdu_send,len,rate)和onze_tb.U_tb_mac_if.psdu_rev_check
(psdu_exp,len, rate)task,来测试芯片的发送和接收功能。
3 系统仿真与验证
测试程序编写完成后,就可以利用ncverilog编译器(如candence公司的Verilog-XL)进行仿真。因为整个系统划分的层次和模块比较多,编写的测例也很多,所以编写了脚本文件。当要测试某一个测例时,只需要敲入命令make testbench_name就可以运行该测例程序。
为了验证设计模块的功能是否正确,需要查看仿真的log文件和波形文件。通过观察波形工具signalscan或者simvision即可以清楚地看出设计模块的输入信号、输出信号和内部信号,从而找出模块设计中的错误之处。
4 结束语
利用Verilog HDL语言进行IC设计前仿真(功能验证)时,如何搭建测试平台对验证的效率有很大的影响。本文的测试平台利用结构化、层次化的验证方法,通过对测试代码的复用,有效地提高了验证的效率,保证了802.11a基带芯片功能上的正确性,可以作为一种搭建IC设计测试平台的参考。
参考文献
1 汪西虎,梁松海,李美云等.一款通讯专用SOC设计的验证. 微电子学与计算机,2002;(12)
2 Bhasker J著,徐振林等译.VERILOG HDL硬件描述语言. 北京:机械工业出版社,2000
3 吕涛,李华伟,尹志刚等.通用CPU设计中的模拟验证技术及应用.系统仿真学报,2002;14(12)
4 IEEE Std 802.11a-1999(Supplement to IEEE Std 802.11-1999).1999