验证基础问答

验证基础问答
1.1理论基础
1、什么是验证?
验证是确保设计与预定的设计期望一致(吻合)的过程。
2、什么是验证平台/验证环境?
验证平台:产生一个或多个激励;将激励发送到设计的输入中;将输出进行比较,看结果是否正确。
3、验证的难点
(1)如何产生全部的激励;(2)如何检查结果的正确性。
4、功能验证流程
(1)制定验证策略和验证计划;(2)创建验证平台,运行和测试;(3)覆盖率分析和回归测试。
回归测试:①要求所有test都通过,在很长时间(两周/一个月/三个月)稳定,不会出现新的错误;
②分析coverage,代码覆盖率:可解释的100%;功能覆盖率的100%。所有的功能都测试到了,
验收:①所有的功能都通过了;②所有的test都通过了;③coverage 100%。
5、验证的手段?、
(1)黑盒验证:DUT内部不可见,指的是只通过边界信号来验证一个模块或者设计的功能。其缺点:①很难验证和设计相关的特点。②很难调试。③要求一个精确地参考模型。
(2)白盒验证:DUT内部完全可见,可以不需要参考模型,通过在设计内部或外部输出的信号放置监控器和断言来保证设计操作的正确性。
(3)灰盒验证:DUT内部部分可见,在设计内部添加监控器和断言来减少对参考模型的精确要求,在错误发现的时候也减少调试压力。
6、验证可能出现的错误?
(1)从来没有被激发过的错误;(2)被激发过的错误没有被传递出来;(3)多个潜在的错误掩盖了其他错误。
7、代码覆盖率?
略;
总结:1)覆盖率数据只能代表你测试过哪些代码,不能代表你是否测试好这些代码;2)不要过于相信覆盖率数据;3)不要只拿语句覆盖率(行覆盖率)来考核测试人员;4)路径覆盖率>判定覆盖率>语句覆盖率;5)测试人员不能盲目追求代码覆盖率,而应该想办法设计更多更好的案例,哪怕多设计出来的案例对覆盖率一点影响也没有。
8、功能覆盖率
功能覆盖率:代表设计要求的功能中有多少被验证了。
1)覆盖点(coverage points):即单个标量值或表达式的抽样。目的确保所有感兴趣的和相关的值可以在一抽样的值或表达式中被观测到。
2)交叉覆盖率(cross coverage):度量同一点多个标量值的结合。可以涉及两种或多种覆盖点的结合,只能用于同一类的覆盖组。
3)传输覆盖率(transition coverage):度量一系列值得存在和发生,可以包括统一的覆盖点上超过两个的连续不断地值。
9、覆盖率驱动验证(coverage driven verification CDV)?
覆盖率驱动验证的方法最重要的特点是基于随机激励产生。随机激励生成是提高效率的最主要的原动力。
覆盖率驱动验证方法学把下面几个概念和技术融合到一块:事务级验证、约束随机激励产生、自动化结果比较、覆盖率统计分析和直接测试。
事务级验证:在一个更高的抽象层次来创建验证场景。
约束随机激励产生可以获得更高的效率,为生成验证场景和自动化结果比较提供比较充分的保证,设计能够在各种随机的情况下被验证。覆盖率统计是必须的,若没有覆盖率统计,就没有办法清晰地分析哪个场景被随机生成过。直接测试也是必须的,因为最终不可能全部的场景都能够随机生成。
10、验证存在的挑战
1)完备性:验证完备性的挑战就是如何最大限度地验证被测设计的行为。难点在于如何获取所有必须被验证的场景。在这个领域最重要的进步是采用覆盖率驱动的验证方法学,其要求制定一个可以数量化衡量完备性,可追踪,有组织的验证计划。
2)可重用性:重用可以通过以下几个方式来实现:模块化验证组件、采用标准的接口,将激励产生机制和验证架构分离等。
3)可靠性:减少在完成一个验证项目中的手工操作。约束随机验证是一个提高可靠性的好方法,通过搭建一个自动化的系统来产生激励和自动比较,进而提高可靠性。
4)效率:提高验证效率可以通过提高验证平台的抽象层次和采用重用的。
5)性能:
1.2 SV
1、2值与4值逻辑?
四值逻辑:1、0、X、Z,默认时为X;二值逻辑:1、0,默认时为0。例如logic,但要求logic不能有多个结构性的驱动;相对于四值逻辑,二值逻辑数据类型有利于提高仿真器的性能并减少内存的使用量。二值逻辑超出边界读数会读到X。
2、有,无符号数?
见导图
3、合并数组与非合并数组?
合并数组初始化,可以对其所有元素统一赋值,存放方式是连续的比特集合;非合并数组初始化,需要通过‘{ }来对每一个维度的元素分别赋值。复制:合并与非合并,无法相互直接赋值。
4、动态数组?
声明:使用空的[ ],调用new[ ]来分配空间,系统函数 $ size 的返回值是数组的宽度。
5、队列及其中方法?
声明:[ $ ];可以在队列中的任何地方增加或者删除元素。元素是连续存放的,所以在队列前面或者后面存取数据是非常方便的。
6、关联数组?
大容量的数组,用来保存稀疏的矩阵。
7、枚举?
枚举类型enum经常和typedef搭配使用,由此便于自定义枚举类型的共享使用。枚举类型有常用的内置方法:function enum first( );function enum last( );function int num( )等。有利于编写和维护代码。
8、数组的一些方法?
使用对象:非合并的,定宽数组,动态数组,队列,关联数组。
sum(求和),product(求乘积),and,or,xor。min,max,unique。sort(从小到大排序),rsort(从大到小排序),reverse(逆排序),shuffle(乱序),find_first(查找第一个元素),find_first_with_index(查找第一个元素的下标)。
带条件语句with的,item表示数组中的单独元素,x表示判断真假的返回值(1或0)最后得到一个序列,或是该序列的相应操作。
9、join三个线程?
fork…join:内的所有语句都是并发执行(对于begin…end内部是顺序执行)。
fork…join_any:一旦fork…join_any内任何一个线程完成,父线程就会继续运行。
fork…join_none:子线程和父线程会同时执行。
10、function与task的区别?
task可以置入耗时语句,function不行;function有返回值,也可以设置返回值为空:viod function;task在任务结束前使用return返回;task可以调用task/function,function只能调用function。
11、什么是void function?
没有返回值的function。
12、static/automatic ?
static:module和program子程序默认是静态存储。
automatic:自动存储模式,函数与任务的重入成为可能。
13、$ random( )和 $ urandom( )的区别?
$ random( ):系统随机化调用函数,返回32bit有符号数; $ urandom( ) :系统随机化调用函数,返回32bit无符号数;
14、rand与randc的不同之处?
rand:每次随机取的值概率是相同的;randc:取值具有周期性随机;二者的区别:是否抽样放回。
15、SV预定义的随机化方法?
1)randomize( );2)pre_randomize( );3)post_randomize( )。
16、怎么调用一个定义在父类里的task?
super.task_name( );
17、什么是this?
指向当前class。
18、local/protected关键词的作用?
local就是本地变量,在父类中定义,其子类中不能调用;
protected就是保护变量,在父类中定义,其子类中可以调用,但是外部代码仍不能操作该变量。
19、为什么使用package?
打包作为一个整体来访问。package更多的意义在于将软件(类、类型、方法等)封装在不同的命名空间中,以此来与全局的命名空间进行隔离。定义的package名称独一无二,其内部定义的类也应该尽可能地独一无二。
使用方法 import pkg_name: : *
20、program和module的区别?
两者的代码运行的时间域是不同的,可以避免一些竞争与冒险。
1)module里可以定义program,而program里不能定义module。
2)是module里不能调用program里定义的task,、function,而program可以调用module里定义的task和function。
3)program里不能例化module、interface、其它program,也不能包含always块·。
4)最主要的区别是program是在inactive时域执行的,而module在active时域执行的,所以program在module后执行,可以解决竞争冒险现象。
21、virtual interface?
多数直接用virtual interface,而不用interface,testbench与RTL code可以单独分开来,使用的过程中可以把一个实际的interface将动态环境与 RTL code连接起来。
22、$cast
静态:用于数据类型转换。
动态:枚举;类的向下转换;父类句柄指向对象是真正的子类对象时,可以使用 $cast。
23、什么是多态?
多态:当一个类派生出子类的时候,基类中的一些方法可能需要被重写,对象中的类型来决定调用方法的实现方式,通常这是一个动态的过程,动态的选择方法的实现叫多态。
虚方法的重写与实现就是多态。
如果我们想要重写某个方法,就可以在父类中声明为虚方法;一旦一个方法被声明为虚方法,他的后续继承过程中将永远是一个虚方法,不管重写的时候是否使用virtual关键字,也就是说,在父类中声明了虚方法,子类中重写的方法可以不使用关键字virtual。
1.3 UVM
1.3.1 UVM平台架构
1、结构:
分层的验证结构,它的组件是什么?每一个类的基类是什么?是怎么通信的?怎么连接的?怎么去启动,运行,结束,打印信息?
1)组件有哪些?uvm_component
uvm_test;uvm_env;uvm_agent;uvm_sequencer;uvm_driver;uvm_monitor;uvm_scoreboard;(uvm_subscriber);
uvm_driver:功能主要就是向sequencer索要sequence_item(transaction),并且将sequence_item里的信息驱动到DUT的端口上,这相当于完成了从transaction级别到DUT能够接受的端口级别信息的转换。
uvm_monitor:功能主要是从DUT的端口上接收数据,并且把接收到的数据转换成transaction级别的sequence_item,再把转换后的数据发送给scoreboard,供其比较。
uvm_scoreboard:功能就是比较reference model和monitor分别发送来的数据,根据比较结果判断DUT是否正确工作。
uvm_agent:只是把driver和monitor封装在一起,根据参数值来决定是只实例化monitor还是要同时实例化driver和monitor。agent的作用主要是从可重用性的角度考虑的。
uvm_sequencer:功能就是组织管理sequence,当driver要求数据时,它就把sequence生成的sequence_item转发给driver。
uvm_env:env将验证平台上用到的固定不变的component都封装在一起。这样,当要运行不同测试用例时,只要在测试用例中实例化此env即可。
uvm_test::所有的测试用例要派生自uvm_test或其派生类,不同的测试用例之间差异很大,所以从uvm_test派生出来的类各不相同。任何一个派生出的测试用例中,都要实例化env,只有这样,当测试用例在运行的时候,才能把数据正常地发给DUT,并正常地接收DUT的数据。
2)连接?
uvm_* _ port;
uvm_*_socket(2.0版本)
3)产生数据建模的时候?数据
uvm_transaction;
uvm_sequence_item
4)怎么run和结束UVM平台?
首先 Compile with -ntb_opts uvm-1.1 switch 然后 Specify test to run with +UVM_TESTNAME switch
① Compile with vcs(using UVM in VCS installation)
vcs -sverilog -ntb_opts uvm-1.1 test.sv
② Simulate with
simv +UVM_TESTNAME
③要在TOP.SV中写一个
initial begin
run_test( );
end
2、UVM PHASE
1)有哪些phase?
共有9个phase,主要记住build_phase;connect_phase;run_phase;report_phase;
每个的作用是什么?——build_phase创建和配置测试平台的结构;connect_phase 建立组件之间的连接;run_phase 激励设计;report_phase 报告测试结果。
其中run_phase中要了解reset_phase;configure_phase;main_phase;shutdowm_phase。
reset_phase对DUT进行复位,初始化等操作;configure_phase则进行DUT的配置;DUT的运行主要在main_phase完成;shutdowm_phase则是做一些与DUT断电相关的操作。
2)phase怎么同步?
有一个同步机制来同步所有phase;所有组件里同一个phase执行完,才会执行下一个phase。在不同的phase之间可以通过objection机制来控制。
3)top-dowm 和 down-top
top-dowm:build_phase和final_phase;
down-top:connect_phase;run_phase;end_of_elaboration_phase;start_of_simulation_phase;report_phase;check_phase。
4)function与task?
只有run_phase是task。其余都是function。
5)new/create/build函数之间的区别?
new函数就是class里产生它的对象;build函数是个phase,产生组件,其中有factory机制;create函数就是调用UVM里的factory 机制去产生对象。
3、Reporting 机制
'uvm_fatal;'uvm_error;'uvm_warning;都会打印出来。
'uvm_info具有打印等级,低至高等级:UVM_MEDIUM、UVM_HIGH、UVM_FULL、UVM_DEBUG。
其默认只会显示uvm_medium或uvm_low
4、UVM transaction
transaction 就是把具有某一特定功能的一组信息封装在一起而成为的一个类。
产生数据结构的,它预定义了一些方法,如:copy( )、compare( )、print( )、pack( )、unpack( )等;可以直接调用;也可以自己写,使用override do_methods( )。
5、UVM sequence
一个完整的sequencer 包括哪些类:uvm_sequence;uvm_sequence_item;uvm_sequencer;uvm_driver;uvm_agent。
UVM启动方式分为手动启动和自动启动,手动启动:直接在tc中例化sequence,main_phase通过调用start( )函数指定某个sequencer启动。自动启动:在env或test的build phase中通过设置default_sequence启动。
6、UVM callback
如何实现一个callback?
①在组件里注册一个空的callback函数;在使用的run_phase里加两个接口,一个叫pre_NAME;post_NAME;
②去实现一个假(空)的类,这是一个模板;
③在真正应用的时候,去括展你的callback模板,然后在组件里添加方法。
④在test仿真的过程中,把callback函数添加到driver里;使用add函数就可以了。
作用:留了一些接口,为了后续仿真的过程中注入一些特殊的需求(注入error和收集覆盖率 )。
7、UVM configure
uvm_config_db
config_db机制用于在UVM验证平台间传递参数。它们通常都是成对出现的,set函数是寄信,get函数是收信。
8、UVM factory
factory 机制在不修改整个testbench的情况下,用factory机制去把一些组件的行为给修改掉。
如何实现:
① factory instrumentation/registration
其组件一定是:'uvm_object_untils(transaction_type);'uvm_component_untils(component_type) 这么注册出来的。
② construct object using static proxy class method
class_name obj = class_name ::type_id::create( );
其组件是通过create的方式创建的
③class override
set_type_override_by_type( );
set_inst_override_by_type( );
写一个新的组件可以使用自带的方法(上面两个)去修改掉原来的行为;可以用来注入错误或者覆盖率收集等;callback是去修改其函数,factory机制是完全覆盖掉了。
9、UVM TLM 1.0 端口
TLM:Transaction Level Modeling,transaction level是相对DUT中各个模块之间信号线级别的通信来说的。
三种端口:PORT;EXPORT;IMP,优先级由高到底。
三种操作:put,get,transport;都具有阻塞与非阻塞之分。
阻塞操作:是等在那里,一直等到某个组件处理完事情,然后接收新的数据。
非阻塞操作:不等待,直接返回,至于后面是过段时间继续发还是直接放弃不发了,则要看代码编写者的行为。
analysis,analysis_port可以连接多个IMP,analysis_port与IMP之间是一对多的通信。
FIFO,FIFO的本质是一块缓存加了两个IMP。
10、寄存器模型(RAL)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值