UVM从入门到实战
文章平均质量分 71
本栏目将带你深入探讨UVM,一种广泛应用于集成电路验证领域的高级方法学。无论你是初学者还是有经验的验证工程师,本专栏都将为你提供从基础到进阶的知识体系,包括UVM的核心概念、环境搭建、组件使用以及实际项目中的应用技巧。通过丰富的实战案例和代码示例,我们将带你掌握如何高效地利用UVM进行模块级和系统级
元直数字电路验证
天地本無心,生民自有命,往聖無絕學,萬世不太平。硅農,因bug而生,與bug為伴,以debug為生。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[UVM]在 UVM验证环境中,验证相互关联的寄存器以及特殊功能寄存器(如 W1C、W1P、W1T)的方案
摘要:本文介绍了在UVM验证环境中验证SoC系统中相互关联寄存器及特殊功能寄存器(W1C、W1P、W1T)的完整方案。针对相互关联寄存器,提出了基于寄存器模型构建、多维度测试用例设计、预期值计算和覆盖率收集的验证策略,并提供了包含寄存器模型定义、Scoreboard实现和测试用例的完整代码示例。对于特殊功能寄存器,详细阐述了W1C、W1P、W1T等类型的验证方法,包括特殊行为模拟、触发事件检查和边界条件测试,同时给出了对应的UVM实现代码。该方案通过系统性的验证策略和可复用的代码框架,可有效确保寄存器行为的原创 2025-05-25 11:57:12 · 1163 阅读 · 0 评论 -
[UVM]在SoC中用寄存器模型backdoor访问寄存器的案例
摘要:本文介绍了UVM验证环境中寄存器模型的BACKDOOR访问机制及其应用。BACKDOOR访问通过直接操作DUT内部信号实现寄存器读写,相比FRONTDOOR访问更高效,适用于调试和层次化验证场景。文章详细阐述了BACKDOOR路径的定义方法(add_hdl_path/add_hdl_path_slice)、在层次化环境(IP/Sub-system/SoC)中的实现策略,以及寄存器模型复用时的注意事项。通过代码示例展示了如何从SoC顶层直接访问嵌套IP寄存器,并讨论了路径一致性维护和动态更新方法。原创 2025-05-03 17:25:49 · 1007 阅读 · 0 评论 -
[UVM]UVM中reg_map的作用及多个rem_map的使用案例
摘要:UVM中的reg_map是寄存器模型的核心组件,用于管理DUT寄存器的地址映射和访问路径。主要功能包括:地址空间映射、访问协议管理、多视图支持和层次化设计。在复杂SoC验证中,多个reg_map适用于多地址空间(如CPU/DMA视图)、多协议访问(如AXI/APB)等场景。通过创建不同reg_map实例并配置基地址和适配器,可实现同一寄存器在不同地址空间的灵活访问。文章提供了完整代码示例,展示单个reg_map的基本用法和多个reg_map在CPU/DMA双视图中的应用,包括地址映射、适配器关联和访问原创 2025-05-03 17:15:39 · 1241 阅读 · 0 评论 -
[UVM]寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗?
摘要:UVM寄存器模型中,镜像值反映硬件寄存器的当前状态,通过读写操作更新;期望值表示用户希望达到的寄存器状态,由测试用例设置。两者通常不一致,只有在期望值成功写入硬件后才会一致。UVM提供update()方法将期望值写入硬件,mirror()方法检查一致性。这种设计支持灵活验证硬件行为是否符合预期。原创 2025-05-01 23:17:14 · 1439 阅读 · 0 评论 -
UVM中uvm_mem_mam(Memory Allocation Manager)的源代码结构和设计原理的详细说明
摘要:本文详细解析了UVM中uvm_mem_mam(内存分配管理器)的源代码结构和设计原理。该模块是UVM寄存器抽象层(RAL)的重要组成部分,用于验证环境中的内存管理。源代码主要包含四个核心类:uvm_mem_mam_cfg(配置类)、uvm_mem_mam(核心管理类)、uvm_mem_region(内存区域类)和uvm_mem_mam_policy(分配策略基类)。设计上采用模块化结构,支持策略模式实现灵活的内存分配方案,可与UVM RAL无缝集成,并支持多主控场景和覆盖率收集。典型应用包括DMA缓冲原创 2025-04-17 09:07:44 · 1174 阅读 · 0 评论 -
[UVM]uvm_testbench_gen | 介绍一个UVM环境自动生成工具
摘要:介绍基于GUI的UVM环境自动生成工具uvm_testbench_gen,该工具通过Python tkinter实现,旨在提升验证环境搭建效率。支持生成UVM组件模板代码(sequencer/driver/monitor等)、构建多agent/env结构、集成已有组件,并能生成环境说明文档。工具支持三种interface生成模式,提供GUI配置和文档导入两种方式。源码开源在GitHub(https://github.com/hellovimo/uvm_testbench_gen),与VCS uvmge原创 2023-05-10 13:20:59 · 4020 阅读 · 1 评论 -
[UVM]为什么不建议在body()中使用pre_body()和post_body
不建议在body()中直接使用pre_body()和post_body(),因为只有通过start()启动sequence时才会调用它们,而常用的uvm_do宏不会触发。替代方案是在sequence中定义body_pre()和body_post()任务,或通过父类body()继承前置任务。此外,start()是uvm_sequence方法,uvm_do_on是宏,不能在uvm_test中使用,顶层virtualsequence应使用start()挂载到virtualsequencer上。原创 2023-04-04 21:31:55 · 3466 阅读 · 0 评论 -
Makefile使用案例 --- UVM环境的建立及运行
摘要:如何用Makefile动态build UVM环境呢?本文将通过一个简单的IP验证环境来介绍Makefile的用法。原创 2022-12-29 20:06:18 · 108 阅读 · 0 评论 -
[UVM]UVM环境搭建之 env
前言:通常我们会在env中例化agent,Create RAL Model,Get Interface,Create Configure Object,Connect PORT。通常ENV该怎么部署比较好?本文将做一个详细的介绍。...原创 2020-03-21 21:31:39 · 2592 阅读 · 0 评论 -
[UVMC]UVMC学习笔记之在SystemC/C++ layer的信息汇报控制
在uvmc中可以提供对uvm testbench基本层次信息的打印和信息打印级别的控制,控制过程可以systemC layer实现操作。原创 2022-07-31 13:07:17 · 1185 阅读 · 0 评论 -
[UVMC]UVMC学习笔记之在SystemC/C++作用域实现UVM factory操作
UVMC 提供了一组API可用于在SystemC layer对UVM的组件factory进行访问操作,用于层次打印,组件重载,调试,以及打印重载类型等等。原创 2022-07-31 12:51:47 · 1045 阅读 · 0 评论 -
[UVMC]UVMC学习笔记之跨语言作用域的config操作
UVMC引入特定的内存共享方法,可以在UVM/SystemVerilog与SystemC模块之间传递记名的半全局变量,在使用方式上类似UVM build-in提供的config_db方法,可以传递字符串,整形数据(byte/int/bit-- char/int/long)和对象结构,在传递对象时需要对packet 结构打包成字符流。原创 2022-07-31 12:36:06 · 984 阅读 · 0 评论 -
[UVMC]UVMC学习笔记之phase同步控制
UVMC 实现了UVM/SystemVerilog 环境与SystemC 环境之间的同步控制,在systemC 部分通过特定的API实现对UVM的phase的精确同步。本文将介绍UVMC在systemC layer实现同步的API。原创 2022-07-30 21:47:10 · 1223 阅读 · 0 评论 -
[UVM]uvm_resource_db与uvm_configure_db
摘要:UVM成为IEEE标准的关键在于其测试平台(TB)的可复用性和用户友好性。文章比较了uvm_resource_db和uvm_config_db两种资源配置机制,指出后者更优。传统通过SV系统函数$test$plusargs配置参数存在局限性,无法支持多TB环境集成。uvm_config_db机制有效解决了参数配置问题,避免了uvm_resource_db的缺陷。文中通过unit_agent类的示例代码展示了资源查找和配置过程,包括类型转换、优先级处理等实现细节,体现了UVM资源配置机制的灵活性。原创 2021-11-26 20:21:24 · 184 阅读 · 0 评论 -
[UVM]uvm_resource详解
uvm_resource studyuvm_resource.svh引入了resource的概念,resource是一种参数化的容器,该容器可用来存放任意类型的数据(只要是SystemVerilog支持的数据类型都可以,例如列表、队列、向量、class handle、virtual interface等等)。resource可用于配置component、给sequence传递数据或者在测试平台各分立部件之间传递信息。 resource会以其name及type为标签(或称关键词、scope)存原创 2021-11-26 20:17:52 · 2661 阅读 · 0 评论 -
[Python3]Python解析Json文件的案例
Python解析Json文件的案例 摘要:什么是json?如何用Python解析json文件呢?本文将介绍一种方案。一、什么是jsonJSON 指的是 JavaScript 对象表示法(JavaScriptObjectNotation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PH...原创 2021-10-27 00:06:29 · 787 阅读 · 0 评论 -
[UVM][AXI][VIP]Response queue overflow
本文介绍了解决UVM中VIP序列response queue溢出的两种方法:1)通过set_response_queue_depth()增大队列深度(默认8),如设为512或-1(无限制);2)若不关注错误,可用set_response_queue_error_report_disabled(1)禁用报错。文中还解析了相关UVM源码,说明这些函数用于控制响应队列深度和错误报告机制,帮助开发者根据实际需求调整设置,解决驱动发送响应多于序列获取的问题。原创 2019-04-12 19:52:27 · 6441 阅读 · 2 评论 -
[VCS]merge coverage --- vdb merge
本文介绍了数字电路验证中覆盖率合并的方法与注意事项。主要内容包括VCS工具中常用的覆盖率合并命令,如使用urg工具合并多个vdb文件,指定覆盖率类型(line/tgl/cond等)和灵活合并选项(flex_merge)。文中详细说明了不同场景下的合并策略,如新增coverpoint时的处理方式,并比较了drop/reference/union三种合并模式。同时提供了覆盖率报告生成方法(HTML/文本格式)和实用建议:建议采用分层合并策略(每日合并后再汇总),避免因单日数据错误导致整体合并失败;当RTL结构或原创 2019-03-12 21:43:59 · 15017 阅读 · 0 评论 -
`uvm_info中怎么打印行号和文件
`uvm_info中怎么打印行号和文件 前言:在SystemVerilog中,`__FILE__和`__LINE__作为编译指令,在编译阶段被替换掉:`__FILE__被替换为当前文件的文件名,以字符串的形式存在。`__LINE__被替换为当前文件的行号,以十进制数字的形式存在。在$display()中可以直接使用。一、`uvm_info()中如何获取行号和文件路径1.1 先看源码`ifdef UVM_REPORT_DISABLE_FILE...原创 2021-07-16 16:20:09 · 3538 阅读 · 1 评论 -
UVM中打印信息的控制 --- 设定、重载、统计
一、设置打印信息的冗余度阈值二、重载打印信息的冗余程度三、UVM_ERROR达到一定数量结束仿真四、设置技术目标原创 2021-07-16 15:56:21 · 3405 阅读 · 0 评论 -
[VCS]使用VCS/QUESTA/NCSIM Run小程序、try SystemVerilog語法
本文介绍了三种EDA工具下UVM验证环境的搭建方法。首先给出《UVM实战》源代码参考,然后分别详述VCS、QUESTA和NCSIM三种工具的配置脚本:1) VCS需设置环境变量和路径;2) QUESTA需创建work库并运行编译命令;3) NCSIM需添加访问权限和UVM库路径。最后提供了三种工具下运行测试用例的统一命令模板,通过SIM_TOOL变量切换工具类型,支持指定UVM测试用例名称。该方案为验证工程师提供了跨平台的UVM环境搭建参考。原创 2019-08-16 19:25:55 · 1579 阅读 · 0 评论 -
[RAL]UVM中通过宏定义来实现寄存器的读写
UVM中通过宏定义来实现寄存器的读写 前言:在SOC验证过程中,经常需要读写寄存器,但是通过Hierarchy来直接调用read、write函数显得有点麻烦,因此我们可以用宏定义来实现简写。本文给的例子是在Sequence中读写寄存器的一个案例,通过p_sequencer来找到ral_model并调用read和write函数。除此外,在Testcase中也可以通过这种方法来读写寄存器。一般在env中create ral model,在base_test中...原创 2021-04-08 21:23:17 · 1363 阅读 · 0 评论 -
[UVM]SoC Register Test Sequence开发经验
SoC Register Test Sequence一、base_reg_vsequencereg_test_base_vseq extends uvm_reg_sequence #(uvm_sequence #(uvm_reg_item));endclass二、reg_access_vsequencereg_access_test_vseq extends reg_test_base_vseq; protec...原创 2021-04-04 14:22:37 · 160 阅读 · 0 评论 -
[SV]在循环体中创建线程
在循环体中创建线程 前言:在SerDes的验证中,经常需要check每条lane的行为,对于check的task而言,只需要传入参数lan_num即可,其他的地方都相同。那么对于6T6R SerDes而言,怎么开6个线程呢?本文将给出一个例子。一、循环体中创建线程的例子task main_phase(uvm_phase phase);`ifdef DL_DIR for(int i = 0; i < ...原创 2021-03-27 15:04:54 · 822 阅读 · 0 评论 -
[UVM]UVM Register Model(RAL Model)的构建
RAL Model在SoC验证中是非常重要的,通过RAL Model进行寄存器的读写,大大降低的TB对RTL改动的依赖。那么我们应该怎么建立RAL Model呢?本文将总结一种方案。原创 2021-03-17 21:23:08 · 2097 阅读 · 2 评论 -
[UVM]uvm_config_db使用方法总结
uvm_config_db使用方法总结原创 2021-01-30 17:04:16 · 3124 阅读 · 0 评论 -
[SV]SystemVerilog状态机实现案例
本文介绍了SystemVerilog中状态机的实现方法。首先使用枚举类型定义状态(TOP_HIB、TOP_BG、TOP_LDO、TOP_NOR),然后通过三个主要任务实现状态机:1)格式化现态寄存器处理状态转换;2)描述状态转移条件,包括计时器和稳定时间判断;3)基于当前状态和输入信号确定次态。状态机在时钟边沿或复位时更新状态,实现了从休眠到正常工作状态的转换逻辑,包含电源稳定时间检测等关键功能。原创 2021-01-30 16:05:15 · 1822 阅读 · 1 评论 -
[UVM]UVM解析命令行参数及读写文件
UVM解析命令行参数及读写文件 前言:在仿真过程中,我们常常需要记录一些仿真过程中产生的数据,那么怎么把这些数据记录在特定目录下的指定文件中呢,本文将展示一次实际应的例子。一、在上一篇博文中,我们介绍了UVM解析命令行参数的方法uvm_cmdline_processor cmdline_proc_inst;function new(string name, uvm_component); sup...原创 2021-01-09 10:56:05 · 3667 阅读 · 0 评论 -
[UVM]UVM命令行参数解析工具:uvm_cmdline_processor
UVM命令行参数解析工具:uvm_cmdline_processor 前言:uvm_cmdline_processor扩展自uvm_report_object,是一个对仿真命令进行处理的处理器类。uvm_cmd_line_verb类是一个独立的类,主要对仿真的编译路径,事件等进行记录。一、UVM仿真命令进行处理的处理器1.uvm_cmd_line_verb类只有四个属性:string comp_path; ...原创 2021-01-08 19:53:16 · 2219 阅读 · 0 评论 -
[UVM]uvm_heartbeat应用案例(二)
Fatal From HeartBeat Monitor / Detecting Inactive condition of the testbench This example is same as the previous example, the comp_a is shown as inactive to the uvm heartbeat so that the uvm heartbeat should detect the same. As mentioned b...原创 2020-08-21 18:32:54 · 897 阅读 · 0 评论 -
[UVM]uvm_heartbeat应用案例(一)
uvm_heartbeat应用案例一、将uvm_heratbeat逻辑添加到测试台中The testbench in the below example consists of a component comp_a In the run phase of comp_a, a loop is running with a delay of 50 This example shows the implementation of the u...原创 2020-08-21 17:28:38 · 1066 阅读 · 0 评论 -
[UVM]uvm_heartbeat简介
uvm_heartbeat Heartbeats provide a way for environments to easily ensure that their descendants are alive. or in other words, the uvm_heart beat catches the deadlock or hang states of the verification compon...原创 2020-08-21 16:22:51 · 1226 阅读 · 0 评论 -
[SV]使用SystemVerilog参数化类编写通用代码模板
使用SystemVerilog参数化类编写通用代码模板 SystemVerilog支持使用参数化类编写泛型代码的模板。在这里,我们将描述组成UVM基类库的代码中的一些设计模式。使用SystemVerilog Universal Verification Methodology(UVM)或任何基于类的方法论编写测试工作台的用户可以从这些技术中学习。 设计模式是针对常见编程问题的优化的、可重用的解决方案。它们不仅仅是类定义或一组例程——它们...翻译 2020-07-09 21:05:40 · 6985 阅读 · 1 评论 -
`uvm_do_with中constraint不生效的原因及解决方案
`uvm_do_with中constraint不生效的原因及解决方案 前言:我们通常在上层的top_vseq中启动下层sub_seq或seq_item,出于灵活性或者可重用性的考虑,可能会使用`uvm_do_with对下层的random变量进行约束。为了coding方便以及增强代码可读性的考虑,上层和下层seq变量的名字可能是一样的。但是这样就会造成一个问题:我们会发现如果使用`uvm_do_with(sub_seq, {var_a == var_a});这个约束是无法生...原创 2020-07-09 11:26:03 · 6984 阅读 · 0 评论 -
[UVM]数字验证必备网站 --- DV成長秘籍
本文汇总了数字验证(DV)工程师必备的学习资源,包括UVM和SystemVerilog的权威资料。重点推荐Verification Academy、Accellera等专业门户网站,以及《UVM Cookbook》、AMBA协议等核心参考资料。同时提供在线仿真工具EDA Playground和代码托管平台GitHub的链接。这些资源涵盖验证方法论、编码规范、行业标准协议等内容,是DV工程师职业成长的知识宝库。文章将持续更新更多实用资源,帮助验证工程师提升专业技能。原创 2020-05-21 16:39:52 · 3924 阅读 · 0 评论 -
[UVM]图解UVM寄存器訪問方法(Register Access Methods)
寄存器訪問方法(Register Access Methods) 前言:UVM的寄存器抽象层(RAL)提供了几种访问寄存器的方法。这篇文章将解释注册表访问方法是如何工作的。在寄存器抽象中,我们介绍了RAL的概述并解释了如何定义寄存器。在这篇文章中,我们将介绍如何访问寄存器。一、Summary 下表总结了每个方法如何更新register-field对象的属性。Method m_reset ["HARD"] v...翻译 2020-05-15 19:15:16 · 3039 阅读 · 5 评论 -
[UVM]Component Override
UVM Component Override一、Type Override There are several ways to override a component using its type.1.1、uvm_component_registry#(T,Tname)::set_type_override(override_type) 第一种方法是使用uvm_component_registry。...翻译 2020-05-14 19:39:13 · 2578 阅读 · 0 评论 -
[UVM]Register Callbacks --- 一種對有粘連關係寄存器的驗證方法
本文提出了一种使用UVM Register Callbacks验证具有粘连关系寄存器的方法。当写入RECIPE寄存器时,TASTE寄存器会随之更新。作者通过定义jelly_bean_recipe_reg_callback类扩展uvm_reg_cbs,在post_write任务中根据写入值更新TASTE寄存器。同时展示了另一种实现方式:使用post_predict()函数监控特定字段变化。这两种方法都能确保寄存器模型与DUT行为一致,有效解决了寄存器间关联更新的验证问题。实验结果表明,该方法能正确捕获并更新T原创 2020-05-14 11:52:18 · 1317 阅读 · 0 评论 -
[UVM]用modelsim搭建UVM环境及源码分享
用modelsim搭建UVM环境及源码分享一、下载modelsim1.1、百度云盘链接:https://pan.baidu.com/s/1BRSlQiOXIa7CvOr_UQIr7A1.2、提取码:crg0二、文件准备1.1、准备test top//UVM test yop//top`include "uvm_pkg.sv"module hello_world_example; import uvm_pkg...原创 2020-05-10 18:52:05 · 4075 阅读 · 0 评论 -
[UVM]在UVM top層使用generate語句實現批量Interface連線
SystemVerilog中使用generate語句實現Interface批量連線 前言:在前文(Link)中我們談過generate語句在Verilog中的用法,本文將詳細介紹generate中TB中的使用。通過引入generate,將大大減少連線或者set interface的工作,從而避免一些低級的錯誤。一、應用場景假如我們需要4個ckdly_...原创 2020-04-22 19:44:32 · 1665 阅读 · 1 评论
分享