与UVM的第一次接触

UVM(通用验证方法学)是基于SystemVerilog的一种验证标准,由行业巨头联合推出,用于数字逻辑电路的验证。本文介绍了UVM的起源、在IC设计流程中的角色、与SystemVerilog的关系及验证语言的比较,强调了方法学的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.1 UVM是什么?

UVM 是 Universal Verification Methodology 的缩写,即通用验证方法学。它起源于 OVM(Open Verification Methdology),是由 Cadence, Mentor 和 Synopsys 联合推出的新一代的验证方法学。

1.1.1UVM主要用在什么地方

UVM 主要用于验证数字逻辑电路的正确性。何谓验证?在数字电路的设计流程中,最开始的时候会定义需求,把需求细化成为特性列表(feature list),之后设计人员利用 verilog 或者 systemverilog 把特性列表翻译成为 RTL 代码。在翻译的过程中,由于各种各样的原因,如设计人员自身对于 feature list 的理解不清,设计人员不小心遗漏了某种情况,这样翻译后的 RTL 代码就不能完全的反映 feature list。验证的含义就是把 feature list 和 RTL 代码比对,看看 RTL 是否能实现 feature list 的功能。被测试的 RTL 代码通常称为 DUT(Design Under Test)或者 DUV(Design UnderVerification);
 

1.1.2 验证在现代IC流程中的位置 

现代IC前端的设计流程如图所示:

在上面的这幅图中,设计人员使用的是 verilog,其实这里也完全可以使用systemverilog 实现。就如我们可以使用 c++来写 c 代码,并可以完全的用 c++的编译器来编译 c 的代码一样, systemverilog 也完全包含了 verilog,换言之, verilog 只是
systemverilog 的一个子集

通常的IC设计从一份需求说明书开始,IC工程师会把它细化为特性列表;设计工程师根据特性列表,将其转化为设计规格说明书,在这份说明书中设计工程师会详细阐述自己的方案, 描述清楚接口时序信号、使用多少RAM资源、如何进行异步处理等;验证工程师根据特性列表,写出验证规格说明书,将会说明如何搭建验证平台、如何保证验证完备性、如何测试每一条特性、如何测试异常等;

当设计说明书完成后,设计人员开始用verilog将特性列表转换为RTL代码;验证人员则开始使用验证语言,搭建第一个测试用例(test case);当RTL代码完成后,验证人员开始验证这些代码(DUT design under test)的正确性;

1.1.2 验证的语言 

验证是服务于设计的,现在通常有两种设计语言:verilog和 VHDL;verilog由于其通用性在IC设计领域占据了主导地位,基于verilog的验证语言主要有:

(1)verilog: verilog是针对设计的语言, verilog在验证方面的最大不足是功能模块化、随机化验证上的不足,这导致更多的是直接测试用例(激励是固定的,其行为也是固定的),而不是随机测试用例(激励在一定范围内是随机的);

(2)systemC:其本质上是一个C++库,在C++中用户需要自己管理内存,指针会把人搞得头大;

(3)system verilog:它是一个verilog的扩展集,可以完全兼容verilog;其具有所有面向对象语言的特性:封装、继承和多态;同时还为验证提供了一些独有的特性,如约束、功能覆盖率;

1.1.3 何谓方法学

有了system verilog后是不是足以搭建一个验证平台了呢?答案是肯定的,只是很难;就像汉语是优秀的语言一样,自古以来无数的名人基于它创造了很多优秀的篇章,在这些篇章的基础上,作家通常引用几句就会使自己的文章出彩,这些优秀的篇章就是汉语言的库;同样system verilog作为一门优秀的语言,但如果仅仅使用它来进行验证是远远不够的,有很多直接的问题需要考虑,如:验证平台有哪些基本组件,各个组件之间如何进行连接和通信,每个组件的行为有哪些等等....从UVM的角度讲,方法学只是一个库!!

UVM 是建立在 systemverilog 平台上的一个库它提供了一系列的接口,让我们能够更方便的进行验证。什么是库? 我们大家都学习过 C 语言,其中的 stdlib.h,stdio.h, math.h 等就是 C 语言的库。库之最其本的目的就是方便人们的使用。像一个 sin 函数,如果没有 math.h,让自己来写,那要怎么写呢?使用泰勒展开吗?那要展开多少级呢?库则把这些基本的、同时又经常使用的细节给隐藏了,让我们更加方便的编写验证平台;

如下面的第一例子所示,我们期望在信息打印时同步输出时间,在 systemverilog中只能在 display 语句中调用 time 函数。但是在 uvm 中,只要使用 uvm_warning 或者 uvm_error 或者 uvm_info 宏等, UVM 会自动帮你添加时间。在第二个例子中,经
常会在出错的时候要打印一些字符,当后来问题解决的时候,我们不希望这些语句出现,于是就只能把 display 语句手工删除。但是在 UVM 中,通过设置 uvm_info 宏的 verbosity 特性,可以设置在正常运行的时候不打印这些信息,而只在调试的时候才打印,从而根本不必删除这些语句;

 

1.2 学了UVM之后能干什么?

1.2.1 验证工程师 

1.2.2 设计工程师 

在IC设计领域,验证与设计不分家; 

<think>嗯,用户想了解在UVM中如何一次声明多个队列。首先,我得回忆一下UVM中的相关知识点。UVM是基于SystemVerilog的,所以可能需要考虑SystemVerilog的语法。 用户提到的是声明多个队列,这里应该是指队列类型的数据结构。SystemVerilog中的队列是用datatype后面跟一个美元符号和方括号,比如int q[$]。那如何一次声明多个呢?可能需要同时声明多个变量,每个都是队列类型。 比如,像同时声明多个整型变量那样:int a, b, c;。那对于队列,可能可以写成int q1[$], q2[$], q3[$];。这样每个变量都是int类型的队列。不过用户可能想要的是同类型的多个队列变量,这样写应该没问题。 另外,用户可能还会想用typedef来简化声明。比如先定义一个队列类型,然后用这个类型声明多个变量。例如: typedef int int_queue[$]; int_queue q1, q2, q3; 这样可能更清晰一些,尤其是当队列类型比较复杂的时候,比如包含结构体或者其他类型的时候,typedef会很有帮助。 然后,可能需要给出一些例子,说明如何初始化或者操作这些队列。比如q1 = {1,2,3}; q2.push_back(4);等等。不过用户的问题主要是声明部分,所以例子可能不需要太复杂。 还需要注意UVM中的常见用法,可能在UVM组件之间传递数据时使用队列,或者配置对象中有多个队列的情况。但用户的问题比较基础,可能不需要深入到UVM的具体应用场景,而是语法层面的声明方法。 另外,可能需要提醒用户声明时初始化的方法,或者在声明后如何正确使用这些队列,避免常见的错误,比如越界访问或者未初始化的问题。但用户的问题集中在声明上,这部分可能作为补充说明。 总结一下,回答应该分两点:直接声明多个变量和使用typedef的方式。每种方法给出示例代码,并简要说明其适用场景。这样用户可以根据自己的需要选择合适的方式。</think>在UVM(基于SystemVerilog)中,可以通过以下两种方式一次性声明多个队列: 1. **直接声明方式**(适用于简单类型) ```systemverilog int queue1[$], queue2[$], queue3[$]; // 声明三个整数队列 string names[$], addresses[$]; // 声明两个字符串队列 ``` 2. **typedef方式**(推荐用于复杂类型) ```systemverilog typedef int int_queue[$]; // 定义队列类型别名 typedef string str_queue[$]; int_queue data_queue, temp_queue; // 声明两个整数队列 str_queue log_queue, msg_queue; // 声明两个字符串队列 ``` **扩展说明**: - 队列特征:动态大小、支持前后插入(push_front/push_back)和弹出(pop_front/pop_back)操作 - 典型应用场景: ```systemverilog // 在UVM组件中声明多个事务队列 uvm_tlm_analysis_fifo #(my_transaction) input_fifo[$], output_fifo[$]; // 配置对象中使用队列 class my_config extends uvm_object; int_queue timeout_values; str_queue error_messages; endclass ``` **注意事项**: 1. 所有队列声明后默认初始化为空队列 2. 可通过赋值语句批量初始化: ```systemverilog int_queue a = '{1,2,3}, b = '{4,5}, c; // c初始化为空队列 ``` 3. 对参数化类型的支持: ```systemverilog typedef uvm_queue#(int) uvm_int_queue; uvm_int_queue q1 = new(), q2 = new(); ``` 这种声明方式在UVM验证环境构建中非常常见,特别是在需要管理多个同类型数据集(如事务缓存、配置参数集等)的场景下能显著提升代码可读性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值