![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UVM理论
文章平均质量分 71
以项目为基础,从零开始搭建一个最简单的uvm,看完不会来砍我
爱吃辣椒的年糕
努力成为更好的自己
展开
-
第十二段:基于env的重用
现代芯片的验证通常分为两个层次, 一是模块级别( block level, 也称为IP级别、 unit级别) 验证, 二是芯片级别( 也称为SOC级别) 验证。 一个大的芯片在开发时, 是分成多个小的模块来开发的。 每个模块开发一套独立的验证环境, 通常每个模块有 一个专门的验证人员负责。 当在模块级别验证完成后, 需要做整个系统的验证。 假设某个系统分成了三个模块,如下图: 这三个模块在模块级别验证时, 分别有自己的driver和s...原创 2021-11-02 15:56:53 · 257 阅读 · 0 评论 -
快速用python手撸一个条形图(不借助第三方库)
这是接着上次 “如何diy一个uvm框架 ” 的实战延续,uvm生成完对比数据后,就要用python绘制出相应的条形图,方便直接观察。 关于能根据什么数据绘制条形图,这个我想了很久,目前只想到带宽波动和长度波动,其他答案麻烦在评论区回复,十分感谢! 网上关于绘制条形图大多都是调用matplotlib库,然后巴拉巴拉一堆,确实结果不错,感觉还是很香的,下图是网上随便截取的一个,你们看看就好。 但是我会这样简单的...原创 2021-08-03 15:25:11 · 376 阅读 · 0 评论 -
UVM搭建 ------ 进阶DIY教程
最近工作稍微没那么忙,就又开始找点书看,于是就看起《芯片验证漫游指南》,觉得有很多新鲜的知识,以前从来没用到,比如通过DPI的方式,以c为桥梁,搭建UVM与其他仿真软件的桥梁,再比如利用python处理UVM生成的数据然后以数据表格的形式展现,再或是研究生论文里导入VIP框架(论文还没看懂,给我点时间,嘻嘻嘻)。 既然我都知道这么多思路了,那不如干起来,由于我平时时间比较少(好多电视剧,电影没看呢,理解下),这个部分我会拆成几个部分来说明,希望关注下,毕竟手打字不易(很累的)...原创 2021-07-26 16:33:21 · 1444 阅读 · 3 评论 -
UVM在项目中实用的测试方法总结
目录1 概述... 11.1 简介... 11.2 目的... 11.3 原则... 12 实施流程... 13 分类... 14 实施三步走... 25 覆盖类型分析... 26 测试方法... 27 实例分析... 38 常用小技巧... 49 个性化思路... 5 概述 简介 UVM测试从根本上说属于白盒测试,其又类似于结构测试或基于代码的测试。UVM测试是一种测试用例设计方法,我...原创 2020-12-14 14:52:30 · 2320 阅读 · 0 评论 -
预备段:uvm初级目录
目次1 组成与原理工具:uvm+cadence框架:virtual_sequence+agent1.1 组成1.2 原理分析2.1 uvm_field宏的分析2.2 sequence/sequencer的调用2.3 uvm_config_db与uvm_resource_db分析2.4 seq_item_port的分析2.5 uvm_factory的分析2.6 analysis_port的...原创 2020-11-28 14:26:40 · 315 阅读 · 0 评论 -
第十一段:功能覆盖率/随机化 functional coverage功能 (持续更新)
最近项目中需要function覆盖率,所以就专门看了这部分知识,那么开始了! 主要是声明一个covergroup,让这个covergroup随着事件sample_trans响应,sample_trans在monitor的main函数中触发。systemverilog默认是把coverpoint分成64组,我在第一句里面通过{option.auto_bin_max = 10;}把分组数改成10试试效果。 在transaction和generator那...原创 2021-01-16 15:38:46 · 1800 阅读 · 0 评论 -
第十段:Run_test的调用
run_test是在uvm_globals.svh中定义的一个task,用于启动UVM。获取到uvm_root的单个实例,然后调用top的run_test函数。传入test_name的名字。初始化objection。设置testcase的name,从cmdline(涉及uvm_cmdline_processor类)获取+UVM_TESTNAME参数,如果有,将来使用第一个参数设置的值。如果cmdline没有设置UVM_TESTNAME,使用传入的testname。根据test_n原创 2020-11-27 19:19:51 · 2438 阅读 · 3 评论 -
第九段:Virtual_sequencer的调用(二次更新)
1)基础用法:在virtual_sequencer中将各个env的sequencer包括进来,同时base_test在connect_phase中将各个env放入指针中,在case在main_phase中设置default_sequence,让其进入phase时自启动。平常的uvm的object的控制放到sequence的body中实现,引入virtual sequencer后,则将其放入顶层的virtual sequence的body中,而且注意fork join_none的使用,避免提前运行结束。原创 2020-11-27 19:17:46 · 1296 阅读 · 0 评论 -
第八段:Phase的使用
1)基础用法:常用的是四种phasebuild_phase中定义初始化相关的代码。Connect_phase中定义componet的连接代码。Run_phase中定义主程序。Report_phase中定义打印相关的代码。2)项目升级用法:与上一致。3)底层原理分析Phase按照是否消耗仿真时间一共分为2种,一种是function phase,如:build phase,connet phase等,另一种是task phase,如run_phase等。如图所示:Run_phase和其他原创 2020-11-27 19:15:24 · 4392 阅读 · 0 评论 -
第七段:blocking/noblocking的传播,TLM_fifo的使用
1)基础用法:首先我们需要造一个喇叭,也就是create一个uvm_blocking_put_port;然后要找来听众,也就是在另外一个component里面create一个uvm_blocking_get_port ,注意这里用的是get_port而不是put_port了。把听众的位置记录在一个小本本上,也就是在env或者test里面执行analysis_base库的connect函数。要注意的是,由于我们往里面加了FIFO,所以我们需要先造一个FIFO出来,然后把FIFO跟前面两步造的喇叭.原创 2020-11-27 19:11:29 · 814 阅读 · 0 评论 -
第六段:analysis_port的分析
1)基础用法:首先它是一个port,那么它肯定有对应export,我们在sequencer中定义一个analysis_port,在接收端定义一个tlm_fifo,然后在agent中将需要通信的两个component连接,在需要发送的时候,加入port.write(trans),然后通过get函数获取传递来的数据。2)项目升级用法:唯一的区别是加入了p_sequencer的使用,调用对应的sequencr。3)底层原理分析:analysis_port(analysis_export)没有阻塞和非阻原创 2020-11-27 19:08:09 · 1811 阅读 · 0 评论 -
第五段:uvm_factory的分析(二次更新版)
1)基础用法:a. 注册当定义一个类的时候,它的类型必须要注册,UVM已经提供了专用的宏。`uvm_component_utils(class_type_name)`uvm_component_param_utils(class_type_name #(params))`uvm_object_utils(class_type_name)`uvm_object_param_utils(class_type_name #(params))这四个宏中两个是为参数化的类准备的,另外两个是原创 2020-11-27 19:05:51 · 514 阅读 · 0 评论 -
第四段:seq_item_port的分析(二次更新)
1)基础用法:首先它是一个port,那么它肯定有对应export,我们在agent中链接driver和squencer,我们在sequence调用send,接着在driver中调用 get_next_item获取相应的发送的激励值。2)项目升级用法:使用方法一致。3)底层原理分析:我们平常可以不用定义,直接使用seq_item_port,那么在源码中肯定定义了该参数,在driver源码中,定义了uvm_seq_item_pull_port#(req,rsp) seq_item_port,它是u.原创 2020-11-27 19:03:38 · 6298 阅读 · 0 评论 -
第三段:uvm_config_db与uvm_resource_db分析(二次更新)
1)基础用法:我们在工程中主要是对virtual的interface用到了config_db,大概流程如下:首先我们在顶层中例化了interface,然后就用config_db::set把interface这样一个virtual interface放入resource_pool中,resource_pool也就是两张表,之后在所需要的时候调用config_db::get获取即可,config_db::set有4个参数,前两个组成一个范围,这个范围内的单位才可以通过get获取我放入资源池的数据,第三个参数原创 2020-11-27 19:01:13 · 2194 阅读 · 0 评论 -
第二段:sequence/sequencer的调用
1)基础用法: 在sequence中合成激励数据,然后通过start函数启动body函数,我们在body函数中通过uvm_do(或者start_item,finish_item或者send)将激励发送出去,之后就通过fifo在drive拿到数据,然后波形化。2)项目升级用法:在tc中的csim通过start启动tb_mac的sequence的body(sequence的嵌套),然后设置发送激励参数,再次调用start进入主sequence的body函数,通过pack组装报文,send发出,进入d原创 2020-11-27 18:57:32 · 1403 阅读 · 0 评论 -
第一段:uvm_field宏的分析
uvm_field宏的分析1)基础用法:uvm_object macro:a. 在transaction使用uvm_object_utils_begin:它用于把一个直接或间接派生自uvm_object的类注册到factory。uvm_object_param_utils_begin:它用于把一个直接或间接派生自uvm_object的参数化类注册到factory。b. 在uvm_sequence使用:uvm_object_utils(sequence 类名)可能还需要`uv.原创 2020-11-27 18:50:03 · 3958 阅读 · 0 评论