功能coveragre
Coverage类型: code/functional/assertion coverage;
code coverage: 衡量设计的实现情况,测试对于设计规范的实现测试的有多彻底;1.行覆盖率2.路径覆盖率3.条件覆盖率4。翻转覆盖率5.状态机覆盖率
functional coverage:与设计意图紧密相连(搞清楚design关键特性、边界情形、可能的故障模式----只测你想知道的)
assertion coverage: 可以跟随设计和测试平台一起仿真—bind 将if例化在dut内部,可以监测dut端口signal 以及内部这一层的signal(注意与if进行区别);
功能coverage & 代码coverage 高低分别代表什么? Fun.低、cod.低出现在 验证早期;验证进行到一定程度时,代码coverage低、功能coverage高:(验证计划不完整)回到设计规范更新验证计划代码coverage低、功能coverage低:换用不同的种子进行随机测试,看是否提高,如果咩有明显作用,可以新增一些corner case;;代码coverage高、功能coverage低:查看是否将验证定位到感兴趣的状态上;
关于functional coverage:
covergroup定义、创建、采样part:
覆盖率—如何限制自动创建bin的数目?---如何自定义bins?---如何 控制是否采样1.iff 2.采样时设置实例名.start/stop 3.option.weight=0;---是否认识wildcard?---如何扣除连续仓中的个别仓?---指明非法仓?---收集单个覆盖组的coverage;---交叉覆盖率的收集;----翻转覆盖率中的连续重复、跟随重复、非连续重复;----仿真过程中的coverage收集:$get_coverage;
确定仓被命中几次:hits; 规定至少一个仓命中8次后,对应的组合就被测试到:option.at_least=8;
面向对象programming
类的三大属性及应用:继承:允许一个类得到一个新的类并共享变量和子程序;为了构建可重用的组件,OOP技术提供一种通过创建派生类创建层次结构的机制-UVM;多态怎么理解?虚方法的重写和实现(子类可以对父类方法进行显式调用super.new());
解释sv中的deallocation机制---分辨是否要回收?与c++有何区别?;
New()和new[ ]的异同 申请内存&初始化变量
Class中如何进行静态变量的声明和访问;
This是什么意思:告诉sv引用类一级变量;
简述如何在一个类内使用另一个类;编译顺序
Ref 关键词的理解
解释浅拷贝与深拷贝(实质,拷贝对象是否拥有自己独立的内存空间):创建一个新object,并复制了现有对象的所有变量(只有最高一级的对象被new复制)
OOP访问对象的方法:公有方法get(),put();
OOP在uvm中的应用:测试平台和设计细节分开:eg. Sequence产生;
句柄和对象怎么区分:一个句柄可以指向多个对象;
OOP规则指出:指向基类的句柄可以指向派生类对象;因为句柄可以引用其中的变量和方法;调用 句柄.fun时候判断它调用的是基类还是子类的方法的方法:看句柄中对象的类型 。
如何理解blueprint的?blueprint的构建和随机化分开;
$cast定义:将一个指向基类的指针转换成指向派生类的指针;(sv会对句柄类型做静态检查),不通过则不会被编译;如何使用$cast做强制类型转换:1.用子类句柄指向一个创建的子类对象2.基类句柄指向子类对象3.$cast(子类句柄,基类句柄);
多态的概念:OOP中多个子程序使用一个共同的名字的现象(虚方法的重写和实现)----解决色问题:如何在一个物理空间很小的情况下让处理器能够对一个很大的地址空间寻址---引入虚拟内存的概念,程序的代码和数据可以保存在内存中或磁盘上;
如何理解抽象类和纯虚方法?抽象类:可以被扩展但不能被直接实例化的类—virtual class, 纯虚方法:一种没有实体的方法原型。只有虚方法都有实体的时候,由抽象类扩展而来的类才能被例化;只要类中存在一个没有具体实现的纯虚函数,OOP规则就不允许例化这个类;
怎么理解回调func.?验证的目标;创建一个不用做任何更改就能在所有测试环境中使用的验证环境;平台必须提供一个钩子,可以在不修改由原来类的情况下注入新的代码;如何定义使用一个callback func.?(sv & uvm一致)1.预留回调函数2.定义callback(回调类extends 虚类)&回调函数3.例化及添加回调类实例(push_back(); push_front(); queue);
Randomize
Background:明确验证平台需要解决的问题:将测试和dut分离;(激励空间大,无法用for 循环遍历)-----CRT---正确的输出结果保存为golden log file(标准日志文件)(产生方法:1.随机data flow2.RPNG seed)
Rand & randc的理解;仿真器从枚举列表中取值;
随机化应该和构造分开;assert检查随机化是否成功;
dist权重分布两个操作符各自代表的意义--- := (值范围内的每一个值都是相同的) && :/ (权重要平均分布给值范围内的每一个值);也可以把权重设为0,从而删除某一个值;
constraint的code构成?
你是如何理解rand 和 inside(inside 产生值的集合,sv在值的集合中取随机值时各个值的选取机会相等)的?
$表示取值范围里的最大、最小值;
如何理解双向约束?(此处可以举例子说明—突出:声明性语句,并行执行) Slove…before..引导概率分布;
Constraint_mode()打开和关闭约束进行控制产生随机的类型;rand_mode()控制变量是否进行随机化;
知道内嵌约束吗?(增加额外的约束;with{}的作用域)
Callback; pre_randomize()----非随机变量:上下限、权重ect. Post_randomize()---随机数的误差矫正;$random $urandom $urandom_range(上限参数,可选填的下限参数);指定范围内的平均分布;
约束动态数组中元素的个数---size()/sum;
如何理解随机序列?和randomize()相比有什么优点?随机序列的结构是怎样的?
了解随机控制吗?结构如何?与randmize()相比有什么特点?
线程及通信
Introduction: uvm 各个组件之间如何进行跳转?(涉及到的知识点:1.phase 跳转2.set_drain_time 3.communication) --握手机制(线程通信)--&-- raise_objection-drop_objection ----sv调度器总是不停选择下一个要运行的线程;
进程建立 一般在initial/always/fork块中建立..动态块:fork..join_none/ fork…join_any;
怎么理解fork..join/join_none/join_any?(细节);
如何终止单个线程和多个线程?
Wait fork 和Disable停止单个线程和多个线程的用法/作用范围;
Event
谈谈对以下符号的认识:->/triggered; wait(e2.triggered())~@e2; 两种方式的使用情况(如果事件已经发生,使用wait(.triggered)能够防止事件一直阻塞;;如果在循环中一般使用边沿敏感的阻塞@,保证在下次等待之前时间向前推进防止出现零延时循环);
*Event的传递;
Semaphore
对旗语的理解?基本操作(是否阻塞)?关于try_get()的返回值问题?等待优先权问题如何理解?
Mailbox
Mailbox 的background;---想想uvm数据流sequence 怎么到driver的?1.提高code的复用性(避免直接到sequence的路径下去拿transaction;2.各自有各自的运行速率)
Mailbox中只能放句柄,不能放对象;定容mailbox(缺省/n);
简述Async 线程使用定容mailbox实现同步 的方法?----*
————————————————2021/3/21