《什么样的测试程序是一个完整的SV测试.docx》由会员分享,可在线阅读,更多相关《什么样的测试程序是一个完整的SV测试.docx(9页珍藏版)》请在优知文库上搜索。
1、什么样的测试程序是一个完整的SV测试的怎样才能构成一个完成的SV测试1.首先须要有被测设计DUT,即被测试的模块。2 .其次,RT1.级的TestBenchoRT1.级的测试平台主要完成时钟和复位信号的产生,以及接口的实例化,并在这个测试平台中连接器了SV的测试平台和被测设计。RT1.级的测试平台是以传统的veri1.og的模块定义形式存在,即modu1.e和endmodu1.es来声明的。3 .在DUT,RT1.级的TB和SV级的TB之间是通过RT1.级的TB进行链接的(起到一个桥梁的作用),然后这一级别的的平台中产生最基本的时钟及复位信号。4 .在将这些模块链接起来以后(RT1.级的TB只
2、负责链接,时钟复位信号产生),由SV级的模块来负贲激励的产生,检测,最终的对比以及功能覆需率的工作。例如(一个RT1.级TB的范例):modu1.ememorytb();330331wire7:0address,datain;332wire7:0data_out;333wireread_write,chip_en;334rege1.k;335336/Connecttheinterface337memportsports(接口的实例化338.c1.ock(e1.k),339.address(address),310.chipen(chipen),341.read_write(read_write
3、),342.data_in(data_in),343.dataout(dataout)344):345/Connecttheprogram346mcmory_toptop(ports);通过接口,将SV的测试平台链接348initia1.begin349e1.k=0:350end时钟及更位信号的初始化(这个例子中无复位)351352a1.ways#1e1.k=c1.k;/时钟信号产生353354memory1.memOry(/和被测设计连接起来355.address(address),356.data-in(data_in),357.data_out(data_out),358.read_wr
4、ite(read_write),359.chip_en(chip_en)360);361endmodu1.e5.然后要到SV的顶层中。这个顶层中,主要的构成单元式类。先对类的句柄进行定义,然后运用构建函数为类创建对象,然后通过线程将所须要的函数调用,最终实现SV层次的验证。例如(一个SV的顶层):programmemory_top(meni_p(rtsports);留意,SV顶层开头的和RT1.级的开头不同。RT1.运用的是modu1.e和endmodu1.e,SV运用的是Program和endprogram。302303mem_txgentxgen:定义类的句柄304mem_SCoreboa
5、rdsb;305mem_ip_monitoripm;306mem_op_monitoropm:307308initia1.begin309sb=newO:构建函数,开拓内存空间,通过接口将进程之间联系起来310ipm=new(sb,ports);311opm=new(sb,ports);312txgen=new(ports);313314fork不同的进程315ipm.input_monitor();316opm.output-monitorO;317join_none318txgen.gen_cmdsO;319320repeat(20)(posedgeports.c1.ock);延迟20个时
6、钟周期结束321322end323324endprogram6.scoreboard计分板(实意为对比模型,在这个模块进行输出数据与目标数据的对比),计分板的作用是对数据进行对比。对输出数据进行对比,来查看数据是否正确。例如:ifnt1.efMEM_SCOREBOARD_SV142defineMEM_SCOREBOARD_SV143144c1.assmcm_scoreboard;145/Createakeyed1isttostorethewrittendata146/Keytothe1.istisaddressofwriteaccess147mem_base_objectmem_object;
7、148149/post_inputmethodisusedforstoringwritedata150/atWriteaddress151taskpost_input(mem_base_objectinput_object):负责将数据写入的写入地址存储152begin153mem_objectinput_object.addr=input_object;154end155endtask156/post_outputmethodisusedbytheoutputmonitorto157/comparetheoutputofmemorywithexpecteddata158taskpost_ou
8、tput(mem_base_objectoutput_object);输出的模块主要对比输出结果和目标结果是否相等159begin160/Checkifaddressexistsinscoreboard161if(mem_objectoutput_object.addr!=nu1.1.)begin162mem_base_objectin_mem=mcm_objectoutput_object.addr;163Jdisp1.ay(scoreboard:FoundAddress%xin1.ist,output_object.addr);164if(output_object.data!=in_me
9、m.data)begin165Jdisp1.ay(Scoreboard:Error:ExpdataandGotdatadonrtmatch);166Sdisp1.ay(Expected-%x,in_mcm.data);167Sdisp1.ay(Got-%x,output_object.data);168enc1.e1.sebegin169$disp1.ay(Scoreboard:ExpdataandGotdatamatch);170end171end172end173endtask7.事务产生器。这个事物产生器,说明产生了三次的读写操作。在事务级的事务发生器中,只说明要产生的事务是什么。比如这
10、个事务产生器中说明,产生三次读写操作,数据陨机。在事务产生器中,模块和驱动器干脆相连接。例如:ifndefMEMJrXGEN一SV1.O6defineMEM_TXGEN_SV107c1.assmcm_txgen;108109mem_base_objectmem-object;基本模块110mem_drivermem_driver;驱动的例化,驱动模块并没有在SV的TB中干脆体现出来,而是通过事务发生器来调用驱动模块H1.112integernum_cmds;114functionnew(virtua1.mem_portsports);115begin116num_cmds=3:/事务级事务发生
11、的次数117mem_driver=new(ports);/事务级和驱动相联系,事务级负责确定行为。驱动负贡和dut相联系。118end119endfunction122taskgen_cmdsO;123begin124integeri=0:125for(i=0:inum_cmds;i+)begin126mem_object=new();127mem_object.addr=$randomO:/随机产生数据和地址128mem_object.data=SrandomO;129mcm_object.rd_wr=1;130mem_driver.drive_mem(mem_object);写操作131m
12、em_object.rd_wr=0;132mem_driver.drive_mem(memobject);读操作133end134end135endtask136137endc1.ass138endif8.驱动器。驱动器负责和底层设计联系起来,山事务产生器告知驱动,现在要读写三次ram,然后详细的连接是在驱动中完成的(由驱动链接到DUDo因为dut是一个RAM,只完成读写操作。读的时候给一个地址输出一个8位的数据;写的时候给出地址和对应数据,然后写入数据。所以这个驱动瑞完成的功能就是给RAM地址和数据或者只有地址。48ifndefMEM_DRIVER_SV49defineMEM_DRIVER_
13、SV50c1.assmem_driver;51virtua1.mem_portsports;5253functionnew(virtua1.mem_portsports);这个函数对数据清零,包括地址,使能位,读写信号,数据54begin55this,ports=ports;56ports,address=0;57ports.chip_en=0;58ports.read_write=0;59ports.data_in=0:60end61endfunction6263taskdrive_mem(mem_base_objectobject):/task中调用了基本类,并对其实例化64begin65
14、(posedgeports,c1.ock):在第一上升沿对数据进行打值66ports,address=object,addr;读写地址67ports.chip_en=1;片选使能信号68ports.read_write=object.rd_wr;读写使能信号69ports.data_in=(object,rdwr)?object,data:0;依据读写信号,来确定数据输入70if(object.rd_wr)begin71Sdisp1.ay(Driver:Memorywriteaccess-Address:%xData:%xn,object,addr,object,da1.a);若是写信号,则显
15、示写地址和对应数据。72ende1.sebegin73Sdisp1.ay(Driver:Memoryreadaccess-Address:%xn,object,addr);若是读,显示读地址74end75(posedgeports.c1.ock);再遇到上升沿则全部清零76ports.address=0;77ports.chip_en=0;78ports.read_write=0;79ports.data_in=0;80end81endtaskendc1.ass84endif9.监视器O监视流负责检查输入和输出数据的是否满意规范。这个例子中的输入监视器主要将随机产生的地址和数据存储。输出监视器将须要的地址的数据传给监视器,并通过积分板来完成数据的对比。例如:(输入的监视器)ifndefMEM_IP_MONITOR_SV182defineMEM_IP_MONITOR_SV183c1.assmem_ip_monitor:184mcm_base_objectmem_object;基本模块的实例化185mem_scoreboardsb:/计分板的实例化186virtua1.mem_portsports;18718