验证V2
文章平均质量分 52
路科验证V2学习笔记
Arist9612
这个作者很懒,什么都没留下…
展开
-
sequence与sequencer
文章目录1. sequence与sequencer1.1 sequence和item发送实例1.2 sequence和item方法1.3 发送序列的uvm宏1.4 序列宏实例1.5 seqr的仲裁机制1.6 seqr的仲裁锁定2. sequencer的层次化2.1 概述2.2 hseq2.3 vseqr1. sequence与sequencer1.1 sequence和item发送实例top_seq这个顶层的seq中有两个底层的成分(挂载到top_seq)一个是child_seq(是uv转载 2021-08-15 11:08:21 · 1820 阅读 · 0 评论 -
寄存器模型常用方法
文章目录1. 寄存器模型常规方法1.0 期望值、镜像值、实际值区别1.1 预测1.2 uvm_reg访问方法1.3 mem与reg的联系与差别1.4 利用内建sequences实现对寄存器的测试2 寄存器模型的应用场景2.1 概述2.2 寄存器检测2.3 覆盖率收集2.3.1 自动收集模式2.3.2 手动收集1. 寄存器模型常规方法1.0 期望值、镜像值、实际值区别寄存器模型中每一个寄存器都有两个值:镜像值、期望值。首先RAL、DUT中的寄存器都会复位,此时值相同。mirror value是转载 2021-08-14 18:06:37 · 2528 阅读 · 0 评论 -
寄存器模型概念部分
文章目录1. 寄存器模型概览1.1 寄存器中心化管理方式1.2 uvm_reg相关概念1.3 寄存器建模2. 寄存器模型集成2.1 总线UVC实现2.2 adapter实现2.3 adapter集成2.4 寄存器模型访问方式2.4.1 前门访问2.4.2 后门访问2.4.3 前后门访问区别1. 寄存器模型概览一些简单的脚本可以保住我们生成寄存器模型。寄存器模型的优点?发送激励;利用RAL可以对DUT寄存器做测试;完成寄存器读写的覆盖DUT中所有的寄存器都要在软件中实现,这里的map包括转载 2021-08-14 15:13:47 · 1318 阅读 · 0 评论 -
32_消息管理
文章目录1. 概述2. 消息方法3. 消息处理4. 消息管理1. 概述2. 消息方法系统会自动添加消息来自哪些文件,哪一行我们关注系类型,ID,内容,冗余度冗余度表示消息的重要程度,NONE最高,HIGH表示容易被过滤因此不重要3. 消息处理消息也有回调函数4. 消息管理build_phase中的set_report_severity_action(UVM_ERROR,UVM_DISPLAY|UVM_CALL_HOOK)表示对于ERROR级别的消息,一方面会打转载 2021-07-26 23:23:15 · 282 阅读 · 0 评论 -
31_config机制
文章目录1. 概述2. 接口传递3. 变量设置5. object传递1. 概述UVM中配置必须在底层组件创建之前就完毕set在顶层环境,get在底层环境T是参数类型参数分别为:component句柄,实例名称,变量名称,拿出值2. 接口传递sv中组件首先定义interface之后在comp1中添加virtual,类中interface指针必须用virtualbuild_phase通过get interface指针传递拿到interface,四个参数分别代表当前组件comp1转载 2021-07-26 08:47:41 · 267 阅读 · 0 评论 -
30_phase机制
文章目录1. 概述2. UVM编译和运行顺序2.1 仿真开始2.2 仿真结束1. 概述UVM有9个phase对应9个方法,只有component具备。9个阶段中只有run是任务(有时序,会消耗时间),其他都是函数(需要立即返回)。将run进一步拆分右边12个phase会让问题变得复杂很多。初学者不建议使用。12个phase是和run并行执行的,12个phase是依次执行。2. UVM编译和运行顺序run 0可以执行完4个phase。2.1 仿真开始root创转载 2021-07-25 15:11:39 · 428 阅读 · 0 评论 -
29_uvm核心基类
文章目录1. 核心基类概述2. 域的自动化3. copy4. 比较(compare)5. 打印(print)6.打包和解包1. 核心基类概述virtual class不能例化,但是可以被继承。sv中的copy有两步骤:先创建实例,再将现有属性赋值给新的对象对应的成员变量。UVM中copy和clone意义不同。2. 域的自动化使用多个宏做域自动化这里我们没有定义copy函数,这个copy是UVM的。这些核心方法不用自己实现了,这一点和sv中自主设计不同。b1成员变量都会拷贝给b转载 2021-07-25 11:37:20 · 2001 阅读 · 0 评论 -
28_覆盖方法
文章目录1. 概述2. 覆盖方法3. 覆盖实例4. 确保成功覆盖1. 概述覆盖可以将原先的driver替换为新的drv2,后续可以用drv2做实际的例化。新定义的类型drv2必须继承原有类型。2. 覆盖方法这个函数是要做类型覆盖,新类型替代原有类型替换实例UVM顶层是root,然后是test,接下来是env,假设下面是checker,那么他的层次化索引路径为"root.test.env.checker"3. 覆盖实例queastasim直接将uvm_pkg编译好放到环转载 2021-07-25 10:17:14 · 337 阅读 · 0 评论 -
27_验证方法学:类库地图、工厂机制、覆盖方法
文章目录1.验证方法学1.1 我们所处的验证时代1.2 UVM优势2. 类库地图2.1 概述2.2 类库地图划分3. 工厂机制3.1 概述3.2 工厂意义3.3 component与object3.4 uvm_coreservice_t类3.5 注册宏 `uvm_{compoent,object}_utils3.6 注册后的对象创建1.验证方法学1.1 我们所处的验证时代1.2 UVM优势2. 类库地图2.1 概述UVM初衷就是将sv中自定义的对象创建、访问、修改、配置、组件通信转载 2021-07-25 09:00:54 · 227 阅读 · 0 评论 -
26_参数化的类
文章目录1. 概述2. 实例1. 概述2. 实例peek只是拷贝,不从队列中拿出数据。参数化的类,关键词是type。可以通过修改type对应的参数T,更改类的功能。ABD。B参数化类若不指定,那就取默认值int。...转载 2021-07-24 08:14:26 · 575 阅读 · 0 评论 -
25_回调函数
文章目录1. 概述2. 实例3. 回调函数使用方法1. 概述在此处预留了callback入口。2. 实例此处定义回调类及其函数。virtual class是虚类,只是提供一个例化的模板cbs = call backs虚类不能例化,但是可以被继承。cbs是一个队列,存储call back句柄若没有图中红色的部分,那么功能是固定的。加上后,每一次都会执行pre_tx,得到一个drop值,那就会改变driver中run task的行为,不发送当前的tr。转载 2021-07-23 23:50:32 · 86 阅读 · 0 评论 -
24_对象拷贝(有难度)
文章目录1. 对象赋值和拷贝1. 对象赋值和拷贝new方法不可添加virtual,也不能有返回值。最后一行,先创建p2对象,之后p2对象拥有从p1拷贝得到成员。copy_data:将当前的成员值拷贝给t句柄指向的对象。basic_test_copy:先创建一个对象,后调用copy_data,返回句柄t。子类中的继承方法不需要声明virtual,但是要同名同参数同返回值传递句柄是子类句柄,在调用copy_data时候隐式转换成父类句柄。super.cop转载 2021-07-23 08:49:54 · 100 阅读 · 0 评论 -
23_类型转换与虚方法
文章目录1. 类型转换1.1 动态转换2. 虚方法1. 类型转换real r = 4.0;int i;int’(4.0)这是一个静态转换,编译的时候就生效。不知道是否转换成功$cast(i,r)是动态转换1.1 动态转换父类的句柄不可以直接转为子类,子类可以直接转为父类父类的小三角不能拓展到子类大三角。只有借助$cast(h2,h1),才能将h1转换为h2,父类才可以转换为子类若h1/h2指向同一个子类对象,那么子类通过super可以找到父类中的同名变量,但是父类没有办法获得子转载 2021-07-23 08:22:13 · 152 阅读 · 0 评论 -
22_覆盖率
文章目录1. 覆盖率类型1.1 代码覆盖率1.2 断言覆盖率1.3 漏洞率曲线1.4 功能覆盖率2. 功能覆盖策略3. 覆盖组4. 数据采样5. 覆盖选项6. 数据分析1. 覆盖率类型随机约束往往伴随覆盖率AB。回归测试达到上限后一般是修改约束1.1 代码覆盖率一般只收集设计代码的代码覆盖率路径覆盖率看if else if的分支是否被执行C。有一部分代码是dead code永远没法执行到,需要告诉仿真器这部分没法执行,排除掉。一般会设定一个阈值95%。1.2 断言覆盖率转载 2021-07-22 08:40:04 · 1178 阅读 · 0 评论 -
21_线程控制与通信
文章目录1. 线程使用1.1 什么是线程1.2 概念澄清2. 线程控制2.1 fork join2.2 fork join_any2.3 fork join_none2.4 等待所有线程衍生3. 线程间通信3.1 概述3.2 event事件3.2 semaphore 旗语3.3 mailbox信箱4. 三种同步要素进程同步实例4.1 event同步双向握手4.2 semaphore同步4.3 mailbox同步5. 通信要素的比较1. 线程使用Verilog硬件模型如下:ABC。initia转载 2021-07-08 16:11:45 · 458 阅读 · 0 评论 -
20_UVM简介
文章目录转载 2021-07-08 09:01:45 · 292 阅读 · 0 评论 -
19_验证方法
文章目录0. 概述1. 动态仿真2. 静态检测2.1 语法检测2.2 语义检查2.3 跨时钟域检测2.4 形式验证3. 虚拟模型4. 硬件加速5. 效能验证6. 性能验证0. 概述验证的完备性主要依靠覆盖率衡量主要验证方法分类:ESL/SYSTEMC常用于构建虚拟模型1. 动态仿真ABCD2. 静态检测2.1 语法检测2.2 语义检查有点类似Quartus FPGA编译过程中的警告,从设计可行性上做检测。2.3 跨时钟域检测动态仿真指RTL阶段的功能仿转载 2021-07-07 15:29:04 · 701 阅读 · 0 评论 -
18_随机控制与随机函数
文章目录stream是一个入口,之后配置任务权重分别是1、2、5,进入其中一个任务后有一半可能执行任务后结束有一半可能执行后再执行本任务。转载 2021-07-03 18:33:36 · 113 阅读 · 0 评论 -
18_约束块控制与数组约束
文章目录1. 约束块控制2. 数组约束1. 约束块控制子类约束不能违背父类约束有冲突的约束可以使用内件函数进行使能控制p.c_short.constraint_mode(0)关闭c_short约束p.constraint_mode(0)关闭所有约束p.c_short.constraint_mode(1)打开c_short约束randomize失败,返回0。l.length=0,不同仿真器结果可能报警告/错误继承的约束越来越多的时候,记不清之前的约束,那就在原先的基础上使用rand转载 2021-07-03 17:34:14 · 250 阅读 · 0 评论 -
17_随机约束和分布
文章目录1. 为什么需要随机约束?2. 随机化3. 约束1. 为什么需要随机约束?减少了代码量实际上是减少了测试用例的代码(test()中的代码)。约束变形:前期约束窄中期宽后期窄AC。验证环境结构可以随机2. 随机化随机变量只能是class中的成员变量new只是创建了变量,但是还没有随机化。必须调用randomize(),成功随机化返回1.本例子中的constraint中只约束了src,所以只随机了src。若constraint中有一个约束不合适导致随机失败,那么con转载 2021-07-03 16:06:47 · 169 阅读 · 0 评论 -
16_团队建设与验证专业化
文章目录1. 团队建设1.1 从全局入手1.2 追求百分百1.3 面向对象1.4 合理复用1.5 保持创新1.6 高效沟通1.7 突破责任边界2. 验证专业化3. 验证标准化1. 团队建设1.1 从全局入手1.2 追求百分百有问题不能轻易放过,一定要和设计人员、后端人员澄清。1.3 面向对象1.4 合理复用设计人员后期压力小,验证人员越到后期压力越大。代码脚本可以自动提取代码注释。1.5 保持创新1.6 高效沟通1.7 突破责任边界2. 验证专业化转载 2021-07-03 13:38:39 · 205 阅读 · 0 评论 -
15_验证的收敛与问题追踪
文章目录1. 验证的收敛1.1 回归流程1.2 回归质量1.3 回归效率2. 问题追踪1. 验证的收敛一般芯片级的回归测试一周只能做两次,等多位工程师准备就绪后向主管提交申请。1.1 回归流程1.2 回归质量前期功能测试重点在看功能是否实现,可以不收集覆盖率,等功能稳定后再随机测试收集覆盖率。1.3 回归效率基于C的验证是指定向测试。快速状态跳转:保存下初始化完毕的状态,下次仿真时,使得仿真器直接开始从初始化完毕的时刻开始仿真。FPGA测试一般不关心测试用例转载 2021-07-03 10:12:24 · 152 阅读 · 0 评论 -
14_验证周期与管理三要素
文章目录1. 验证周期2. 验证管理三要素2.1 时间管理2.2 人力资源2.3 任务1. 验证周期RTL0阶段还没开始写代码,但是功能描述文档已经写好RTL2主要完成设计和验证linting check有专门的工具部分功能和RTL重复,但是验证层次更高关注功能时,门级仿真体现不出价值。SDF是标准延时格式的文件,模拟真正布局布线后各个元件间的延时。若后端在综合的时候保证从RTL到布局布线不出现错误,那么静态时序分析就可以保证同步时钟域不出现时序问题。但是不能保证跨时钟域时候不转载 2021-07-02 21:00:57 · 189 阅读 · 0 评论 -
13_句柄和包
文章目录1. 句柄的使用1.1 句柄传递1.2 句柄的动态修改2. 包2.1 包的意义2.2 包的定义2.3 包和库的区别2.4 包的命名规则2.5 包的使用1. 句柄的使用1.1 句柄传递对象不会作为参数传递,传递的只可能是对象的句柄。sv中,若方法没有参数可以不带()。但是一般带,突出是方法上面的例子会报错。首次声明句柄t的时候,其没有指向任何对象,也就是t其实是NULL。create方法在不指明参数方向时,默认是input,但是该函数没有返回值,因此虽然在函数内部进行了一些操作,但是原创 2021-07-01 15:52:10 · 184 阅读 · 0 评论 -
12_类的封装与继承
文章目录1. 类的封装1.1 封装概述1.2 定义成员方法1.3 类与结构体、module的异同1.4 类的辨析2. 类的继承2.1 概述1. 类的封装1.1 封装概述添加local就无法在外部通过句柄访问内部变量,但是可以通过类的方法访问这种变量。D。实际上编译不通过。public不是SV的关键词。1.2 定义成员方法本例子中的方法是动态的,因此若要调用就必须实例化对象。若我们不定义new,系统会自动帮助我们定义一个空的new。1.3 类与结构体、module的异同原创 2021-07-01 10:19:58 · 331 阅读 · 0 评论 -
11_类和对象
文章目录1. 概述2. 验证的世界为什么需要OOP?3. OOP要素4. 创建对象5. 句柄的传递6. 对象的销毁7. 句柄的使用8. 静态变量与静态方法8.1 静态变量8.2 静态方法1. 概述2. 验证的世界为什么需要OOP?class中变量生命周期是动态的。class中不可出现reg、wire、initial、always,这是硬件的概念,class是软件的盒子。类可以通过接口virtual获取硬件的信号,不论内部还是接口。3. OOP要素句柄指向例化的对象。4. 创原创 2021-06-30 16:43:38 · 311 阅读 · 0 评论 -
10_验证计划
文章目录1. 概述1. 概述计划制定步骤:制定计划需要收集的材料:原创 2021-06-30 11:51:49 · 292 阅读 · 0 评论 -
Questasim做验证时的Tips
编译工程时候的顺序:首先自下而上编译设计文件,之后编译tb文件。编译完毕后就会在默认的work库中产生对应的文件。右键tb文件,选中运行无逻辑优化的仿真仿真时候不小心关闭了某窗口,可以自layout菜单先重置一下,之后选中simulation模式。将dut的顶层信号波形添加,在波形窗口左下角可以将信号路径隐藏,如图:...原创 2021-06-29 09:44:30 · 1516 阅读 · 2 评论 -
9_调试方法
文章目录1. 库2. 仿真窗口3. 过程窗口4. 查看信号和波形5. 打印消息7. 设置断点和查看变量1. 库2. 仿真窗口3. 过程窗口仿真挂起最大可能就是仿真进入了死循环。initial forever//这就是一个死循环4. 查看信号和波形5. 打印消息7. 设置断点和查看变量module中的变量和函数都是静态的,除非声明automatic。在8、14行设置断点,result分别是1,0有同名变量时,由近到远,由里到外...原创 2021-06-28 21:36:13 · 185 阅读 · 0 评论 -
8_测试的开始和结束
run 0 相当于无穷多个delta-cycleABa2,a3发生变化,assign是连线,0时刻发生变化a5/a2的写法综合结果是相同的,但是仿真结果不同,assign的写法更准确。always@(a1)无法体现出0时刻的变化,但是always_comb能达到相同的效果。program不需要调用$finish,而是会自动结束。右下角的initial中有个forever,不会自己停止。因此在中间插入了强制结束的方法:$exit()program不可例化program软...原创 2021-06-28 18:32:03 · 177 阅读 · 0 评论 -
7_如何使用接口进行采样和数据驱动(时钟块)
1. 竞争问题1.1 设计中的竞争组合逻辑电路中,同一信号经不同的路径传输后,到达电路中某一会合点的时间有先有后,这种现象称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险。SV也可以用于做设计。此处a被综合成寄存器,这里是阻塞赋值,b立即跟随a变化,b被综合为wire。不会有一排的延时。1.2 仿真验证中的竞争*clk1同时驱动clk2和d1,后面两者在clk1拉高后的一个delta-cycle后变化。在设计中,可能会引入时钟门控、时钟分频,这种基于一个时钟产生另一个时原创 2021-06-28 16:18:51 · 873 阅读 · 0 评论 -
6_验证组件
文章目录1. 激励发生器1.1 概述1.2 如何设计Stimulator2. 监测器2.1 概述2.2 检测器方案2.2.1 方案1——整体式2.2.2 方案2——分布式2.2.3 方案比较2.3 内部信号检测建议3. 比较器3.1 概述3.2 比较器实现方式3.3 比较器组件结构3.4 比较器实现建议4. 接口4.1 概述4.2 接口的优势4.3 接口定义与使用1. 激励发生器1.1 概述Stimulator应该符合时序要求。Stimulator一般不和硬件内部组件发生关系。 CDA原创 2021-06-28 11:40:03 · 562 阅读 · 0 评论 -
5_测试平台
文章目录makefile封装步骤,加速编译仿真ABC原创 2021-06-28 10:00:46 · 77 阅读 · 0 评论 -
4_设计例化和连接
文章目录1. 模块例化2. 模块连接1. 模块例化端口默认是四值逻辑2. 模块连接原创 2021-06-27 14:42:38 · 167 阅读 · 0 评论 -
3_过程块和方法
文章目录1. always2. initial3. function4. task5. 变量声明周期1. always2. initial3. functionref和inout有点类似4. taskBfunction在没有标明变量方向时候,默认是输入。因此t s都是输入,本函数无输出。可以将t的方向指定为output5. 变量声明周期上面的函数和initial都在一个module中当一个function被声明为automatic/static时,其原创 2021-06-27 14:28:42 · 168 阅读 · 0 评论 -
1_验证任务与验证周期
文章目录1. 按时2. 保质3. 低耗4. 缺陷增长曲线:5. 验证周期5.1 验证计划5.2 开发验证环境5.3 调试环境和RTL文件5.4 回归测试5.5 芯片生产5.6 硅后测试5.7 逃逸分析6. 功能描述文档任务:按时、保质、低耗完成硬件设计的验证。1. 按时关注项目节点,子系统节点(milestone)以流片为终点逆向向前推算,各个子系统的节点一个模块验证延迟都不能流片,子系统没完成,相关的系统也不能验证,总系统也不能验证。一个模块延迟1天,总系统可能延迟半年。项目驱使导致代码可能转载 2021-06-26 17:53:22 · 614 阅读 · 0 评论 -
2_SV数据类型
文章目录1. 内建数据类型2. 定宽数组3. 动态数组4. 队列5. 关联数组6. 结构体7. 枚举类型8. 字符串1. 内建数据类型按照位数指定变量长度的类型都是无符号类型。B有符号数转化时,8位转化为更多位时会自动进行符号拓展,即在高位补1。无符号转化是补零。两次的结果分别是 'h180 'h080四值逻辑中的X转化为二值逻辑后,必定是0。2. 定宽数组[]中默认是从低到高[15:0]也可以,是从高到低高维度是8,低维是4一般是[0:x],这样数组赋值的原创 2021-06-27 11:30:19 · 284 阅读 · 0 评论