集成电路EDA 课件5 第5章-RTL语言与工具-VCS_第1页
集成电路EDA 课件5 第5章-RTL语言与工具-VCS_第2页
集成电路EDA 课件5 第5章-RTL语言与工具-VCS_第3页
集成电路EDA 课件5 第5章-RTL语言与工具-VCS_第4页
集成电路EDA 课件5 第5章-RTL语言与工具-VCS_第5页
已阅读5页,还剩334页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字集成电路EDA第7章数字集成电路前端设计EDA本章学习目标了解EDA工具在数字集成电路前端设计过程中能做什么。掌握一种数字集成电路前端设计EDA仿真工具。掌握一种数字集成电路前端设计EDA综合工具。掌握数字集成电路设计流程。5.1数字集成电路前端设计流程

半导体行业正在经历一个技术进步和创新浪潮的复兴时期。人工智能等新兴领域技术的不断发展给芯片设计带来全新的挑战:功耗降低、周期加快等。EDA工具需要变得更加AI化,它能帮助设计达到优化的PPA(Power,Performance,Area)

目标。EDA所扮演的角色主要在于提供开发者工具,而其不容忽视的功能是自动化减少晶片设计的时间及制造的周期。简介

值得一提的是,1986年Synopsys创始人AartdeGeus博士发明了逻辑综合工具,使原本用单个门来手动设计芯片电路的工程师可以用电脑语言来“写”电路,提高了芯片设计的抽象层次,极大提升了集成电路设计的效率,从而让人类有机会设计出包含超百亿个晶体管的复杂芯片。逻辑综合是一个伟大的成就,逻辑综合的行为是将数字电路的寄存器传输级描述(RTL,RegisterTransferLevel)的VerilogHDL/VHDL文件“综合”为描述设计结构的门级(Gate-LevelNetlist)文件。简介逻辑综合工具主要是DesignCompiler,是目前90%以上ASIC设计人员广泛使用的工具,该工具大幅提高了ASIC设计效率的自动化。DesignCompiler升级迭代成DesignCompilerGraphical,加入物理综合,即在综合前加入版图的布局规划信息(floorplan),然后调用库信息和约束条件,生成带有布局信息的门级设计结果,进一步提高了综合与布局布线结果的相关一致性。简介人工智能、5G、自动驾驶等新兴领域技术的不断发展对芯片设计带来全新的挑战,所有EDA方法都要在非常庞大的数据集上执行复杂的算法,需要花费大量计算时间。随着技术的快速扩张,加速EDA算法执行的吸引力也越来越大。支持5nm以下工艺的DesignCompilerNXT,显著加快了运行速度。通过平台化的通用库以及与布局布线工具校准的RC寄生参数提取,实现在5nm以及更先进工艺节点下极为紧密的相关一致性。简介数字IC设计全流程1.架构的设计与验证2.HDL设计输入3.前仿真功能验证前端设计后端设计5.静态时序分析4.逻辑综合6.形式验证工具12.ECO11.STA静态时序分析和后仿真10.时钟树生成8.布局规划9.自动放置标准单元7.数据准备13.Filler的插入14.布线15.DummyMetal的增加17.Tapeout16.DRC和LVS图7.1数字IC设计全流程图5.1数字集成电路前端设计流程1.架构的设计与验证根据调研,根据客户的需求,芯片产品经理或架构师确定芯片功能与架构,定义系统的性能参数和外部接口。这一步骤奠定了整个芯片的性能和功耗的基础。该步骤的目的是确定数字部分的高层次算法,为硬件提供一个正确的软件功能模型;架构的分析与建模为RTL实现提供总体性的设计指导。5.1数字集成电路前端设计流程1.架构的设计与验证架构师将系统功能进行分解和细化,形成设计规范(Specificaiton),将设计参数化、具体化。一方面确定芯片的具体指标,如物理实现(工艺节点、裸片面积等)、性能指标(速度、功耗等)、功能指标(功能描述、接口定义等)等;另一方面是系统级设计,用系统建模语言对各个模块描述,为了对方案的可行性进行验证。使用的工具与语言为MATLAB、C++、C、SystemC、SystemVerilog。5.1数字集成电路前端设计流程2.HDL设计输入使用硬件描述语言将电路功能以代码的形式描述实现。目的是完成由高层次描述到Verilog实现的过程。可以使用工具Vim等。编写代码不但要语法和逻辑功能正确,还要兼顾逻辑综合、STA、P&R、DFX、功耗分析等多方面因素。可以借助相关工具进行代码风格检查,帮助排除RTL代码中的CDC(ClockDomainCrosss)等潜在问题。5.1数字集成电路前端设计流程3.前仿真功能验证从功能上验证RTL编码设计正确与否,是否满足规格中的所有要求。在无延迟的理想情况在,使用VCS、NC-Verilog、Modelsim等工具,可能使用SystemVerilog、SystemC等语言,基于UVM的方法学,通过大量仿真,发现电路设计过程中的人为或者非人为引起的Bug。主要指标是功能覆盖率。前仿真是动态仿真,时间长并且难以覆盖全面。5.1数字集成电路前端设计流程4.逻辑综合把HDL代码翻译成与工艺库相关的门级网表Netlist。逻辑综合需要基于特定的综合库,不同库中门电路基本标准单元的面积与时序参数不同。5.1数字集成电路前端设计流程5.静态时序分析在时序上对电路进行验证,检查设计的所有路径中,是否存在建立时间和保持时间违例,目的是保证无论起点是什么,信号都可以被及时地传递到该路径的终点,并且在电路正常工作所需的时间段内保持恒定。从逻辑综合开始,基本上每做一步大的调整,都会完成一次静态时序分析,以保证每步都能实现时序收敛。使用的工具是PrimeTime等。5.1数字集成电路前端设计流程5.静态时序分析在前端对时序违例进行修复,虽然速度很快,但是代码的修改可能会带来新的问题,可能需要新的仿真来确认,而仿真会需要数月的时间,一般不会在前端进行时序修复。在布图前,PrimeTime使用由库指定的线负载模型估计线网延时。在布图后,实际提取的延迟被反标注到PrimeTime以提供真实的延迟计算。5.1数字集成电路前端设计流程6.形式验证工具也可以称为一致性检查(或等价性检查),从功能上对综合后的网表进行验证,将综合后的网表与验证后的HDL设计对比,检查网表功能是否与前仿一致。保证逻辑综合过程中没有改变HDL描述的电路功能。5.1数字集成电路前端设计流程6.形式验证工具对于大规模设计而言,逻辑仿真的时间很长,所以现在一般采用的方法是形式验证。RTL代码和逻辑综合后的网表都可以抽象为两幅由节点和边构成的图,形式验证采用了类似于直接比较两幅图是否一致的方法,来确定逻辑综合生成的网表是否正确。使用的EDA工具是Formalty等,输入文件是RTL代码、Netlist、约束,输出文件是match(两张图节点是否一致)和verify(计算得出两张图功能是否一致)的报告。5.1.1HDL为什么要用VerilogHDL?电子设计规模越来越大(普通设计已达几百万门的数量级),复杂度越来越高。有必要用高级语言来表达其功能,隐藏其具体的细节实现。提高逻辑设计的效率,降低设计成本,更重要的是缩短设计周期。可读性强,易修改。从HDL到具体的硬件电路是由EDA工具软件的综合器完成,但并不是所有VerilogHDL语句均可被综合。注意:5.1.1HDL1.HDL已成功地应用于数字IC的各个阶段设计:使用HDL语言描述硬件系统的功能和结构。仿真:通过HDL仿真器对设计进行功能验证和时序验证。综合:将HDL代码综合为实际的硬件电路,如FPGA或ASIC。验证:编写测试台和验证环境,对硬件系统进行全面的验证和测试。5.1.1HDL2.硬件描述语言具备如下基本特征模块化设计:利用HDL语言可以采用自顶而下的设计方法将系统分解为多个模块,分别描述每个基本模块(实现特定的子功能)及模块间的互连关系。层次结构:HDL语言支持层次化的描述结构,既支持结构级别描述用于描述晶体管级门级的连接,也支持数据级描述、行为级描述。并发描述:HDL语言可以有效描述多个硬件运算或操作并行的情况。时序描述:HDL语言可以描述硬件系统的时序特性,包括时钟信号、时序逻辑和时序约束等。5.1.1HDL3.几种常见的HDL语言Verilog:Verilog是一种较早的HDL语言,语法类似于C语言,易于学习和使用,广泛用于硬件设计和验证,特别是在数字集成电路和FPGA设计中。VHDL(VHSICHardwareDescriptionLanguage):其语法结构更加严格和正式,可以更好地描述大型复杂系统。5.1.1HDL3.几种常见的HDL语言SystemVerilog:SystemVerilog是Verilog的扩展,增加了许多新特性,如对象导向编程、事务级建模(TLM)、断言和约束等。通常用于FPGA验证、SoC设计和高级硬件验证环境的开发。SystemC:SystemC是一种基于C++的系统级建模语言,用于系统级硬件和软件协同设计。5.1.2芯片验证芯片验证是在一个芯片设计过程中验证各个转化阶段是否正确执行的过程。验证贯穿芯片研发全程的仿真。IC验证通过功能仿真确保每一个设计的精准无误,避免高昂的流片风险。市场需求→算法→架构→RTL→门级网表→GDSII→样片流程每个状态都需要验证(本节讨论的是RTL级的功能验证)。随着设计的复杂度不断提高,验证的难度也越来越大。统计表明,验证已经占到整个开发时间的一半以上,甚至达到80%。因此验证已经成为产品开发周期中的一个主要瓶颈。5.1.2芯片验证UVM简介1)验证目标:功能覆盖率,结构覆盖率(100%)。2)验证层次:模块级、芯片级、系统级。3)验证策略的形式:白盒、灰盒与黑盒验证;参考模型为C/C++/Matlab等模型。4)主流的验证平台:基于Verilog的验证平台、基于SystemVerilog、UVM的验证平台。5.1.2芯片验证UVM简介5)UVM的特点一个标准的验证平台的模板,一套完备的源码库,支持受约束随即激励的产生,支持故概率驱动的验证模式,代码可重用,平台可移植。UVM验证平台是一种可用性极强的验证平台,每个基于UVM的验证平台的结构大同小异。图7.2是典型的UVM平台结构。5.1.2芯片验证图5.2典型的UVM平台结构5.1.2芯片验证UVM简介6)完整的验证环境包括:驱动器、监视器、激励生成器及分析端口和分析组件等。7)UVM各个组件的功能和作用首先是Testbench,中间是Interface,用来连接Testbench和DUT(DesignUnderTest,待测设计),最底下是DUT,也就是被测试的部分。5.1.2芯片验证UVM简介8)UVM验证平台的层次划分最上层是测试(test)层,由各种testcase组成,接下来是场景层,由产生激励的sequencer构成,第三层是功能层,包括scoreboard等组件,第四层是命令(command)层,由driver和monitor这种与interface打交道的组件构成,最底层是信号(signal)层,这一层是通过interface和DUT进行交互。5.1.2芯片验证UVM简介9)SystemVerilog类库UVM的另一个关键词是SystemVerilog类库,这些类库一方面包括了各种组件的基础代码,验证工程师通过扩展这些源代码,就可以为各种项目开发组件,搭建验证平台,另一方面这些类库包含了各种内建的函数,这些通用函数帮助用户减少工作量,节省开发时间。5.1.2芯片验证UVM测试平台的搭建1)必要的基本知识验证环境(Windows∣Linux)、验证语言(基础语法∣面向对象特征)、验证方法学(例如UVM∣验证平台搭建)。2)准备工作Windows系统下Vscode、PowerShell、Questasim、Makefile;Linux系统下Vscode、VCS&Verdi、Questasim。5.1.2芯片验证5.UVM测试平台的搭建3)搭建测试系统启动方法之一Makefile启动。在Vscode软件中新建一个工程(例如经典的helloworld),包含五个空文件夹,分别为:docs(存放)、opt(输出)、sims(启动)、src(设计)、tb(测试)。5.1.2芯片验证3)搭建测试系统启动方法之一(1)在src文件夹中创建helloworld.sv文件,注意扩展名,并写好文件的头,方便查阅和增加可读性。modulehelloworld(inputkey);always@(posedgekey)begin$display(‶helloworld!\n″)endendmodule5.1.2芯片验证3)搭建测试系统启动方法之一(2)在tb文件夹中创建TB.sv文件。(3)在sims文件夹中创建filelist.f文件和Makefile文件,脚本文件可以是已经编好的文件添加进来。(4)打开docs文件夹中README.md文件。可以查看到参数设置信息。设置的仿真库、输出路径、仿真优化参数、仿真参数、库文件等信息。可以查看脚本文件信息。5.1.2芯片验证(5)可以打开sims文件夹中Makefile文件,可以编辑修改。例如脚本:all:compilevsimlib:echo‶startcompileforQuestasim10.6c″vlib$(work)vmapwork$(work)vlog:vlog-incr-sv-work$(work)-ffilelist.f-l$(output)/compile.logcompile:libvlog5.1.2芯片验证vopt:$(vsimopt)-L$(work)-L$(LIB0)-L$(LIB1)-L\$(LIB2)-work$(work)$(work).TB-otopsim:echo‶endofsimulus″vsim$(vsimbatch)-lib$(work)top-l$(output)/simulate.logvsim:voptsimclean:rd/s/qworkdelmodelsim.inidel*.wlf#commandend5.1.2芯片验证上述过程进行完毕准备开始仿真。基本过程是先编译,再仿真,之后查看结果。打开终端输入make命令。例如:makecompilemakevsim启动了Questasim软件,可以在图形窗口界面查看信息。5.1.2芯片验证4)搭建测试系统启动方法2:脚本启动。除了上述.sv文件、.f文件以及Makefile文件之外,新建sim中的.do文件。##TCL#compile.doquit-sim#.mainclearif[fileexistwork]{vdel-all}#buildlibvlibworkvmapworkwork5.1.2芯片验证4)搭建测试系统启动方法2:脚本启动。#vlogvlog-incr-sv-workwork-ffilelist.f-l../opt/compile.log#sim.dovopt+acc=npr-Lwork-LD:/mentor…-workworkwork.TB-otopvsim-libworktop-l../opt/simulate.logsetNumericStdNoWarnings1…5.1.2芯片验证在run.bat中执行run.dorun-all#run.dodo{compile.do}do{sim.do}#run.bat…setbin_path=D:/Mentor/questasim/win64call%bin_path%/vsim-do‶do{run.do}″if‶%errorlevel%″==‶1″gotoENDif‶%errorlevel%″==‶0″gotoSUCCESS:ENDexit1:SUCCESSexit05.1.2芯片验证5)Linux系统环境搭建测试平台Linux下使用VCS编译Helloworld。在工作区建立文件,建好之后,终端输入code打开Vscode软件。在终端输入命令:cd/home/…lspwdmkdirtbsrcsimsoptdocsls-alcode5.1.2芯片验证编写程序与测试同上,Makefile脚本如下:vcs:

vcs-sverilog+v2k-timescale=1ns/1ps-full64-LDFLAGS-WL,\--no-as-needed-kdb-debug_access-ffilelist.fsim:./simv-l../opt/sim.logclean:

rm-rfAN.DBDVEfilescsrcsimv*.simvsimv.daidir\*.simv.daidirucli.keyrm-rf*.vpd*.fsdbrm-rfverdilognovas.confnovas.csrcnovas.rcrm-rf../04_outputs/*.log5.1.2芯片验证打开终端输入命令makevcs运行正常后输入命令makesim启动图形界面检查结果并保存设计。IC芯片UVM环境验证包括完整的UVM组件(sequencer,driver,monitor,agentscoreboard,env,test,referencemodel…);Referencemodel的算法直接调用动态链接库,并比较DUT(DesignUnderTest)计算的结果;包括断言和覆盖率测试;使用.do文件运行。5.1.2芯片验证5.2VerilogHDL设计输入与前仿真

模块module是Verilog语言的基本单元,数字系统用模块集合的形式来描述。模块描述某个电路的功能、结构和与其他模块通信的外部端口。VerilogHDL中各个模块是并行运行的。模块可以调用其他模块的实体。1.Verilog常见的数据类型1)reg类型:作为模块数据存储单元,能够保存值直到下一次赋值。reg数据变量不等于实际的物理寄存器。2)net类型:对应于没有逻辑的物理连接线。net不保存值,但须被assign连续赋值。5.2.1VerilogHDL语言2.Verilog常见的赋值语句1)连续赋值语句连续赋值语句是Verilog数据流建模的基本语句,用于对线网类型如wire进行赋值,等价于门级描述。连续赋值语句必须以关键词assign开始,对应组合逻辑电路。2)过程赋值语句过程赋值语句的对象是reg等变量类型。过程性赋值语句包括阻塞赋值(=)和非阻塞赋值(<=)两种类型的赋值语句,对应组合或时序逻辑电路。5.2.1VerilogHDL语言3.Verilog的不同抽象级别1)结构化描述用门等描述电路功能,最接近实际的硬件结构。通过实例化调用门模块实现。2)数据流描述抽象级别比结构化高,可以直观表达逻辑的行为。通过assign连续赋值语句实现。3)行为级描述抽象级别最高,可直接通过行为语句描述电路功能,不涉及具体电路结构。通过always块或initial块过程赋值语句实现。5.2.1VerilogHDL语言4.Verilog常用于仿真的语法规则1)initial块只会在仿真开始时执行一次,一般用于仿真初始化。2)循环语句包括for循环、forever循环、repeat循环、while循环,for循环将一段代码执行固定次数、repeat循环执行指定次数的循环代码块、forever创建连续执行的代码块并无限循环、while创建一个有判断条件的循环块。3)延时语句一般不可综合,用于激励文件中的仿真控制,格式为#<延时时间>行为语句。5.2.1VerilogHDL语言5.UDT示例moduledff(inputclk,inputrst_n,inputd,outputq);…

always@(posedgeclkornegedgerst_n)begin

if(!rst_n)

q<=1'b0;

else

q<=d;

endendmodule5.2.1VerilogHDL语言5.2.2层次化事件队列

同一段代码交给不同厂家仿真器仿真的结果可能是不同的。同一段代码交给同一个厂家不同版本的仿真器仿真出的结果也可能是不同的。因此需要了解编写的代码到底能不能成功做出芯片,需要了解将使用的EDA工具。在使用VCS之前,先要了解层次化事件队列。Verilog仿真事件队列Verilog内建仿真规范CPU的环境的基于指令的,硬件电路和软件的不同,并发执行。怎么通过软件模拟硬件的并发性?IEEE1364:Verilog语言的仿真基于分层的事件队列。执行事件的队列。仿真时间的计算。Verilog仿真器先从没有延迟的事件开始,执行他们,然后把时间设成0,然后按照时间循序依次执行各个事件。Verilog语言规范没有规定当多个事件被安排在同一个时刻来调度时,应该执行那个。只要在同一层的事件,什么执行顺序都是可以的。设计师必须理解Verilog的分层次仿真事件队列。5.2.2层次化事件队列

层次化事件队列简介详细了解Verilog的层次化事件队列有助于理解很多关于Verilog语言设计的很多规则(例如Verilog的阻塞和非阻塞赋值)。所谓层次化事件队列指的是用于调度仿真事件的不同Verilog事件队列。层次化事件描述如图5.3所示。

出队方向

当前仿真时间事件

活跃事件(顺序随机)

阻塞赋值

连续赋值

非阻塞赋值的右式计算

原语输入计算和输出改变

系统任务:$display

非活跃事件显式0延时阻塞赋值

VerilogPLI的callback例程

非阻塞赋值更新事件

非阻塞赋值产生一个非阻塞赋值更新事件,被调度到当前仿真时间

监控事件

$monitor和$strobe系统任务。Monitorevents有一个独特之处,就是它不能产生任何其他事件。将来仿真时间事件将来事件

被调度到将来仿真时间的事件入队入队入队入队入队5.2.2层次化事件队列

图5.3层次化事件描述5.2.2层次化事件队列

Verilog仿真器先从没有延迟的事件开始,执行他们,然后把时间设成0,接下来按照时间循序依次执行各个事件。Verilog语言规范没有规定当多个事件被安排在同一个时刻来调度时,应该执行那个。只要在同一层的事件,什么执行顺序都是可以的。5.2.2层次化事件队列

Verilog的分层次仿真事件队列步骤:1.读语句:将所有initial、always块和连续赋值语句读进去,将它们按照固定的顺应放到一个队列中。2.执行语句:首先执行没有延迟的语句,比如变量的初始化语句。3.currenttime:当这些没有延迟的语句和initial语句全部执行完,VCS工具就会将时间记为0,就是currenttime。4.进入activeregion区:在这个区间首先执行UDP(UserDefinedPrimitive,用户自定义语言。5.2.2层次化事件队列

Verilog的分层次仿真事件队列步骤:5.进入inactiveregion区:相当于没有#0的语句,该区域的语句执行相对晚一点,这个区域主要执行#0延迟语句。6.进入Nonblockingassignregion区:该区域完成对非阻塞赋值左边的赋值。7.进入monitor区:该区域主要执行monitor函数,比如说监测a的值,当a的值变化,monitor才会监测到。用monitor和display监测非阻塞赋值,monitor监测的赋值后的值,display展示的是赋值前的值。8.进入future区:执行一些其他的语句。5.2.2层次化事件队列

仿真器首先按照仿真时间对事件进行排序,然后再在当前仿真时间里按照事件的优先级顺序进行排序。两个缩写:RHS(right-hand-side)和LHS(left-hand-side)。可以帮助理解阻塞赋值和非阻塞赋值。阻塞赋值属于活跃事件,会立刻执行,这就是阻塞赋值“计算完毕,立即更新”的原因。非阻塞赋值的RHS计算属于活跃事件,而非阻塞赋值的更新事件排在非活跃事件之后,因此只有仿真队列中所有的活跃事件和非活跃事件都执行完毕后,才轮到非阻塞赋值更新事件,这就是非阻塞赋值必须分两拍完成的原因。5.2.2层次化事件队列

大多数Verilog事件是由动态事件队列调度的,这些事件包括阻塞赋值、连续赋值、$display命令、实例和原语的输入变化以及他们的输出更新、非阻塞赋值语句RHS的计算等。在当前仿真时间中,另外两个比较常用的队列是非阻塞赋值更新事件队列和监控事件队列。strobe和monitor显示命令是排列在监控事件队列中。Verilog中所有#0延时的赋值都排列在停止运行事件队列中。采用#0延时赋值会产生问题。因为给Verilog模型附加完全不必要的#0延时赋值,使得定时事件的分析变得很复杂。采用#0延时赋值不推荐使用。5.2.2层次化事件队列

常常用上面介绍的层次化事件队列来解释Verilog代码的行为。【例5.2】

always@(posedgeclk)beginq1<=d;q2<=q1;q<=q2;这种非阻塞赋值设计方式可以保证仿真正确,也可以保证综合正确。如果换成非阻塞赋值设计方式被综合成只有一个寄存器的电路,这个问题从仿真时间队列的角度就非常容易理解。

根据代码、综合电路以及代码仿真一起来理解阻塞赋值和非阻塞赋值。

原则1:时序电路建模时,用非阻塞赋值。

原则2:锁存器电路建模时,用非阻塞赋值。

原则3:用always块编写组合逻辑时,采用阻塞赋值。

原则4:在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值。原则5:在同一个always块中不要同时使用非阻塞赋值和阻塞赋值。

原则6:不要在多个always块中为同一个变量赋值。

原则7:用$strobe系统任务来显示用非阻塞赋值的变量值。

原则8:在赋值时不要使用#0延迟。可综合Verilog模块编写有8条原则:5.2.3VCS仿真基础

数字前端EDA工具目前主流的RTL级功能仿真工具包括:Cadence公司的NC-Verilog。Synopsys公司的VCS(VerilogCompiledSimulator)。Mentor公司的Modelsim。(1)NC-VerilogNC-Verilog是Cadence公司RTL级功能仿真工具NC-Verilog在编译时,首先将Verilog代码转换为C程序,再将C程序编译到仿真器。它兼容了Verilog-2001的大部分标准,并且得到Cadence公司的不断更新。目前在64位操作系统中,NC-Verilog可以支持超过1亿门的芯片设计。(2)Modelsim在RTL级功能仿真领域,Mentor公司的Modelsim是业界应用最为广泛的HDL语言仿真软件,它能提供友好的仿真环境,是单内核支持VHDL和Verilog混合仿真的仿真器。Modelsim可以单独或同时进行行为级、RTL级和门级代码的仿真验证,并集成了性能分析、波形比较、代码覆盖等众多调试功能;同时还加入了对SystemC编译语言的直接支持,使其可以和HDL任意进行混合。(3)VCSVCS是Synopsys公司的编译型Verilog模拟器。VCS具有较高的仿真性能,内存管理能力可以支持千万门级的ASIC设计,而其模拟精度也完全满足深亚微米专用集成电路的设计要求。VCS具有高性能、大规模和高精度的特点。VCS可以方便地集成到Verilog、SystmVerilog、VHDL和Openvera的测试平台中。VCS验证库的验证IP也包含在DesignWare库中,也可以作为独立的工具套件进行嵌入。VCS业界领先的设计人员在从事最先进的设计工作时为其验证环境选择SynopsysVCS©功能验证解决方案。

绝大多数的32nm及以下制程的设计均采用VCS进行验证。

全球顶尖的20家半导体公司大多采用VCS作为其主要验证解决方案,VCS可提供高性能仿真引擎、约束条件解算器引擎、NativeTestbench(NTB)支持、广泛的SystemVerilog支持、验证规划、覆盖率分析和收敛以及完整的调试环境。VCS可提供业内领先的性能和容量,同时支持一整套先进的调试、缺陷查找、覆盖率、验证规划和断言技术。VCS的多核技术可在多台多核机器上并行运行设计、测试平台、断言和调试功能,将验证速度提高2倍,缩短验证时间。VCS的分区编译(PartitionCompile)流程仅重新编译被修改的代码,缩短用户的迭代编译周期多达10倍。VCS还提供一整套全面诊断工具,包括仿真内存消耗和仿真时间解析、交互式约束调试、智能记录等,帮助用户快速分析问题。VCS支持原生的低功耗仿真和UPF格式,在既有的完整的调试手段和高性能仿真的基础之上,可提供创新的电压感知验证技术,定位现代低功耗设计中的缺陷。VCS具有内置调试和可视化环境,支持所有流行设计和验证语言,包括Verilog、VHDL、SystemVerilog、OpenVera™、SystemC™以及VMM、OVM和UVM™等方法学,可帮助用户交付优质的设计。VCS`timescale1ns/100ps`defineCASS1

modulesim_event;regclk,a,z,zin;

always@(posedgeclk)begina=1'b1;#0a=1'b0;end`ifdefCASS1always@(a)#0z=zin;always@(a)zin=a;`elsealways@(a)#0z=zin;always@(a)zin=a;`endif

initialbegin#50clk=1'bz;#50clk=1'b0;#50clk=1'b1;#50$finish;endinitialbegin$vcdpluson();endendmodule从一个例子看不同工具的仿真结果差异仿真的结果VCS仿真的结果:使用VCS编译最后的结果a,z,zin分别是0,1,1。Modelsim仿真的结果:使用Modelsim编译最后的结果a,z,zin分别是0,0,0。

同一段代码交给不同厂家仿真器跑出的结果可能是不同的。同一段代码交给同一个厂家不同版本的仿真器跑出的结果也可能是不同的。插入说明——VCS示例

VCS入门此电路为一位加法器fa.v组成4位加法器add4.v,再组成一个8位加法器,使用资源换性能的思路,减小了行波进位加法器的进位延迟。顶层文件为add8.v,testbench为addertb.v。例:使用VCSlabs里面lab1的Verilog源码做一些示例。输入窗口中命令回车即可编译verilog文件,其中-lreadme.log用于将编译产生的信息放在log文件内。+v2k是使VCS兼容verilog2001以前的标准。-debug_all用于产生debug所需的文件。VCS入门./simv-lrun.log开始仿真,testbench里的$display打印仿真成功的信息,显示在终端上。使用-lrun.log记录终端上产生的信息。VCS入门使用./simv-gui命令打开图形化界面DVE,选中所有信号→右键AddtoWaves→NewWaveViewVCS入门点击1处的小箭头,便有波形出现。使用2处的三个按钮(预览全局、放大和缩小)调整波形。在3处鼠标左键按住不动,左右拖动即可选取一个观察的时间范围。VCS入门考虑一个更复杂的情形。假设现在顶层模块变得十分复杂,里面包含很多的.v文件,再像上述那样将所有文件敲在终端上便很麻烦。编译选项-f可以解决这个问题。VCS入门在工作目录下新建一个verilog_file.f文件,将所用到的verilog源码以及路径写入文件,并保存退出。使用-fverilog_file.f选项,即可将.f文件里的源码全部编译。以下有其他常用编译选项,注意各个编译选项的顺序,有时出错需要调整。1)-R编译后立即运行,即编译完成后立即执行./simv2)-Mupdate源文件有修改时,只重新编译有改动的.v文件,节约编译时间。3)-sverilog打开对Systemverilog的支持,编译Systemverilog文件时使用。4)-timescale=1ns/1ns设置仿真精度5)-osimv_file编译默认产生的可执行文件为simv,可以使用-o更改可执行文件名。VCS入门再考虑一种情形,当使用到VCS更多其他功能时,编译选项会变得很长,在终端上一个一个敲变得十分不方便,便可以使用makefile来帮助我们编译仿真。在工作目录下新建一个makefile文件。.PHONY:comsimspotlessOUTPUT=adder_topVCS=vcs-sverilog+v2k-timescale=1ns/1ns\ -debug_all \ -o${OUTPUT} \ -lcompile.log \SIM=./${OUTPUT}-lrun.logcom: ${VCS}-fverilog_file.fsim: ${SIM}clean: rm-rf./csrc*.daidir*.logsimv**.keyVCS入门makefile完成以后,在终端上输入makecom后回车,相当于在终端中输入以下内容后回车,进行编译。输入makesim相当于:输入makeclean相当于:清除一些中间文件。vcs

-sverilog

+v2k

-timescale=1ns/1ns-debug_all-oadder_top\

-lcompile.log-fverilog_file.f

./adder_top-lrun.log

rm-rf./csrc*.daidir*.logsimv**.key

VCS入门VCS+VERDI+MakefileVCS可编译C、C++、Verilog、SystemVerilog等文件,编译后生成simv可执行文件进行仿真。Verdi最开始是由novas公司设计的,2012年由Synopsys公司间接收购。除了源代码浏览器的标准功能(原理图、状态机图和波形比较),Verdi平台还具有自动跟踪信号活动的高级功能。Verdi主要用于仿真波形的查看,有助于快速定位和解决设计错误,加速IC设计流程。Makefile的好处就是自动化编译和仿真。VCS和VERDI都适合在Linux环境下使用,搭配Makefile使用非常方便。仿真流程

1.需要文件:(1)需要仿真的.v文件。一般包含rtl文件和测试激励testbench。##需要注意:对于用于仿真的testbench,需要额外建立一个initial块,调用产生有关fsdb

格式的波形文件:首先调用fsdbDumpfile

函数,产生一个叫.fsdb

的波形文件;然后调用fsdbDumpvars

函数,声明需要保存那些信号的波形,括号内不加任何参数,则默认全部保存。initialbegin$fsdbDumpfile("./fp_mul.fsdb");$fsdbDumpvars();end(2)filelist.f文件filelist.f里存放所有需要仿真的.v文件。创建filelist.f的方法:

find-name"*.v">filelist.f仿真流程

Makefile文件

#Makefileforsimulinktheproject#-------------------------------------------------------exportTEST_NAME

=

fp_mulFILE_LIST

=

filelist.fPLATFORM

=LINUX64waveform

=

$(TEST_NAME).fsdb

vcs_all:

clean

vcs_compile

vcs_simulatevcs_compile:

vcs-notice-debug_acc+all-j8-timescale=1ns/1ps\

-sverilog-LDFLAGS-rdynamic-full64\

-P$(VERDI_HOME)/share/PLI/VCS/$(PLATFORM)/novas.tab

\

$(VERDI_HOME)/share/PLI/VCS/$(PLATFORM)/pli.a

\

-f$(FILE_LIST)

\

+vcs+lic+wait

\

-lvcs_com.logvcs_simulate:

./simv

\

+fsdb+autoflush

\

-lvcs_sim.logrun_verdi:

verdi-nologo-sv-f$(FILE_LIST)-ssf

$(TEST_NAME).fsdb

&clean:

@rm-rfcsrc

DVEfiles

simv

simv.daidir

ucli.key

novas*VCS**dat

说明

VCS仿真分为两个步骤:编译(vcs_compile)+仿真(vcs_simulate)。具体详见VCS常见编译参数说明。verdi表示启动Verdi工具的命令。-nologo表示启动Verdi时不加载欢迎界面。-ssfdump.fsdb表示指定Verdi可识别的波形文件dump.fsdb,该文件可由-ucli接口命令生成。&表示Verdi启动时新打开一个进程,不占用当前的shell环境进程。输入命令:find-name"*.v">filelist.f这一步生成filelist.f文件。这里包含alu.v和alu_tb.v文件。makevcs_all

这一步先编译上述设计文件,并生成fsdb的波形文件供verdi读入。makerun_verdi

这一步启动verdi并加载波形文件。此时veridi已经打开,鼠标点击信号,键盘按键Ctrl+w,即可将对应信号添加到波形图中。说明

UCLI/TCL命令行可以直接修改脚本完成对dumpfsdb的控制。dump_fsdb.tcl的脚本如下:globalenvfsdbDumpfile"$env(TEST_NMAE).fsdb"fsdbDumpvars0"top_tb“runTCL脚本引用环境变量;设置波形文件名称,名称受$env(TEST_NMAE)控制;fsdbDumpvars(0)表示会dump所有层次的信息;设置完dump信息,启动仿真。此时仿真器受UCLI命令行控制。5.2.3VCS仿真基础1.仿真基础VCSSimulationbasics5.2.3VCS仿真基础使用VCS的先决条件:了解数字集成电路设计,熟悉Linux或Unix操作系统,熟悉基于Linux的文本编辑器。VCS接收Verilog,SystemVerilog,C/C++PLI(

ProgramLanguageInterface)等各种语言描述的设计,VCS将各种语言统一翻译成C文件(.c),之后转换为目标文件(.o),最终转化为可执行文件(PLI代码连接到simv)。使用VCS仿真Verilog/SystemVerilog设计。使用VCS调试VeriIog/SystemVerilog设计。为设计运行快速的RTL级回归测试。RunfastiGate-Levelregressiontestsforyourdesign(回归测试:运行所有已通过的测试用例以验证有没有“退化”情况发生,这个过程就是一个“RegressionTest”。)获得使用VCS成功实施覆盖率驱动的验证方法的技能和知识。代码覆盖率,功能覆盖率。本节目标VCS全称VerilogCompilerSimulator,是Synoposys家的编译型Verilog模拟器,可编译

C++、Verilog、SystemVerilog等文件,编译后生成simv可执行文件进行仿真。Verdi除了源代码浏览器的标准功能(原理图、状态机图和波形比较),还具有自动跟踪信号活动的高级功能。Verdi主要用于仿真波形的查看,有助于快速定位和解决设计错误,加速IC设计流程。Makefile的好处就是自动化编译和仿真。VCS和VERDI都适合在Linux环境下使用,搭配Makefile使用非常方便。VCS+VERDI+MakefileVCS编译命令格式$VCSsource_files[compile_time_options]source_filesDUT(DesignUnitTest)的源文件,用空格分隔多个源文件。编译时选项:如何去编译,可视化,编译的性能。生成模拟二进制可执行文件simv(二进制可执行文件)基本的编译VCS仿真分为两个步骤:编译(compile)+仿真(simulate)。简单的步骤如下:

1.准备好.v文件:开始VCS之前要准备好.v文件。2.启动VCS:准备好将要编译仿真的.v文件之后,启动VCS,在终端窗口输入命令举例如下:vcsadd.v-lreadme.log+v2k-debug_all其中-lreadme.log用于将编译产生的信息放在log文件内,+v2k是使VCS兼容Verilog2001以前的标准,-debug_all用于产生debug所需的文件。5.2.3VCS仿真基础VCS仿真分为两个步骤:编译(compile)+仿真(simulate)。简单的步骤如下:

3.编译之后开始仿真。在终端输入命令,例如:./simv-lrun.log开始仿真,testbench里的$display打印仿真成功的信息,显示在终端上。使用-lrun.log记录终端上产生的信息。5.2.3VCS仿真基础VCS仿真分为两个步骤:编译(compile)+仿真(simulate)。4.打开图形化界面观察波形结果,看结果是不是想要的。在终端使用命令,例如:./simv-gui可以在打开的窗口界面添加并调整观察波形。如果情况更加复杂,假设顶层模块十分复杂,里面包含很多.v文件。编译选项可以添加-f,在终端输入命令例如:vcs-fv_file.f-lreadme.log+v2k-debug_all在工作目录下新建一个v_file.f文件,将所有到的Verilog源码以及路径写入文件,并保存退出。使用-fv_file.f选项,即可将.f文件里的源码全部编译。有其他常用编译选项,注意各个编译选项的顺序,有时出错需要调整。5.2.3VCS仿真基础当使用到VCS更多其他功能时,编译选项会变得很长,在终端上一个一个输入将变得十分不方便并且容易出错,这时可以使用makefile。makefile带来的好处就是自动化编译和仿真。make命令格式:make[option][target]…makefile语法形式可以为(形式不唯一):target:prerequisites command其中prerequisites是目标所依赖的文件,command是命令行。5.2.3VCS仿真基础例如makefile文件中:sim: ./simv+fsdb-lvcs_sim.logdve:dve-vpdvcdplus.vpd&clean:rm-rf*.logsimv.h*.key*.vpd*.vdb*.fsdb5.2.3VCS仿真基础2.调试基础VCSdebuggingbasics5.2.4VCS调试1.为什么要调试Bug用于描述计算机程序或系统中的错误,缺陷或故障常见术语。Debug(调试)可以发现并减少计算机程序或电子硬件中的错误或缺陷数量,Debug是一种有条理的过程。当各个子系统紧密耦合时,调试会变得更加困难,因为一个子系统中的更改可能会导致另一个子系统中出现错误。Bug历史上珍贵的记录Bug的产生原因多种多样,千奇百怪,例如:改错了文件改对了文件,但放错了位置,或者根本忘了保存改对了文件但没有重新编译认为把那个条件变量开启/关闭了,但实际上弄反了运行了错误的版本改正了问题,但忘了提交改正了问题,也提交了,但其他代码都依赖于之前有问题的版本等软件系统是一个丰富多彩的世界,总有Bug在里面飞来飞去。任何软件在发布时都不可能是绝对的零Bug,因为谁都不敢保证,自己写的代码没有任何问题。程序代码中Bug的产生原因Debugger为一种调试软件,工程师或程序员可以用来验证算法。在一般的硬件设备上,都有着专门用于debug的接口,在不太遥远的DOS世界里,一行debug命令可以起到让操作系统初始化的效果。在Linux平台上,一般使用GDB,又称GNU调试器,是用来帮助调试程序的工具。gdb的主要功能如下:启动程序,可以按照自定义要求随心所欲的运行程序。可让被调试的程序在指定设置的断点处停住。(断点可以是条件表达式)当程序被停住时,可以检查此时程序代码中所发生的事。还可以改变程序代码,修正一个BUG产生的影响从而测试其他BUG。Debugger是程序5.2.4VCS调试VCS调试可以跟踪和定位错误原因,常用的调试方法有三种:Verilog、Systemerilog、SystemTaskCalls(系统task);VCSUCLI(UnifiedCommand-line

Interface)命令行;VCSDVE(DiscoveryVisualEnvironment)(GUI),Verdi也可以用来调试。5.2.4VCS调试2.调试要考虑的四种因素仿真速度:速度往往与很多因素有关,速度与编写的代码有很大关系,速度也与仿真级别有关,行为级要比RTL级快,另外图形窗口打开得多也会拖慢速度等;信号的可视性。信号的可追踪性:只有信号可以追踪定位,才容易找到错误的原因,从而进行调试。信号的可视性往往与可追踪性联系紧密,因为可视才更易追踪。可用性:SystemTask的方式调试可见性有几条常见命令:$display,$strobe,$monitor,(这三条命令之间的差异是打印信息的时间不同)$time(可以返回当前仿真时间,不是CPU时间)。5.2.4VCS调试3.这些命令在Verilog程序中的示例moduleadd_test;…initialbegin$monitor(attime=%0d,“%h+%h=%h”,$time,a,b,sum);end//当变量发生变化打印出来。…if(sum!==(a+b))begin$display(“******ERRORattime=%0d******”,$time);$display(“a=%h,b=%h,sum=%h”,a,a,sum);$stop;//停下来end…$display(“****TestbenchSuccessfullycompleted!****”);$finish;…四个变量发生变化,打出来嵌入Verilog系统任务调用停下来,给个UCLI%InstantiatedDUTPrintadderresultwheneverinputor

outputofadderchangesStimulusgenerationVerifyresultsIndicatecompletionoftestDUT5.2.4VCS调试4.通过UCLI调试同样要考虑以上四种因素信号的可视性可以用户指定,支持脚本编写并于TCL8.3兼容,任何TCL命令都可以与UCLI一起使用。UCLI是命令行形式。如果编译与仿真一步走,UCLI命令如下:$vcssource.v-debug|debug_all-R–ucli如果编译与仿真两步走,UCLI命令如下:$vcssource.v-debug|debug_all$simv-ucli5.2.4VCS调试如不想对testbench进行改动,也不想重新编译仿真顶层来修改fsdb信息,可以直接修改脚本完成对dumpfsdb的控制,可以用UCLI命令行来dumpfsdb。dump_fsdb.tcl的脚本如下:globalenvfsdbDumpfile"$env(TEST_NMAE).fsdb"fsdbDumpvars0"top_tb"runTCL脚本引用环境变量。设置波形文件名称,名称受$env(TEST_NMAE)控制;这个TEST_NMAE是从仿真的Makefile文件中,通过exportTEST_NMAE得到。CS_OPTIONS

=

+vcs+lic+wait

+v2k

+systemverilogext+.sv

+verilog2001ext+.v-Mupdate-debug_acc+all

-debug_region+cell+encrypt

+lint=all,noIEELMME,noTMR,noVCDE-timescale=1ns/1psUVM_OPTIONS_COMPILE

=

-lca-kdb-debug_access+all

-debug_access+r+w+nomemcbk-debug_region+cell-debug_pp

+vpi-sverilog$(UVM_HOME)/src/dpi/uvm_dpi.cc-CFLAGS-DVCSvcs_verdi_fsdb:pkilldve.exe||

true$(RUN_CMD)vcs$(VCS_OPTIONS)$(UVM_OPTIONS_COMPILE)-f$(FILE_LIST)|tee./compile_vcs.log$(RUN_CMD)./simv-l$(MY_VCS_LOG)-ucli-imy_uvm.tcl

1200ms

+UVM_TESTNAME=$(TEST_NAME)Verdi或者VCS仿真时查看波形VCS编译选项需要添加-debug_ppVerdi3.调试DebuggingWithDVE//----------------------------//FileName :fsm_moore.v//Author :JinYawei //Date :2024-09-21//----------------------------//`defineINC_COUNTER//`include"global_define.vh"`timescale1ns/1nsmodulefsm_moore(//Inputsinput clk,input rst_n,//Outputsoutputreg[3:0]dout,outputreg[2:0]q);基础的源文件是fsm_moore.v和fsm_top.v,其中后者是testbench。VDE调试//------Parameterdefine------------parameter[1:0]idle=2'd0, s1=2'd1, s2=2'd2, s3=2'd3;reg[1:0]state,next;//-------------------------------------//-------Stateconvert---------------always@(posedgeclk,negedgerst_n)if(!rst_n)state<=idle;else state<=next;//-------------------------------------//-------Statedecode&output-------always@(*)beginnext=idle;dout=4'd0;case(state) idle:begin dout=4'd0; next=s1; end

endmoduleVDE调试VDE调试 s1:begin dout=4'd1; next=s2; end s2:begin dout=4'd2; next=s3; end s3:begin dout=4'd9; next=idle; endendcaseend//counteralways@(posedgeclk,negedgerst_n)begin if(!rst_n)q<=3'd0; `ifdefINC_COUNTER else q<=q+3'd1; `else else q<=q-3'd1; `endifend//-----------------------------------endmodule//---------------------------------------------//FileName :fsm_top.v(fsm_moore.sv)//Data :2023-07-21//---------------------------------------------`timescale1ns/1nsmodulefsm_top; regclk; regrst_n; wire[3:0]dout; wire[2:0]q; //Definetherunnumberwithinitialparameter integerrun_num=20;

VDE调试 //Defineanarray reg[7:0]mem[0:15]; integeri; //Generateclk initialbegin clk=1'b0; forever#5clk=~clk; end

VDE调试 //Generaterst_n initialbegin //if{$value$plusargs("run_num=%0d",run_num)}begin //$display("Therun_numis%0d",run_num); //endelsebegin //$display(Sorry!Cannotgerrun_num"); //end

//Calltask print_message();

VDE调试 rst_n=1'b1; repeat(2)@(posedgeclk); rst_n=1'b0; //After2posedgeclk,rst_n=0 repeat(2)@(posedgeclk); rst_n=1'b1; repeat(run_num)@(posedgeclk);

$display("FinishSimulation@[%0t]",$time); $finish; end

VDE调试VDE调试 //$readmemh{}test //initialbegin // $readmemh{"./src,txt",mem} // // for(i=0;i<10;i=i+1)begin // $dislpay{"mem[%2d]=%0d",i,mem[i]} // end //end //DPItest import"DPI"functionvoidhello(stringstr);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论