UVM_mentorpaper_使用手册

合集下载

uvm import使用规则

uvm import使用规则

uvm import使用规则UVM(Universal Verification Methodology)是一种通用的验证方法学,旨在提高硬件验证的效率和可重用性。

UVM Import是UVM库中的一个重要功能,它允许我们在UVM环境中引入外部模型和功能,并与UVM组件进行交互。

在本文中,我们将讨论UVM Import的使用规则和最佳实践。

一、UVM Import概述UVM Import是一个用于导入外部模块的机制,它允许我们将外部模块集成到UVM组件中。

通过使用UVM Import,我们可以方便地使用外部模块的功能,比如测试点生成和数据分析等。

此外,UVM Import还提供了与外部模块进行交互的方法,如控制外部模块的行为和监视其输出。

二、使用UVM Import的步骤为了使用UVM Import,我们需要按照以下步骤进行配置和集成。

1. 导入外部模块首先,我们需要在UVM环境中导入外部模块。

我们可以使用UVM宏`uvm_component_utils`来创建一个适配器组件,该组件将负责与外部模块进行交互。

适配器组件应继承自`uvm_component`类,并实现所需的接口和方法。

2. 配置适配器组件一旦我们创建了适配器组件,我们就需要为其配置一些参数,以便正确地与外部模块进行通信。

参数配置可以在UVM环境的配置阶段完成,可以在UVM配置文件中指定。

我们可以设置适配器组件的属性,如模块路径、输入输出接口等。

3. 连接适配器组件在UVM环境中,我们需要将适配器组件连接到UVM组件或其它适配器组件上。

这样做可以使外部模块和UVM环境进行交互。

我们可以通过在构造函数中实例化适配器组件,并将其作为UVM组件的成员变量来实现连接。

4. 使用UVM Import接口一旦我们完成了适配器组件的导入和连接,我们可以开始使用UVM Import接口来与外部模块进行交互。

UVM Import提供了一组方法,比如`import()`和`export()`,用于控制外部模块的行为和监视其输出。

UVM基础之-------uvmreport机制的使用

UVM基础之-------uvmreport机制的使用

UVM基础之-------uvmreport机制的使⽤后⾯的例⼦我会继续补充:1. 因为uvm默认定义的message格式⽐较长,⾮常不利于debug过程中的分析使⽤,⼀般情况下,开始使⽤uvm,都要利⽤uvm_report_server重新定义message输出的格式。

下⾯给出⼀个例⼦:⽤于将name和ID限定在同⼀个width。

class my_report_server extends uvm_report_server;int name_width = 20;int id_width = 20;function string pad(string s, int width);if ( s.len() == width )return s;// s is short. Pad at the end.if ( s.len() < width )return {s, {(width - s.len()){" "}}};else// s is too long. truncate.return s.substr(s.len()-width, s.len()-1);endfunctionfunction string compose_message(uvm_severity severity,string name,string id,string message,string filename,int line);// Make the width be exactly name_width// and id_width.name = pad(name, name_width);id = pad(id, id_width);return pose_message(severity, name, id, message, filename, line);endfunctionendclass前⾯⽂章中讲过,uvm_report_server类在整个环境中是⼀个单态类,所以在uvm_test层⽤set_server将继承的类替换原来的uvm_report_server类就可以了class test extends uvm_test;// Make my report server.beginmy_report_server my_report_server_inst;my_report_server_inst = new();// Configure.my_report_server__width = 28;my_report_server_inst.id_width = 20;// Set.uvm_report_server::set_server(my_report_server_inst);end2. 使⽤catcher对⼀些message执⾏CATCH或者THROW的操作:class my_report_catcherextends uvm_report_catcher;string id;string filename;string name;string message;int line;int verbosity;uvm_severity severity;uvm_report_object client;function new(string name = "my_report_catcher");super.new(name);endfunctionfunction action_e catch();uvm_severity_type usv;id = get_id();filename = get_fname();line = get_line();severity = get_severity();verbosity = get_verbosity();message = get_message();client = get_client();name = client.get_full_name();usv = uvm_severity_type'(severity);// Process this message.// Decide THROW or CATCH....return THROW;endfunctionendclassclass test extends uvm_test;...my_report_catcher my_report_catcher_inst;my_report_catcher_inst =new("my_report_catcher_inst");uvm_report_cb::add(null,my_report_catcher_inst, UVM_APPEND);3. 通过ID实现对message的精细控制,这部分内容在前⾯代码中有介绍,这⾥不展开在说的还有另⼀⽅⾯原因,我们在debug的时候通常希望log尽量的完全,因此不推荐使⽤ID去过滤message,也不推荐将log根据ID打印到不同的file当中,因为这两种做法,⼀种限制的log的完整性,有可能缺失我们需要的关键的信息,⽽另⼀种则是因为message的打印⼀般是按照时间顺序进⾏,将log打印到不同的file,将破坏这种前后时间关系,不利于进⾏debug。

mentor使用说明(中文)

mentor使用说明(中文)

Mentor软件操作简介1.打开DesignView软件,选择project-new:2.选择PCB Project Wizard选项,并且输入工程名demo,然后点OK:然后点下一步:4.鼠标点击Add,添加已有的设计文件,然后点下一步:5. 用鼠标勾掉Use CES for constrain前面的√,然后点完成:6. 以上设置完成后,新工程就建好了,如下图所示:7. 接着要新建原理图,选择File->new,然后点击鼠标左键:8. 在弹出的菜单选择Schematic,然后点OK:9. 出现如下新建的原理图:10. 接着开始画原理图,先放元器件,将鼠标移动到下图所示的图标:11. 这时会弹出一个选择框,根据你设计的要求选择,如果你要布的是4层板就选4Layer Template,然后点OK:12. 如下图,将Partition下拉菜单改为[ALL]:13. 在Parts found表格中用鼠标左键选择需要的元件,同时会在右边显示该元件的symbol(符号)和cell(封装),比如选择Part Number为1206的元件,然后Place如下图:14. 在合适的地方点击鼠标左键来放置此元件:15. 然后出现如下的画面,表示如果再按一下鼠标左键会继续放置此元件,本例不需要,故按键盘上的Esc:16.按了Esc后又出现之前的画面,接着你可以继续放置需要的元件,操作过程与上同,不再赘述:17. 鼠标左键选择如下图中的四个图标可以对元件旋转:18. 若要放置一些没有CELL的特殊元件,如GND符号,可以用鼠标左键点击下图中的图标,弹出Symbol Menu窗口,在里面找到GND这个符号放到原理图上,如下图:19. 接着用同样的方法放置VCC符号,全部元件放好如下图所示:20. 元件放好后开始连线,用鼠标点击可以开始连线,在元件的一端点鼠标左键开始连线,在目标处再点鼠标左键结束本次连线,连好后如下图所示:21. 这样本次原理图就画完了,然后鼠标左键点如下图中的图标保存此原理图:22.弹出如下图的窗口,输入文件名保存:23. 输入完成后,如下图所示,鼠标单击保存(S):24. 鼠标单击Yes:25. 此时软件窗口如下图显示:26. 鼠标选中demo_schematic,右键选择Open in Pcb:27. 在弹出的窗口中选中,然后点:28. 在接下来的窗口中设置最初我们建立的demo.prj工程文件的路径,鼠标单击下图的按钮来设置:29.选中如下图所示的demo.prj文件,点打开(O):30. 在接下来弹出的窗口中直接选择:31. 在接下来弹出的窗口中直接选择:32. 在接下来弹出的窗口中直接选择:33. 接着将出现如下图所示的窗口,直接点OK:34.在接下来弹出的窗口中直接选择:这样才能将原理图里的元件放到PCB中来,所以这步是必须的:36. 上一步完了后,原先,现在变成了,表示原理图和PCB同步起来了:形),选中下图中图标(画图模式):38. 然后点击下图中(属性图标),弹出窗口:39. 在Type下拉菜单中选择:40.然后在PCB中用鼠标左键画出一个封闭的:41. 画完后,如下图所示:42. 接下来就可以放元件了,点击图标,如下图所示:43. 在弹出的窗口中勾选前面的,如下图所示:44. 选中位号为L1和U1的元件,如下图:45. 然后点击旁边的图标,就把刚选中的LI和U1元件导入到active框中了,接着点击按钮开始放置LI和U1元件,如下图:46. 然后出现下图的情景,我们在合适的位置单击鼠标左键就放好L1元件了,接着在其他地方再单击鼠标左键就放好U1元件了:47. 放好元件后如下图所示:48. 为了在PCB上看的比较直观,我们把一些用处不大的东西隐藏起来,单击鼠标右键,选择Display Control选项,如下图:49. 在弹出的窗口中选择Part选项,勾掉和和这三行上的√,如下图:50. 上面的设置以后,PCB上的元件就看起来比较直观了,如下图所示:51. 我们看到PCB上L1(其实就是元件L1的位号)字符有两个一模一样的,就删掉其中任意一个,然后在剩下的L1字符上双击鼠标左键,如下图:52. 在弹出的Properties窗口中设置和,表示将此位号L1的字高设为30mil,线宽设为5mil,如下图:53. 同理设置位号U1,完成后如下图:54. 接着点击图标,切换到布线模式,接下来开始布线了,如下图:55.点击图标,开始一次布线,如下图:56. 在L1元件的1脚(1:S)单击鼠标左键,开始拉线,如下图:57. 然后在元件U1的1脚(1:L)上单击鼠标左键,完成拉线,如下图:58. 完成以上操作后,如下图所示:59. 接下来开始敷铜,鼠标单击菜单,在弹出的子菜单中选择选项,如下图:60. 然后点击图标,如下图:61. 在弹出的Properties窗口中选择Layer 为1,Net为GND,如下图:62.然后使用鼠标左键在元件U1的周围画出一个封闭的敷铜外形,如下图:63. 完成后的敷铜外形如下图中的虚线框:64. 同理,画出Net为VCC的另一个敷铜外形,鼠标单击菜单,在弹出的子菜单中选择选项,如下图:65. 在弹出的Properties窗口中选择Layer 为1,Net为VCC,然后使用鼠标左键在元件L1的周围画出一个封闭的敷铜外形,如下图:66. 完成后的敷铜外形如下图中的虚线框:67. 两个敷铜外形都已画完,现在开始生成敷铜,鼠标单击菜单,在弹出的子菜单中选择选项,如下图:68. 在弹出的窗口中勾选和以及之前的√,如下图:69. 然后点击按钮,开始敷铜,如下图:70. 敷铜完成后弹出如下提示信息,点确定,如下图:71. 敷铜完成后如下图所示:72. 接下来生成丝印层,鼠标单击菜单,在弹出的子菜单中选择选项,如下图所示:73. 在弹出的菜单中按下图设置,然后点击OK按钮:74. 弹出生成成功的提示信息,如下图,点击确定:75. 接下来生成NC Drill文件(转孔文件),鼠标单击菜单,在弹出的子菜单中选择选项,如下图:76. 在弹出的窗口中选择的路径,点击图标,如下图:77. 我们选用公制格式的,所以在下图窗口中选择DrillMetric.dff文件,然后点击打开:78. 然后选择选项,如下图设置:79. 设置好后,点击OK按钮,弹出成功提示信息,点击确定,如下图:80. 生成转孔文件后如下图所示:。

UVM实战指南——第3部分

UVM实战指南——第3部分

UVM实战指南——第3部分第3部分:UVM实战在前两部分中,我们介绍了UVM框架的基本概念和基本用法。

在这一部分,我们将进一步探讨UVM的实际应用,并提供一些实战技巧和建议。

1.重要性分析在开始UVM实战前,首先需要进行重要性分析。

这包括确定哪些功能是需要覆盖的,哪些功能是必要的,以及哪些可能引发错误的功能需要特殊关注。

这些分析可以帮助您确定测试计划的优先级,并在测试开发过程中更好地分配资源。

2.测试计划开发根据重要性分析的结果,您可以开始开发测试计划。

测试计划应该详细描述实施哪些测试以及对每个测试的期望结果。

它还应包括测试开发和验证团队的人员分配和时间表安排。

通过制定清晰的测试计划,您可以确保测试开发工作有条不紊地进行,并及时识别和解决问题。

3.环境开发在开发测试计划后,您可以开始开发UVM环境。

环境是UVM中最关键的部分之一,它包含了用于模拟验证环境的各种组件和接口。

在环境开发过程中,您需要根据测试计划中的需求,选择和实例化适当的UVM组件,并将它们连接在一起以形成完整的验证环境。

4.测试用例开发测试用例是验证过程中的核心功能。

在开发测试用例时,您需要通过实例化适当的测试类,指定测试目标,并配置测试环境。

您还需要定义测试封包,设置或生成输入数据,以及从模拟输出中提取和分析结果。

测试用例的开发应该遵循UVM的最佳实践,并确保测试覆盖范围广泛且有效。

5.仿真运行和调试一旦测试用例开发完成,您可以开始运行仿真并进行调试。

在仿真过程中,您可能会遇到各种问题,如信号不正确、仿真停滞、错误输出等。

为了有效解决这些问题,您可以使用UVM提供的调试功能,如消息和日志记录、波形查看和追踪。

通过运用这些工具,您可以更快地找到问题所在,并采取适当的措施进行修复。

6.结果分析和测试报告当仿真运行完成后,您需要对结果进行分析,并生成测试报告。

在UVM中,您可以通过访问测试类中的结果和统计信息来执行结果分析。

您还可以使用UVM提供的报告和日志功能,将结果以易于阅读和理解的方式呈现给项目团队和其他相关人员。

uvm mirror用法

uvm mirror用法

uvm mirror用法UVM (Universal Verification Methodology)是一种用于验证集成电路设计的标准方法学,它提供了一组规范和约定,以帮助验证工程师开发和执行高效的验证环境。

UVM mirror是UVM标准的一部分,它提供了一种有效的方法,用于管理和维护设计和验证环境之间的数据和状态一致性。

本文将详细介绍UVM mirror的用法和工作原理,以及它在集成电路验证中的应用。

第一部分:UVM mirror简介和工作原理(500字)UVM mirror可以被看作是设计和验证环境之间的一个“镜像”,它允许验证工程师在设计和验证环境之间传递和维护数据的一致性。

其工作原理可以分为以下几个步骤:1. 数据传递:UVM mirror通过提供一组API,允许验证工程师在设计和验证环境之间传递数据。

验证工程师可以使用这些API来发送和接收数据,以确保设计和验证环境之间的数据一致性。

2. 状态同步:UVM mirror还提供了一种机制,用于同步设计和验证环境之间的状态。

通过将设计和验证环境的状态同步到UVM mirror,验证工程师可以在验证环境中准确地获取设计环境的状态,从而实现全局状态的一致性。

3. 事件通知:UVM mirror还支持事件通知机制,当设计环境的状态发生变化时,它可以向验证工程师发送通知。

这样,验证工程师可以实时监测设计环境的状态变化,并及时做出相应的调整。

第二部分:UVM mirror用法(800字)UVM mirror提供了一些关键的用法,使验证工程师能够在设计和验证环境之间进行有效的数据和状态同步。

下面将详细介绍几种常见的UVM mirror用法:1. 数据传递用法:验证工程师可以使用UVM mirror传递设计环境中的数据到验证环境中进行分析和验证。

通过使用UVM mirror提供的API,验证工程师可以轻松地将设计环境中的数据发送到验证环境中,从而实现设计和验证环境之间的数据传递。

uvm_table_printer的用法

uvm_table_printer的用法

uvm_table_printer的用法uvm_table_printer的用法1. 什么是uvm_table_printeruvm_table_printer是一种用于在Universal Verification Methodology (UVM)框架中输出表格形式报告的工具。

它可以在仿真过程中显示各种报告信息,如测试结果、覆盖率、错误信息等。

使用uvm_table_printer可以方便地对各种仿真结果进行分析和调试。

2. uvm_table_printer的基本使用方法以下是uvm_table_printer的基本用法:•创建一个uvm_table_printer对象:在需要使用uvm_table_printer的类中,创建一个uvm_table_printer对象,如uvm_table_printer printer = new();•设置报告信息:通过调用uvm_table_printer的各种函数,将需要输出的信息添加到报告中。

例如,添加测试结果可以使用_test(result);•设置表格样式:可以对表格的样式进行设置,如设置表头颜色、字体样式等。

可以使用_header_style(style);来设置表头样式。

•输出报告:当所有需要输出的信息添加到报告中后,可以使用_table();将报告输出到控制台。

3. uvm_table_printer更高级的用法除了基本用法外,uvm_table_printer还提供了一些更高级的功能,方便进行更复杂的表格输出。

添加自定义列uvm_table_printer允许添加自定义列,以显示额外的信息。

可以使用_column(header, data_function);来添加自定义列。

其中,header是列的标题,data_function是一个回调函数,用于生成列的数据。

设置列样式可以对表格中的列设置样式,如设置列的对齐方式、颜色等。

可以使用_column_style(column, style);来设置列样式。

mentor部分操作方法

mentor部分操作方法

线加粗方法:先选中要加粗的线,在Keyin 命令栏中输入CW (线加宽的数值)或者在菜单栏中点击按钮,在弹出的对话框中输入要加宽的数值。

布局选择布局模式点击图标进入布局模式:1、器件的调入a)快速调入所有器件,其方法是在Keyin 命令栏中输入:“pr –dist * ”b)器件单个调入1)在从菜单栏中点击Place—Place Parts and Cells或者点击图标进入如图界面。

2)选中Unplace选项3)在搜索栏中输入要调入的器件如C14)在下面的列表中选中期间点击按钮把器件添加到下面的列表中。

5)选中添加的器件点击Apply按钮应用。

2、器件的移动选中要移动的器件按F2,器件会随着鼠标移动,或者双击鼠标左键移动单个器件。

旋转器件时选中器件并按F33、原理图和pcb映射点击Setup‐‐‐Cross Probe—Setup弹出对话框,选中所有的选项,点击Apply应用。

然后进入Setup ‐‐‐ Design Entry 打开原理图,选择器件,pcb中对应的器件将会高亮并伴随鼠标移动。

4、器件对其齐(a) (b)1)选中要对其的器件,选择菜单栏中器件对齐命令,从左到右依次是左对齐、右对齐、上对齐、下对齐。

如图(a)所示。

2)选择右对齐命令,器件就会右对齐如图(b)所示。

其它的对齐方式一样,这里就不在叙述。

5、器件Group1)选择要添加成一组的器件2)点击Group图标,将器件变为一组3)取消Group 选择要取消的器件,点击UnGroup取消。

6、查看PIN数1)Output‐‐‐Design Statu 弹出文本框,查看pcb的PIN数2)或者点击菜单栏中的按钮弹出文本框,查看pcb的PIN数。

7、铺铜设置1)选择绘图模式2)在Properties Type 下拉列表中选择Plane Shape3)选择要铺铜的层数和铜的属性4)选择铺铜时的倒角方式5)选择铺铜的形状6)对需要铺铜区域进行铺铜。

DX1S常用功能使用手册(UVM)

DX1S常用功能使用手册(UVM)
**02* + 9 +手机长号+ #
(听到两声确认音表示设置成功)
##02
8Байду номын сангаас
遇忙和无应答转移
** 03 +分机号码
**03* +手机短号(如6999)+ #
**03* + 9 +手机长号+ #
(听到两声确认音表示设置成功)
##03
9
设置日间服务方式
设置夜间服务方式
**11
##11
10
占用指定中继
# 7 +两位中继号
11
缩位拨号
功能码+序号(000—199)
12
记账电话
拨“”+四位账号+四位密码
##00
其它:
1
分机打V网短号
直拨(如:66745)
2
手机打分机
直拨(如:8800)
DX1S数字电话基本功能使用手册
序号
功能
操作
取消功能
1
内部通话
直拨分机号码~
2
呼叫总结
拨0或直拨分机号
3
取移动外线出局
拨9+被叫号码
4
转接
摘机/免提+R键/拍叉+分机号码
R键/拍叉
5
代接指定分机
# +分机号
6
代接任意呼叫
# 9(UVM框)
7
离位转移
** 02 +分机号码
**02* +手机短号(如6999)+ #

uvm monitor写法

uvm monitor写法

在UVM中,Monitor通常是一个继承自uvm_monitor的类。

下面是一个简单的Monitor的基本结构:c复制代码class my_monitor extends uvm_monitor;// 成员变量和方法声明// 构造函数function new(string name = "my_monitor", uvm_component parent = null);super.new(name, parent);endfunction// build_phasevirtual function void build_phase(uvm_phase phase);super.build_phase(phase);// 在此阶段完成Monitor的初始化endfunction// run_phasevirtual task run_phase(uvm_phase phase);// 在此阶段启动Monitorendtask// 接收事务的回调函数virtual function void write(T my_transaction);// 处理收到的事务endfunctionendclass这是一个非常基本的Monitor结构,它定义了一个名为my_monitor的类,该类继承自uvm_monitor。

构造函数用于创建该类的实例,build_phase方法用于在仿真运行前初始化Monitor,run_phase方法是一个任务,用于启动Monitor。

write方法是一个回调函数,用于处理接收到的交易。

在实际使用中,你可能需要根据具体的需求来扩展和定制这个基本结构。

例如,你可能需要添加更多的成员变量和方法,或者在run_phase方法中添加更多的逻辑来处理接收到的交易等等。

uvm import使用规则

uvm import使用规则

uvm import使用规则UVM(Universal Verification Methodology)是一种面向仿真验证和硬件验证的标准方法学。

在UVM中,使用uvm_import可以实现组件之间的信号传递和数据共享。

下面是uvm import使用的一些规则和注意事项:1. 导入端口:通过使用uvm_import,在组件中创建一个导入端口,以便接收其他组件发送的消息。

这个端口的类型是uvm_blocking_put_port、uvm_nonblocking_put_port、uvm_blocking_get_port或uvm_nonblocking_get_port之一,具体取决于你想要实现的消息传递方式。

2. 导出端口:在另一个组件中,使用uvm_export导出一个端口,以便可以将消息发送到导入端口。

导出的端口类型应该与导入端口的类型相匹配。

3. 绑定连接:在组件的构造函数中,使用bind接口将导出端口与导入端口连接起来。

这将确保两个组件之间的消息可以正确地传递。

4. 传递消息:通过在发送组件中调用导出端口的write 方法,可以将消息发送到接收组件的导入端口。

接收组件可以通过调用导入端口的read方法来获取消息。

UVM还提供了其他更复杂的消息传递机制,如get和put。

5. 接收消息:接收组件在读取到消息后,可以根据需要进行处理。

可以根据消息的类型、内容等进行操作,比如修改内部寄存器的值、发起其他动作等。

根据具体的设计需求,可以进一步扩展uvm_import的功能。

6. 错误处理:在使用uvm_import时,需要注意错误处理。

如果发送组件在消息传递过程中出现错误,可以采用异常处理机制来处理错误,确保系统的稳定性和可靠性。

总之,使用uvm_import可以在UVM验证环境中实现组件之间的信号传递和数据共享。

遵循上述规则和注意事项,能够帮助开发人员更好地使用uvm_import,并在验证过程中获得更好的效果。

mentor中文教程

mentor中文教程

一、原理图的绘制:1、建立一个project:打开Design capture → project → new →指定project名和project路径→新建一个project → project/settings:●Central library:指定该project的库文件路径并选择库的类型;●Design:指定各种设计文件存放路径,最下面一行“Absorb instanse data into……”处于选中(打勾)状态,执行“Forward Annotation”时CDB会重新生成(否则需要cdb complier生成cdb);如果block很多时,不要选;●File locations:配置文件管理;●Libraries:指定Central library后,不用管这里;2、file → new →选择“schematic”:新建一个原理图;3、改变原理图尺寸大小:● Place →symbol →选择border →选择期望的尺寸→放在坐标(0,0)处;●view → select filter →点击“select all”→点击原理图中原有的边框→选中并删除→ select filter中点击“reset”(把不可选的东西去掉);说明:编辑原理图设计时间、版本等信息也要先选中再编辑;4、设置库属性和pcb的一些特性(一定要在进行设计前完成):Library manage → edit → property verification →选择原理仿真、热仿真等;Library manage →setup →setup parameters →(一般只能看)5、画原理图:● project →global signals:定义电源网络(net);● Verify →compile CDB →package design →进入expendition pcb二、pcb中pcb文件的建立和网表调入:1、pcb文件建立:file →new →根据job management wizard来建立;2、调入网表:●打开新建的pcb文件,运行forword annotion(或者运行design capture中的PCBintegration);●edit →place →part :在“unplaced”前打勾→选中所有元器件→点击“》”图标把所有元器件放到“active”框中→ apply →左键拖动点击→元件件以及网络连接都到pcb中了;●改动了原理图之后调入网表:在capture中先保存→verify →compile CDB →package design (tools中)→ pcb integration(project中),要执行forword annotation →在pcb中用上述方法把元器件加到pcb文件中;3、修改pcb层数:setup →setup parameters :general →layers →number of physical 中数字改为希望的层数(如“2”)→点击右面的“remap layers”图标→在弹出框中点击“ok”→点击右下角的“apply”→完成设置;4、修改pcb尺寸:在draw mode下拖动原有的板框即可,或者选中框→右键→编辑框属性→修改尺寸,draw mode切换方式如下:注:1、红色框是pcb框,淡兰色框是布局、布线区;2、将尺寸设置为mm:setup →setup parameters→general →右侧→选;Expendition pcb 中常用操作1、选择重叠的不同层的元器件等:左键点住+tab;2、布线:点击工具栏的“route mode”图标(见下图),在器件引脚处点住左键拖动一小段即可(“esc”结束布线、双击切换布线层、单击后可以拐弯);印制线位置调整:在“Route mode”下选中印制线拖动即可;3、设置最小移动距离等:setup→edit control→grids→palcement related 第二行改数字;4、自动布线:进入“route mode”→印制线全选(点住左键画个大框)→del :删除印制线;route →auto route →设置→点击下面的“route”按钮即可;5、自动放置测试点:route →test piont →auto assign →在相应 net 右面required下设置需要的个数→点击“place”按钮即可;注:要在 setup →setup parameters→general 右下角“test piont settings”中设置好测试点的类型等;cell是测试点类型,test选择测试点放在哪一面,ref des 中填写自动命名测试点的前缀;6、铺设地线层:route →planes →place shape →画一个框→在drawing mode下选中该框,点击右键编辑其属性:定义框的网络属性(选择一个net),定义框在哪一层;route →planes →processor →在弹出框中定义“铺设(hatch)”方式→ok●左面:定义同一 net 名的焊盘和过孔的连接方式;●右面:定义clearance(一般25 th);●右下角的工具框:定义印制线 hatch 的宽度和方式;禁布铜皮:edit →place →plane obstruct →画一个框即可;hatch时自动让开;注意1:setup →setup parameters →planes中可以定义某一层为某个net 的planes,设定planes的net只要把希望的net选入“included nets”中即可(当心:只可以选择一个net);不定义“planes层”照样可以“hatch”;注意2:只在“All on”和“display schemes”pcb显示方式下才可以看到铺设的铜皮;7、删除所有的铜皮和导线:都在route下拉菜单下;8、布置泪滴:route →teardrops →设置参数→ apply ;删除泪滴:edit →add to select set → teardrops →按“delete”即可删除;如果不行,再edit →unfix →按“delete”注意:如果pcb空间不够,就不会生成泪滴;9、pcb开槽:“draw mode”下画一个闭合的框,定义其属性为drill drawing ( through )即可;要在view →display control →general 中设置drill drawing层的显示颜色,否则会看不到;Analog design 使用mentor的原理图仿真不需要设计仿真模型,只要按照正常设计来画原理图即可(用于生成网表、调入pcb文件);用于仿真时,只要根据设计选择不同的“source”和“load”,同时设置连接位置(net)就可以了(比pspice、saber要高级);仿真时先打开“project”,然后设置仿真“setup”文件(需要 new、save等,“.vas”文件);仿真“setup”文件包括:source和load的选择和分配、仿真类型选择(进行哪些仿真)、仿真计算哪些输出(monitor)、算法设置等;设置好“setup”文件(.vas)要保存才可以仿真;1、画好原理图,进行一些编译工作(“compile CDB即可”);2、设置输入信号以及信号参考点:进入project →global signals,先指定仿真时的电压参考:选择一个net,“suply attribute”设为“gnd”,仿真时即把该点作为参考电平;指定仿真输入点:选择一个net,其电源属性里选择“positive”或“negtive”;注意:仿真setup文件中“source”中用到的net都要在“global signals 中设定属性”);所有电平参考也要在其中设定“gnd”属性。

UVM实战指南

UVM实战指南

UVM实战指南&t=1&c=fks_000000084⽽为了在widget的对象中使⽤这个函数对象,必须事先在设计好的调⽤点对callback对象可以看出,在执⾏的过程中,可以对widget对象进⾏动态的添加callback,从⽽动态的改变widget对象的动作。

上⾯的例⼦⾮常简单,仅仅是输出⼀些讯息⽽已,有⼀些局限:1.这个callback结构并不能够真的改变widget对象的内部成员,以及处理的数据内容,仅仅能够输出⼀些讯息。

2.对每⼀个widget的对象,都需要单独添加相关callback对象,假如程序中⼜创建了⼀个新的widget对象,那么这个对象的callback queue初始是空的,也就是没有callback。

必须再次添加才能让这个新的widget调⽤相应的callback功能。

3.callback只有⼀个地⽅,可以扩展到多个地⽅。

另外也可以使⽤function,⽽不仅仅是task.⼯⼚模式的简单理解⾸先,如果⼀个客户要⽤到⼀款⼿机,⼀般的做法是客户去创建⼀款⼿机,然后拿来⽤:这时,客户需要知道怎么去创建⼀款⼿机,客户和⼿机就紧密耦合在⼀起了.为了降低耦合,就出现了⼯⼚类,把创建⼿机的操作放到了⼯⼚⾥⾯去,客户直接使⽤⼯⼚的创建⼿机⽅法,传⼊想要的⼿机型号就⾏了,⽽不必去知道创建的细节.随着⼿机种类越来越多,简单⼯⼚模式出现了弊端,每次新加⼊⼿机品种,⼯⼚类都要加⼊新的创建逻辑.这时我们就可以把⼯⼚类定义成了接⼝,⽽每增加⼀种新的⼿机,就增加该⼿机对应⼯⼚类的实现,这样⼯⼚的设计就可以扩展了,⽽不必去修改原来的代码:随着⼯⼚规模的继续扩⼤,⼯⼚开始⽣产充电器了.这时候⼯⼚有⼆个系列的产品:⼿机和充电器.⽽⼿机必须使⽤对应的充电器才能使⽤.这时候分别使⽤⼀个⼿机⼯⼚和⼀个充电器⼯⼚都不能满⾜我们的需求,我们必须确认⼿机跟充电器的对应关系.我们把⼯⼚改造⼀下,把⼿机⼯⼚跟充电器⼯⼚联系在⼀起:抽象⼯⼚模式⼯⼚⽅法模式简单⼯⼚模式UVM实战指南——第1部分2010-10-31 21:54:15| 分类:SystemVerilog| 标签:uvm |字号订阅验证的复杂度已经明显超过设计。

UVM实战指南范文

UVM实战指南范文

UVM实战指南范文UVM(Universal Verification Methodology)是一种基于SystemVerilog语言的验证方法学,广泛应用于硬件验证领域。

在UVM中,通过建立一个可重复使用的测试环境,结合使用事务级建模(TLM)和事务级验收测试(TLM),实现了分层、模块化的测试方法,提高了验证效率和可复用性。

一、UVM基础知识1.UVM组成:UVM主要由以下几个组成部分组成:- testbench:测试平台,包括环境、测试、配置和结果收集。

- environment:包含需要被验证的设计和其他组件,如计时模型(TLM)和监控器。

- agent:代理,用于管理测试和设计之间的数据传输和控制通信。

- sequence:序列,用于控制测试向设计发送输入和观察输出。

- driver:驱动器,控制从测试平台发送数据到设计。

- monitor:监控器,从设计中监听信号和寄存器的值。

- scoreboard:比分板,用于比较设计的输出和期望的输出。

2. UVM中的消息系统:UVM中的消息系统可以用于在验证过程中传递和显示消息信息。

消息分为几个级别,如UVM_DEBUG、UVM_INFO、UVM_WARNING和UVM_ERROR等。

通过设置消息级别,可以控制消息的显示和记录。

在UVM中,可以使用`uvm_info(`,`uvm_warning(`,`uvm_error(`等函数来生成和发送消息。

二、UVM测试环境构建1.UVM测试环境构建:UVM测试环境的构建遵循一个分层、模块化的方法。

首先,可以定义一个基础环境,包含全局配置和全局测试。

然后,可以在基础环境的基础上构建更高级的环境,如顶层环境和模块环境。

在每个环境中,可以定义组件(如代理、序列和监控器)和接口,然后进行连接。

三、UVM测试流程1.UVM测试配置:首先,可以使用UVM配置对象来指定测试的配置选项,如时钟频率和寄存器的初始值。

uvm 引用路径 -回复

uvm 引用路径 -回复

uvm 引用路径-回复什么是UVM?UVM,全称为Universal Verification Methodology,即通用验证方法学,是一种用于硬件设计验证的开放标准。

UVM基于SystemVerilog语言开发,并由由Accellera Systems Initiative管理和维护。

UVM提供了一套验证框架和库,能够加速和简化硬件设计验证过程。

它提供了一系列的验证组件和方法,用于创建可重用的测试环境,支持各种设计的验证需求,并能够提高验证的效率、可靠性和可维护性。

UVM的引用路径在使用UVM时,我们要先设置引用路径才能正确地使用UVM库。

引用路径是指指定编译器搜索UVM库的路径。

1. 导入UVM库首先,我们需要将UVM库导入我们的工程中。

可以通过从网站上下载UVM库,并将其解压到工程目录下。

2. 设置引用路径在使用UVM之前,我们需要设置引用路径。

引用路径是一个环境变量,告诉编译器在哪里搜索库文件。

设置引用路径可以通过以下两种方式实现:- 通过源代码管理工具如果我们使用源代码管理工具,例如Git,可以通过将UVM库放在特定的目录中,并将该目录添加到源代码管理工具的路径中,从而设置引用路径。

这样,当我们在工程中使用UVM时,编译器会自动在该目录中查找UVM库。

- 在项目设置中手动设置如果我们没有使用源代码管理工具,或者希望手动设置引用路径,可以在项目设置中手动设置引用路径。

具体设置步骤如下:a. 打开工程设置打开我们使用的集成开发环境(IDE),找到工程设置选项。

b. 设置引用路径在工程设置中,我们可以找到一个选项来设置引用路径。

点击该选项并添加UVM库所在的路径。

c. 验证设置确保设置成功后,我们可以进行一些基本的验证,例如编译一个使用UVM的测试模块,并确保编译器能够正确地找到和引用UVM库。

d. 保存设置确认设置正确后,我们需要保存设置,以便在以后重新打开工程时,可以自动加载正确的引用路径。

uvm sample的规则

uvm sample的规则

uvm sample的规则UVM Sample的规则UVM(Universal Verification Methodology)是一种用于验证硬件设计的标准方法。

UVM Sample是一个基于UVM的验证环境示例,旨在帮助工程师快速上手并掌握UVM的使用方法。

为了保证验证环境的正确性和可靠性,需要遵循以下规则:一、文件命名规则1. 所有文件名应该使用小写字母。

2. 文件名应该简洁明了,能够清楚地表达文件的内容。

3. 文件名中不应该包含空格或特殊字符。

二、代码编写规范1. 编码风格应该统一,符合公司或项目组的编码规范。

2. 代码应该清晰易懂,注释充分且准确。

3. 不要使用全局变量,尽量使用类成员变量进行数据传递和共享。

4. 使用SystemVerilog语言时,不要使用过时的Verilog语法。

三、测试用例编写规范1. 每个测试用例都应该具有唯一性,并且测试目标明确。

2. 测试用例应该覆盖所有重要功能和边界情况。

3. 测试用例应该尽可能独立,不依赖于其他测试用例或模块。

四、仿真环境搭建规范1. 仿真环境应该尽可能简洁,只包含必要的模块和组件。

2. 仿真环境中的各个模块和组件应该紧密协作,保证仿真的正确性和可靠性。

3. 仿真环境应该具有良好的可扩展性,能够方便地添加新的模块或组件。

五、仿真结果分析规范1. 仿真结果应该准确无误地反映出被验证设计的行为和性能。

2. 对于异常或错误情况,需要进行详细的分析并及时修复。

3. 对于大量数据或复杂情况,需要使用专业的数据分析工具进行处理。

六、文档编写规范1. 所有文档应该清晰明了,内容准确完整。

2. 文档中应该包含足够的示例代码和截图,方便读者理解和学习。

3. 文档应该及时更新,保持与实际情况一致。

七、版本控制规范1. 所有代码和文档都应该纳入版本控制系统中进行管理。

2. 每个提交都应该有明确的提交信息,并且符合公司或项目组的提交规范。

3. 版本控制系统中应该定期进行备份和维护,保证数据的安全性和完整性。

UVM实战指南范文

UVM实战指南范文

UVM实战指南范文UVM(Universal Verification Methodology)是一种用于硬件验证的标准化方法学,它提供了一种强大的框架来设计和验证复杂的芯片和系统。

本文将介绍UVM的基本概念和使用方法,并提供一些实战指南,帮助读者深入了解和应用UVM。

UVM的基本框架包括四个主要组件:环境(Environment)、代理(Agent)、序列(Sequence)和驱动(Driver)。

环境是验证组件的容器,在其中实例化并连接各个代理,还负责配置和管理验证环境。

代理是验证环境中的一个子模块,负责实现和模拟芯片中的接口和功能。

序列是生成器和监控器之间的通信通道,用于生成和检查输入数据。

驱动是一个接口模块,负责向被测单元(DUT)发送序列。

UVM的使用方法可以分为以下几个步骤:1. 创建环境:首先,在UVM中创建一个环境(即testbench),并在其中实例化各个代理和其他必要的组件。

环境还负责配置和管理验证环境中的各个模块。

2.实例化代理和DUT:在环境中实例化代理和DUT,将它们连接起来。

代理模块负责实现和模拟芯片中的接口和功能,而DUT是待验证的芯片。

3.编写序列和生成器:根据测试需求,编写序列和生成器,用于生成输入数据和控制测试流程。

序列是生成器和监控器之间的通信通道,用于生成和检查输入数据,根据指定的顺序发送。

4.实现驱动和监控器:编写驱动和监控器代码,用于向DUT发送和接收数据。

驱动负责将序列中的数据发送给DUT,监控器负责检查和采集来自DUT的输出数据。

5. 运行仿真:通过调用uvm_config_db和uvm_top函数来完成对整个验证环境的配置和管理,并调用run_test函数来运行验证。

在实战中,我们需要注意以下几个关键点:1.数据驱动:UVM基于数据驱动的方法,即通过输入数据来驱动测试流程。

因此,在设计测试用例时,需要考虑各种可能的输入组合,并确保测试覆盖所有的边界条件。

uvm中mirror的用法

uvm中mirror的用法

uvm中mirror的用法在UVM(Universal Verification Methodology)中,mirror是一种常用的操作,用于读取DUT(Design Under Test)中寄存器的值并将它们更新到寄存器模型中。

它的函数原型如下:复制代码task uvm_reg::mirror(output uvm_status_estatus, input uvm_check_e check=UVM_NO_CHECK, inputuvm_path_e path=UVM_DEFAULT_PATH, ...);这个函数有多个参数,常用的只有前三个。

其中,第二个参数是一个枚举类型,如果发现DUT中寄存器的值与寄存器模型中的镜像值不一致,那么在更新寄存器模型之前是否给出错误提示。

可选的值为UVM_CHECK和UVM_NO_CHECK。

mirror操作可以在仿真中不断地被调用,使整个寄存器模型的值与DUT中寄存器的值保持一致。

这种用法通常在仿真即将结束时被调用,用于检查DUT中寄存器的值与寄存器模型中寄存器的镜像值是否一致。

值得注意的是,mirror操作会更新期望值和镜像值。

它既可以在uvm_reg级别被调用,也可以在uvm_reg_block级别被调用。

当调用一个uvm_reg_block的mirror时,其实质是调用加入其中的所有寄存器的mirror。

此外,为了快速找出问题,会在仿真即将结束时使用mirror检查。

为了实现在参考模型中更新寄存器模型而不影响DUT的值,可以使用UVM_PREDICT_DIRECT。

predict操作会更新镜像值和期望值。

当然可以,以下是两个使用UVM中mirror操作的例子:1.在仿真中不断调用mirror,使寄存器模型的值和DUT 的值一样:复制代码class my_test extends uvm_test;my_dut dut;my_reg_model model;`uvm_component_utils(my_test)function new(string name, uvm_component parent);super.new(name, parent);endfunctionfunction run_test();model = my_reg_model::type_id::create("model", this);dut = my_dut::type_id::create("dut", this);dut.connect(model);run_test_child(dut);endfunctionvirtual function run_test_child(uvm_component child);super.run_test_child(child);while (true) beginmodel.mirror(null, UVM_NO_CHECK,UVM_DEFAULT_PATH);#1; // delay for a whileendendfunctionendclass在这个例子中,我们创建了一个名为my_test的测试类,它包含一个DUT实例和一个寄存器模型实例。

uvm中mirror的用法

uvm中mirror的用法

uvm中mirror的用法在UVM中,mirror是一种机制,用于在测试过程中监视和捕获被测试对象的行为,并将其记录到mirror对象中以供后续分析。

通过使用mirror,测试人员可以轻松地获取和分析与被测对象的交互相关的数据。

下面是在UVM中使用mirror的一般步骤:1. 创建mirror对象:需要创建一个mirror对象,该对象将用于记录和存储被测试对象的行为数据。

可以使用UVM提供的`uvm_mirror`类来创建mirror对象。

```systemveriloguvm_mirror myMirror = new("my_mirror");```2. 连接mirror对象:将mirror对象与被测试对象连接起来,以便将其监视和捕获到的数据记录到mirror对象中。

可以使用UVM提供的`uvm_connect()`函数进行连接。

```systemveriloguvm_connect(myMirror, myDUT);```3. 启用mirror:启用mirror对象以开始捕获被测试对象的行为数据。

可以使用mirror对象的`start_tracing()`方法来启用mirror。

```systemverilogmyMirror.start_tracing();```4. 获取和分析数据:在测试运行期间,mirror对象将自动记录和存储被测试对象的行为数据。

可以使用mirror对象的不同方法来获取和分析数据。

```systemverilogmyMirror.get_data(); // 获取捕获的行为数据myMirror.analyze_data(); // 分析行为数据```以上是在UVM中使用mirror的一般步骤。

使用mirror可以帮助测试人员监视和分析被测试对象的行为,从而更好地了解和改进测试过程。

uvm demote用法

uvm demote用法

uvm demote用法在UVM中,`uvm_demote`是一个宏,用于降低当前消息的优先级。

`uvm_demote`宏会接收一个消息对象作为输入,并将其优先级降低到底层队列中的下一个优先级。

这对于在处理消息时,需要临时降低优先级的情况非常有用。

下面是一个使用`uvm_demote`的示例:```verilogtask run_phase(uvm_phase phase);forever beginuvm_sequence_base seq;uvm_seq_item_base item;seq = seqr.get_next_sequence();if (seq == null)continue;item = seq.get_next_item();if (item == null)continue;// 如果消息的类型是特殊类型,则降低优先级if (item.get_type_name() == "SpecialMessageType") begin`uvm_info("run_phase", $sformatf("Processing special message: %s", item.convert2string()), UVM_HIGH)uvm_demote(item) // 降低特殊消息的优先级end else begin`uvm_info("run_phase", $sformatf("Processing message: %s",item.convert2string()), UVM_MEDIUM)end// 处理消息handle_message(item)// 完成消息后,记得释放资源item.done()seq.item_done()endendtask```在上面的例子中,如果收到特殊类型的消息,将通过`uvm_demote`宏将其优先级降低,以确保其他更重要的消息能够及时处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

UVM:下一代验证方法学Mark Glasser,方法学建构师2011年2月4日UVM是验证业界为自身研发的一种新验证方法学。

UVM代表着验证技术的最新进展,使用它可创建坚实、可重用、具互操作性的验证IP和测试流程(testbench)组件。

UVM最新奇、最令人兴奋的方面之一却是它是如何被开发的。

UVM不是由一家EDA供应商开发的,也并非作为营销活动的一部分而推出,它是由众多业内专家联合开发的,他们来自微处理器公司、网络公司、验证顾问机构以及EDA供应商。

UVM的全部开发工作是在Accellera(一个标准化组织,致力于开发电子设计自动化领域里的标准和开放接口)架构下完成的。

在一个标准组织的旗帜下,各家公司(其中一些是市场上的对手)才能够在协作的环境中携起手来,以迎战建构一个先进验证方法学所面临的技术挑战。

每位代表为这一协同努力都贡献了他们所在行业的专业知识和视角。

其结果是为建构验证环境贡献出一个强大、多维的软件层和方法学。

当然,UVM已经在主要EDA供应商的所有模拟器上都进行了测试。

UVM的确是种真正的行业创举,Mentor以亲历其中而自豪。

UVM并非从天而降。

它集许多独立验证方法学的成果之大成。

其承继的资产包括AVM、URM,VMM和OVM。

图1. UVM的继承UVM承继的这些方法学提供了UVM得以建立其上的丰富的方法学库。

最值得注意的是,OVM-2.1.1是UVM的“起点”,是UVM得以孕育成功的种子代码库。

因此,UVM与OVM最相近,且大体上向后兼容OVM。

作为VMM一部分的RAL 包被转化为UVM的寄存器功能。

虽然上面提到的一系列方法学是UVM得以成就的种子,但UVM并非其前辈代码的简单叠加。

UVM为测试流程(testbench)建构提供了新功能和新的使用模式,从而将验证方法学提升到一个新高度。

寄存器在现代SoC设计中,寄存器集合是作为设计的接口。

通过寄存器——器件得以复位和配置;数据得以接收和发送。

对于验证任一种器件的功能,对其寄存器实施建模是至关重要的。

UVM提供了建模所有类型寄存器所需的全面功能。

这些功能包括:“后门访问”——通过其相应的UVM模型,在RTL中访问寄存器的能力。

图2. 基本的寄存器配置要使用寄存器功能,你必须创建一个包含一组寄存器和其中各寄存器被映射至的总线地址的映配图。

一个寄存器序列使用该图来定位寄存器并确定其总线地址。

寄存器使用方法,如read()和write()生成一个被发送到排序器(sequencer)的总线交易。

总线交易包含从寄存器映配图中收集到的寄存器地址。

寄存器被包含在一个称为寄存器块的构造内。

寄存器块不仅包含寄存器,还包含寄存器文件和其它寄存器块。

这样,与系统一样,寄存器块也可进行层级整合。

子块内的寄存器在母块地址空间内被再定位。

叶块(leaf block——不包含其它寄存器块的一种块),通常代表总线(即一个地址空间内)上的一个器件。

复合块(包含其它寄存器块的一种块),代表一个系统或子系统。

当向母块添加一个块时,则在母块地址空间内,自动对新块地址实施再定位。

分阶段(Phasing)UVM测试流程的执行是由集中控制器精心组织的。

控制器在测试流程的每个阶段分步实施各相关测试。

UVM支持构建为正确地激励和响应SoC所需的复杂的阶段(phase)机制。

UVM具体规定了一个可适应于大多数SoC设计风格的基础阶段集合。

对那些基础阶段集合不够用的部分,UVM为用户自己添加所需阶段提供了一种方法,并具体规定了所添加的阶段相对于其它阶段的顺序。

一个阶段是执行测试流程中某些部分的一种功能或一个任务。

你可把它作为测试流程执行的一个步骤。

分阶段执行就是逐个阶段地执行各个步骤。

当所有阶段都完成,整个测试流程也就完成。

在测试执行时,在测试流程内的每个组件都处在同一阶段。

当所有功能或任务都完成后,分阶段执行就过渡到下一阶段。

这样,在测试流程执行时,所有组件都保持同步。

UVM给分阶段机制带来了一些创新。

UVM以有向(directed)图的方式组织各阶段,而不是采用直线排序的方式。

有向图的结构支持阶段的部分排序——也即:某些阶段可以一道并行运行,而其它阶段则顺序运行。

右图是个例子。

大部分阶段是顺序操作的。

注意:在start-of-simulation后,reset-init-main-shutdown注1分支与run阶段并行执行。

在start-of-simulation完成后,reset和run阶段同时开始。

左边分支的运行独立于run阶段。

只有当左分支完成了shutdown阶段,并且run阶段也完成后,才会重新汇集,并开始执行extract阶段。

执行也可以向后跳,以再次执行某一阶段;或向前跳,以跳过某一阶段。

此功能可对复位或其它异步行为进行建模。

UVM提供了一套内置的阶段,测试流程制造商可以使用这些阶段创建执行其测试流程所需的必要步骤。

此外,用户可以创建自己的阶段以定制其特定用途的测试流程。

资源配置测试流程是其运作的一个重要部分。

它涉及到使测试流程内各元素都能享有各种信息。

UVM提供一种称为资源(resources)的功能,它使您能够有效、精确地配置一个测试流程。

_____________________注1:上述每个阶段都还有一个与之相伴的前和后阶段(例如:pre_reset、reset、post_reset)。

为简化,这些并未在图中表述。

资源是一个可包含任意类型对象的容器。

对象可以是一个比特、一个整数、一个类对象、一个虚拟接口,或其它任何东西。

资源存储在一个称为资源池的集中式数据库内。

测试流程内的任一对象都可以访问资源池以设置或获取资源。

每种资源都有一个正则表达式以表示其可见作用域的设置。

正则表达式是一组字符串的速记符号。

在此例,这些字符串是作用域的名称。

作用域名称是以“点”作为层次元素分隔符的层次名称。

例如,top.env.agent有三个要素:top,env和agent。

正则表达式top.env .*代表以top.env开始的所有字符串。

这个符号是指所有服从top.env管辖的作用域。

当对象在资源池中查找资源时,它将自身规定为属于一个特定作用域,其被称为当前作用域(current scope)。

查找功能会询问:匹配所有其它搜索条件的资源是否也匹配当前作用域。

如果也匹配,它就返回找到的这个资源。

根据名称和类型对资源进行存储。

可根据其名称或类型存储和检索资源。

在你知道类型是独一无二的情况下,按类型检索就很有用。

例如,考虑这样一种情况:使用一个配置对象、且配置对象的类型是类参数的一个代理(agent)。

class some_agent #(type CONFIG=int) extends uvm_component; endclass代理可通过检索类型容易地从资源池中检索到其配置对象,因可以确信:由CONFIG类参数指定类型的对象就是其所需要的。

在这种情况下,名称是不必要的。

由于资源池是一个集中的单态结构,所以任何测试流程元素都可以访问它。

这包括:组件(components)、序列(sequences)或任何其它元素。

例如,序列可以从资源池获取信息以指导自身的操作。

寄存器序列可以从资源池获取寄存器映配图。

由于资源的通用性质,故可以有多种使用模式。

【参考1】描述了其中一些模式。

TLM2事务级建模一直是现代验证方法学的核心。

使测试流程尽可能多地保持在高层次抽象水平对建构坚实和可重复使用的测试流程非常重要。

UVM包括的TLM-2.0实现,是提升事务级建模功能的坚实一步。

TLM-2.0是一种用于建构和连接遵从OSCI(Open SystemC Initiative)开发的事务级组件的标准方法学,并将成为IEEE -1666-2011标准的一部分。

当然,UVM是在SystemVerilog中实现的,且包括TLM-2.0标准的基本要素。

【参考2】详细论述了TLM-2.0是如何从SystemC转变为SystemVerilog的。

在TLM-2.0中,组件间移动交易的机制基于如下三个接口:function uvm_tlm_sync_e nb_transport_fw(T t, ref P p, input uvm_tlm_time delay); functionuvm_tlm_sync_e nb_transport_bw(T t, ref P p, input uvm_tlm_time delay); task b_transport(T t,uvm_tlm_time delay);nb_transport_fw() 和nb_transport_bw() 用于双向无阻塞通信。

b_transport() 是阻塞通信任务,类似于TLM-1.0的put() 或get() 。

TLM-1.0和TLM-2.0之间的本质区别在于:TLM-2-0中,交易对象是通过引用(reference)传递的。

这会使通信更有效,因其所需的数据复制要少。

这些接口都包含在插槽(socket)中,插槽是类似端口那样的用于在组件间建立连接的对象。

一个插槽同时包含正向和反向路径。

图3. TLM-2.0插槽TLM-2.0支持不同类插槽。

插槽可是一个发起者或目标,也可是一个终结者或直通,它有阻塞或非阻塞两种接口。

这就可有八种不同的插槽组合,如下表所列:直通插槽用于跨层次边界的插槽连接。

终结者可是发起交易的发起人,也可是接收交易、并在反向路径发送响应的目标。

阻塞插槽使用阻塞接口并可能消耗时间,非阻塞插槽使用非阻塞接口,它是功能且不占用时间。

摘要UVM代表着下一代验证方法学。

它是许多行业组织协同努力的结果,并非出自一家之手。

UVM的诸多新功能将验证方法学提升到一个新高度,这些新功能包括:复杂的分阶段机制、建模寄存器功能、称为资源的综合配置能力、以及新的事务级建模标准——TLM-2.0——的SystemVerilog实现。

参考书目[1] M. Glasser, Advanced Testbench Configuration With Resources,Proceedings of DVCon 2011[2] M. Glasser and J. Bergeron, TLM-2.0 in SystemVerilog, Proceedings of DVCon 2011[3] M. Glasser, The OVM Cookbook, Springer, 2009[4] A. Erickson, <Adam’s paper on macros, I don’t have the title>, Proceedings of DVCon 2011[5] G. Allan, “Verification Patterns in the Multicore SoC Domain”, Proceedings of DVCon 2011[6] IEEE-1800-2009, SystemVerilog Language Reference Manual, 2009[7] Accellera, UVM-1.0 Reference Manual, 2011。

相关文档
最新文档