VCS使用2006.03.20内容•常用选项•混合编译•VCD/VCD+•PLI•Coverage•后仿真常用选项•vcs-ffilelist-RI-line+difine+WIDTH=5•vcsdir/*.v+incdir+inc_dir-RI-line–Mupdate•其它选项:vcs-help•演示Debug•CLI(不熟,见VCS_S11_Unit_02.pdf)•VirSim交互Debug(各种技巧见VCS_S11_Unit_03.pdf)(个人觉得比较好用的一个技巧:CustomRadixes)混合编译一个SoC的makefile:VHDLANALYZER=vhdlan-nc+v2kVLOGANALYZER=vlogan-nc+v2kALL:ARBITERBRIDGEDMACINTCMEMCUARTGPIOTRNGMODELARBITER:${VLOGANALYZER}../Lib/ARBITER/*.v+incdir+../Lib/ARBITERBRIDGE:${VLOGANALYZER}../Lib/BRIDGE/*.v+incdir+../Lib/BRIDGEDMAC:${VLOGANALYZER}../Lib/DMAC/*.v+incdir+../Lib/DMAC/INTC:${VLOGANALYZER}../Lib/IntCtrl/*.v+incdir+../Lib/IntCtrlMEMC:${VLOGANALYZER}../Lib/MemCtrl/*.v+incdir+../Lib/MemCtrlUART:${VLOGANALYZER}../Lib/UART/*.v+incdir+../Lib/UARTGPIO:${VLOGANALYZER}../Lib/GPIO/*.v+incdir+../Lib/GPIOTRNG:${VLOGANALYZER}../Lib/TRNG/*.v+incdir+../Lib/TRNGMODEL:${VLOGANALYZER}../Model/Pll_a/*.v../Model/SDRAM/*.v../Model/ARTISAN_RAM/*.v../Model/TRNG_A/*.v../Model/DW/*.v+notimingcheckVCSSIM:vcs-nc-lmc-swift../Lib/ck520_4k_model.linux/*.v../System/*.v+incdir+../System-mhdl-RI+notimingcheck&(vlogan:编译,中间结果保存在VERILOG目录下;vcs:仿真)VirSim的两种运行方式•交互模式(interactivemode)允许实时的控制仿真的进行,允许在模拟的过程中改变寄存器的值或者设置,这些改变会实时地影响到模拟的结果•后处理模式(post-processingmode)先倒出用户指定选择的信号及其变化过程到一个文件中,这个文件是VCD+类型的。VCD+文件里面记录了VCS模拟的结果,和信号的变化历史等信息。然后可以用VirSim来分析这个文件(验证人员将波形保存,由设计人员查错;并行工作;后仿真)保存波形•两种波形文件–VCD:ASCII文件–VCD+:二进制文件•VCD文件比较大(大概是VCD+的8倍),占用太多硬盘资源,但VCS在调用VCD文件时会自动转换成VCD+文件VCD文件(1)•准备工作:修改testbanchinitialbegin$dumpfile(div_wave.vcd);$dumplimit(4096);$dumpvars;//$dumpvars(0,div_tb)end(其他系统任务:$dumpoff$dumpon$dumpflush…见AVerilogHDLPrimer)VCD文件(2)•生成VCD文件vcs*.v–RI•查看VCD文件vcs–RPP*.v+vcdfile+div_wave.vcd(会自动生产div_wave.vcd.vpd文件)VCD+文件(1)•准备工作:修改testbench文件initialbegin$vcdpluson(0,div_tb);$vcdplustraceon(div_tb);end(其它系统函数参见VCS_S11_Unit_04.pdf)VCD+文件(2)•生成VCD+文件vcs*.v–RI+vpdfile+div_wave.vpd(若不加+vpdfile+…,默认产生vcdplus.vpd文件)•查看VCD+文件Vcs*.v–RPP+vpdfile+div_wave.vpdPLI(1)•连接C程序与VCS仿真器的接口•用途:–编写自己的系统函数–在testbench中产生激励(动态指令发生器)–Verilog模块与Cmodel联合仿真PLI(2)•3个文件–.c文件:c函数–.tab文件:将c函数映射为verilog中可调用的系统函数–.v文件:调用.tab中的系统函数(实际上是调用其映射的c函数)PLI(3)•C函数举例:------------------------------------------------------------------------------------------------------------------------------------------------------#includevcsuser.h“voidmycall(){floata,b;intresult;a=(float)tf_getp(1);//a读入第一个参数b=(float)tf_getp(2);//b读入第二个参数result=(a/b)*8388608;//浮点除法tf_putp(3,result);//将结果存入第三个参数io_printf(a=%d,b=%d,result=%d,(int)a,(int)b,result);}voidabs(){inta,b;intc;a=tf_getp(1);//a读入第一个参数b=tf_getp(2);//b读入第二个参数c=(a-b=0)?(a-b):(b-a);//c为a-b的绝对值tf_putp(3,c);//将绝对值存入第三个参数}--------------------------------------------------------------------------------------------------//注:tf_getp,tf_putp和io_print是pli的库函数PLI(4)•头文件与库函数–两个头文件•a、acc_user.h“•b、vcsuser.h–pli库函数:•io_printf----打印•tf_nump----读取参数个数•tf_typep----参数类型•tf_getp-----取得参数的值•tf_putp-----传回一个整型给调用的任务或函数(更多参见Verilog.HDL.A.Guide.To.Digital.Design.And.Synthesis.2nd)PLI(5)•.tab文件--------------------------------------------------------------------------------------------------$dividercall=mycall$abscall=abs--------------------------------------------------------------------------------------------------注1:$divider是系统函数,verilog中可调用,mycall是映射的c函数注2:这里只用了最简单的写法,其实.tab还有很多复杂的参数可加,具体见vcs的帮助文档PLI(6)•.v文件(testbench)中的调用------------------------------------------------------------TopU_div(.iClk(rClk),.iRst_n(rRst_n),.iX(rX),.iY(rY),.oQ(wQ)//硬件除法器得到的结果(3周期产生));always@(rXorrY)begina=rX;b=rY;$display(a=%d,b=%d,a,b);$divider(a,b,wResult);//c函数得到的结果(延迟3周期后与wQ比较)end------------------------------------------------------------PLI(7)•运行:vcs*.v-Ppli.tabpli.c–RIcoverage•4种coverage:–Line//vcs–cmline…–Condition//vcs–cmcond…–Toggle//vcs–cmtgl…–FSM//vcs–cmfsm…//vcs–cmline+cond+fsm•结果存在simv.cm文件夹中,用cmView命令可以观察各种测试覆盖率后仿真•Testbench中添加:$sdf_annotate(../HARDCORE/mClkGen_eco.sdf,U_TOP.U_ClkGen,,ClkGen.log);•命令vcs*.v-RI+notimingcheck+maxdelays…