- 博客(102)
- 资源 (15)
- 收藏
- 关注

原创 fpga状态机详解
什么是状态机:状态机通过不同的状态迁移来完成特定的逻辑操作状态机的分类:Moore型状态机和Mealy型状态机Moore型:状态机的变化只与当前的状态有关Mealy型:状态机的变化不仅与当前的状态有关,还与输入有关如何创建状态机:状态机的创建可以分为一段式,两段式和三段式一段式:主要是讲所有的状态变化以及导致的输出变化都写在了一个always快中。两段式:将一些复位信号,clk信号单独写在
2015-11-17 20:43:15
13413
原创 Ubuntu虚拟机链接gitee/gitee
在Git或者Gitee中创建一个Git账号或者Gitee账号,绑定邮箱,Ubuntu下的git命令对Git或者Gitee都有效。Ubuntu下下载git命令: 1.在下载完之后,可以通过查看git安装版本;安装git之后,需要对git进行全局配置,即配置用户名和账户。配置用户名命令(这个用户名可以随意起): 1.配置邮箱命令: 1.在配置完之后,可以使用以下命令查看配置: 1. 1.4.SSH密钥4.1 生成密钥的命令
2025-08-07 11:24:09
775
原创 uvm-register-backdoor-access
UVM寄存器模型允许通过前门访问被测器件寄存器,正如我们之前在寄存器环境中看到的那样。这意味着环境中的所有寄存器读写操作都会转换为总线事务,并驱动到设计的总线接口中,就像典型系统中任何其他硬件组件所做的那样。由于这些访问以有效的总线事务形式发送,因此会消耗总线周期。这是验证任何设计中寄存器的推荐方式,因为它与系统中实际发生的情况高度相似。
2025-08-05 17:08:03
363
原创 uvm-register-model-example
在前几篇文章中,我们已经了解了什么是寄存器模型以及如何利用它访问特定设计中的寄存器。现在让我们通过一个完整示例,演示如何为给定设计编写此类模型、如何将其集成到验证环境中,以及如何通过它实现设计寄存器的读写操作。
2025-08-05 17:05:13
1348
原创 connecting-register-env
在前一阶段,我们已在寄存器环境中定义并创建了所需的所有内容。然而,负责驱动这些寄存器事务的代理尚未被定义。
2025-08-05 16:51:33
204
原创 uvm-register-environment
如果代理驱动程序通过put()或item_done()提供了单独的响应项,则应将bit provides_responses设置为1,以便寄存器模型知道在将其转换为寄存器项之前必须等待响应。适配器需要是双向的,以便能够将通用寄存器项转换为总线事务,并将总线事务响应转换回通用寄存器项,从而在寄存器模型中更新。现在我们需要为预测器提供映射方案,使其能够将地址值与模型中的寄存器地址匹配,并获取适配器的句柄以便直接接收转换后的总线值。方法向设计写入一个值,它可以轻松地用写入的数据更新模型中该寄存器的镜像值。
2025-08-05 16:44:24
889
原创 uvm-register-model
寄存器模型为数字设计中的寄存器和存储器映射结构提供了一种结构化和标准化的建模与验证方法。它由UVM类对象构成的层次化模块组成,这些模块结构与设计中的寄存器和存储器一一对应。由于典型设计包含数百个寄存器,寄存器模型生成通常通过定制脚本或标准软件工具(如Synopsys的RalGen或Cadence的RGM)完成。这些工具以寄存器规范(例如IPXACT XML文件)作为输入,生成包含使用标准UVM寄存器类定义字段和寄存器的SystemVerilog文件。
2025-08-05 16:37:07
557
原创 using-decl-macro-in-tlm
我们在TLM - Put中看到过这样的场景:发送到组件B的数据是通过B中定义的put()方法执行的。现在考虑有两个组件A和C连接到B的导出端口的情况。此时,无论是组件A还是组件C发送的数据对象,都将由组件B接收并通过同一个put()方法进行处理。如果需要分别处理这两种数据,就需要定义两个独立的put()方法。UVM为我们提供了宏,用于处理组件需要提供两个put实现端口的情况。my_put_impput()当宏被调用时,UVM会生成两个新类和。这就是为什么在创建对象时必须为附加参数的原因。这些类中定义的。
2025-07-30 17:51:12
152
原创 uvm-tlm-sockets
TLM 2.0引入了套接字(Socket)机制,实现发起方(initiator)与目标方(target)组件间的异步双向数据传输。套接字与端口(port)和导出(export)同源,均继承自uvm_port_base基类。发起事务的组件使用发起方套接字(initiator socket),称为发起方;接收事务的组件使用目标方套接字(target socket),称为目标方。需注意:发起方套接字仅能连接目标方套接字,目标方套接字仅能连接发起方套接字。
2025-07-30 17:47:38
300
原创 uvm-tlm-analysis-port
我们之前所见的put/get通信通常需要一个对应的export来提供实现。引入分析端口(analysis port)的理念在于,像监视器(monitor)这样的组件应该能够生成事务流,而无需关心是否有实际目标连接到它。是一个基于TLM的专用类,其接口仅包含一个write()函数,并可嵌入到任何组件中(如下代码片段所示)。该端口维护着与其连接的一系列分析导出(analysis exports)。当组件(如my_monitor)调用时,它会遍历该列表并调用每个已连接导出的write()方法。
2025-07-30 17:45:16
589
原创 uvm-tlm-example
此UVM TLM示例运用了前文讨论的put端口、TLM FIFO和get端口,构建了一个在不同层级包含TLM端口的测试平台。TLM FIFO 可以扩展为包含另一个名为componentB的组件,该组件使用另一个内部FIFO和子组件来接收数据包。下面定义了一个名为Packet的类,作为在不同组件之间传输的数据项。该类的对象将包含两个随机变量,这些变量在发送前可以被随机化。
2025-07-30 17:37:45
732
原创 uvm-tlm-fifo
假设发送方的数据速率远高于接收方获取数据包的速率。此时需要在两者之间加入一个FIFO(先进先出)缓冲单元来存储数据包,从而使发送方和接收方能够独立运作。FIFO的深度通常根据数据传输速率计算得出。在测试平台组件之间,当存在不同速率传输数据对象的情况时,就会部署TLM FIFO进行缓冲协调。
2025-07-30 17:23:34
308
原创 uvm-tlm-nonblocking-get-port
前文展示了使用本质为阻塞性质的TLM端口的示例,其中接收方会停滞等待发送方完成get任务。类似地,UVM TLM还提供非阻塞类型的,发送方需通过try_get来检测get是否成功,或通过can_get方法判断发送方是否已准备好启动传输。与之前相同,UVM TLM非阻塞get端口最终应连接到非阻塞get实现端口。
2025-07-30 17:19:54
303
原创 uvm-tlm-blocking-get-port
任何组件都可以通过TLM get端口请求从另一个组件接收事务。发送组件应定义get端口的实现。该实现让发送方有机会定义需要发送给请求方的内容。这与之前文章中介绍的put端口正好相反。端口本质上可以是阻塞或非阻塞的,这将决定get方法是否会阻止接收方的执行,直到发送方发送对象。下面显示的示例是一个组件中的TLM阻塞get端口,连接到另一个组件中的实现端口。
2025-07-30 17:15:10
421
原创 uvm-tlm-port-export-imp
UVM TLM端口和导出也用于跨测试平台层次结构的不同层级发送事务对象。端口应用于发起并将数据包转发至层次结构的顶层。导出则用于接收并将数据包从顶层转发至目标位置。实现端口用于在目标位置定义put方法。以下示例展示了针对不同层级组件使用端口、导出及实现的具体案例。
2025-07-30 17:10:46
268
原创 uvm-tlm-nonblocking-put-port
前一篇文章展示了使用本质上是阻塞式的TLM端口的示例,其中发送方会停滞,直到接收方完成put任务。类似地,UVM TLM还提供非阻塞类型的try_putputcan_put。与之前一样,UVM TLM非阻塞put端口最终应连接到非阻塞put实现端口。
2025-07-30 12:01:11
542
原创 uvmtlm-blocking-put-port
任何组件都可以通过TLM put端口向另一个组件发送事务。接收组件应定义put端口的实现,该实现让接收方有机会定义如何处理传入的数据包。端口本质上可以是阻塞或非阻塞的,这将决定put方法是否会阻塞发送方的执行,直到接收方接受对象。以下示例展示了一个组件中的TLM阻塞put端口连接到另一个组件中的实现端口。
2025-07-30 11:46:56
455
原创 uvm tlm preface
odeling是一种用于构建组件和系统高度抽象模型的建模风格。在该方案中,数据被表示为事务(包含随机、协议特定信息的类对象),通过称为TLM接口的特殊端口在不同组件之间流动。若能将信号中的数据及其变化表示为事务(如写操作/读操作),将大幅简化理解、调试和验证的复杂度。UVM提供了一套事务级通信接口,可用于组件间的互联,从而实现数据包在组件间的传输。这种设置的优点在于它能将组件与其他组件的变化隔离开来,同时提升可重用性和灵活性——因为现在您只需将某个组件替换为另一个同样具有TLM接口的组件即可。
2025-07-30 11:38:17
129
原创 uvm-config-db
UVM拥有一个内部数据库表,我们可以将数值存储在指定名称下,后续可由其他测试平台组件检索。uvm_config_db类在uvm_resource_db基础上提供便捷接口,用于简化uvm_component实例的基本交互方式。。这种配置数据库允许我们在不同名称下存储各种配置设置,可在不修改实际测试平台代码的情况下按需配置测试平台组件。例如,若要启用某个agent的功能覆盖度收集,我们只需指定该agent路径,并将配置数据库中某个变量值设为1。该agent可检查此变量值,若发现已启用则开始收集覆盖度数据。
2025-07-29 11:53:38
829
原创 understanding-the-resource-database
因此,后续可以通过名称或类型检索同一资源。具有相同名称/类型的多个资源以队列形式存储,因此先存入的资源比后存入的资源具有更高优先级。在上图中,若发起检索字符串类型资源的请求,系统会从前至后遍历队列,返回首个出现的字符串类型对象。现在考虑队列中项目2(红色)和项目3(蓝色)具有相同作用域的情况:当针对该特定作用域调用get_by_type()方法时,由于项目2(红色)在队列中位置靠前,它将被返回。您可以将任意数据类型存入资源数据库,并在仿真过程中的某个时刻由其他组件进行检索——这是一项极其便捷的特性。
2025-07-29 11:47:55
285
原创 driver-using-get-and-put function
在上一篇文章中,我们了解了UVM驱动如何通过调用方法获取下一个项目,以及如何通知序列器当前项目已完成。虽然这是驱动与序列器通信的首选方式,但UVM也为更复杂的实现提供了另一种方案。另一种方式是驱动使用get方法接收下一个项目,随后通过put方法将响应项返回给序列器。
2025-07-29 11:03:43
482
原创 using-get-next-item
uvm_driver是uvm_component的子类,它通过TLM端口与sequencer进行通信。该驱动程序是一个参数化类,其类型由请求和响应序列项决定。这使得驱动程序可以向sequencer返回不同于请求类型的响应序列项。不过,大多数驱动程序会使用与请求序列项相同类型的响应对象。uvm_driver通过握手机制从sequencer的FIFO获取请求序列项(REQ),并可选择性地将响应序列项(RSP)返回给sequencer的响应FIFO。驱动程序主要采用两种方式从sequencer获取序列项。
2025-07-29 10:52:03
591
原创 uvm-driver-sequencer-handshake
同时,驱动还可以向序列反馈已完成当前sequence_item的驱动工作,并请求获取下一个数据项。驱动器和序列器之间的连接是一对一的关系。多个驱动器不会连接到一个序列器,多个序列器也不会连接到一个驱动器。一旦建立连接,驱动器就可以通过TLM端口定义中的API调用来接收来自序列器的序列项。uvm_sequencer有一个内置的TLM pull实现端口,名为seq_item_export,用于连接driver的pull端口。的TLM端口,该端口在UVM代理的连接阶段与sequencer中的。
2025-07-29 10:45:02
120
原创 using-sequence-library
典型的验证环境会包含数百个采用随机种子和配置的测试用例,而通过使用多种序列来执行独立任务可以简化这一过程。现在,您既可以创建能在其body()任务中衍生子序列的顶层序列,也可以构建随机调用多个序列的机制。更简洁的方式是使用UVM提供的序列库uvm_sequence_library,顾名思义,它能追踪已注册的序列,并以随机方式多次调用这些序列。这种情况下,序列器完成的最小迭代次数设置为5次,最大为10次。我们以三个序列为例,它们都继承自之前提到的同一个基础序列类。
2025-07-29 10:36:41
267
原创 macros for pre existing items
自动创建新对象,随机化数据项并将其发送至sequencer。若已有现成数据对象只需发送至sequencer,则可使用。测试平台环境已经搭建完成,我们将简单地使用一个序列来包含对。为了演示序列也可以通过宏实现随机化,我们在。在上面的示例中,我们看到了如何通过。同时需要注意,我们还可以选择使用。首先,让我们通过一个示例来了解。类似,也具有多种变体形式。不会创建或随机化对象,而。宏则不会对其进行随机化。我们已经了解了如何使用。会同时执行这两项操作。随机化并发送项或序列。
2025-07-29 10:29:39
312
原创 uvm sequence -- do marcons
使用序列宏的额外优势在于支持行内约束,pre_bodypost_body。它通过创建条目、随机化条目并自动调用所需任务来启动给定序列或序列项,从而减少代码行数。在之前的文章中,我们了解到所有uvm_do_on_pri_with中的代码。因此,让我们看看它在UVM中是如何构建的,以便更清晰地理解这个过程。传递给此宏的对象若为序列项,则它会创建该条目并通过调用start_item方法开始执行。该项将被随机化并以方法调用结束。若__seq对象并非序列项,则会调用该序列的start方法。start。
2025-07-29 10:23:07
324
原创 uvm sequence--start()
请注意,您必须始终传递一个应该执行此序列的序列器句柄(sequencer),而其他参数是可选的。通常指的是调用当前序列的父序列。为序列指定一个优先级(),目前可以忽略。将调用当前序列的pre_body()和。以下是start()函数的使用示例及其后台执行过程的说明。
2025-07-29 09:15:51
368
原创 uvm_do sequence marcos
在《 creating and using sequence》中,我们了解到sequence会调用任务和。通过直接调用UVM sequence宏uvm_do或,你可以避免在代码中写入所有这些语句。在编译时,这些宏将被替换为对和的调用。主要有四种类型的UVM宏可以在默认sequencer上执行。
2025-07-28 17:55:46
412
原创 creating and using sequence
序列由多个数据项组成,这些数据项可能构成有趣的测试场景。例如,您可以创建对设计内所有寄存器执行读写操作的序列、执行复位的序列,或向被测设备施加激励的另一个序列。最终您会拥有多个执行不同任务的序列,用于验证设计的各个方面。请注意:序列项指代数据包,而序列只是数据项/子序列排列的容器。现在,你有几个选择:使用现有序列单独驱动DUT的激励;组合现有序列创建新序列——例如先执行复位序列,再进行寄存器读写序列,最后执行FSM状态转换序列;从序列库中随机抽取序列并在DUT上执行;
2025-07-28 17:46:32
608
原创 uvm sequence Arbitration
多个序列尝试访问单个驱动器时,执行序列的序列器会通过称为仲裁(arbitration)的过程按特定顺序调度这些序列。可根据称为仲裁模式(arbitration modes)的特定标准,将序列器配置为优先允许某些序列访问驱动器。
2025-07-28 17:21:39
596
原创 virtual sequence and virtual sequancer
编写virtual sequence 和virtual sequencer 遇到的问题
2025-07-25 17:38:23
737
原创 makefile -- make 的运行
v,verbose,再-b 信息之上。输出信息包括哪些马可file被解析,不需要被重新编译的依赖文件等。-b , basic,基本调试信息。-k,keep going,出错也不退出,继续运行。-a , all 所有调试信息。-b,-m 忽略和其他版本的兼容性。-C 指定读取makefile的目录。-i ,所有隐含规则。使用MAKECMDGOALS。-d ,相当于-debug=a。-f,指定需要执行的文件。-B 所有目标都更新。
2025-07-21 18:41:28
393
原创 makefile-- 其他函数
连接函数把list2 中单词对应的添加到list1 的后面若list1 的单词个数> list2 ,多出的list1 保持不变若list2 的单词个数> list21,多出的list2 添加到list1 后面。
2025-07-21 16:47:28
326
原创 makefile -- 文件操作
把后缀 suffix 添加到names 中每个单词后面。把后缀 prefix 添加到names 中每个单词前面。取 文件函数,非目录指的是最后一个 / 之后的部分。后缀函数,从文件名序列中,取出各个文件名的后缀。从names 中取出各个文件名的前缀部分。如果没有后缀,返回空字符串。返回文件名序列的文件名后缀。返回文件名序列的前缀序列。返回加过后缀的文件名序列。返回加过前缀的文件名序列。没有前缀,返回空字符串。
2025-07-21 15:53:18
194
原创 makefile -- 变量及字符串函数
a = "hello" // 前面变量可以使用后面变量,有死锁问题a := "hello" // 前面变量不能使用后面变量a?= "hello" // 如果a没有被赋值过,则a 赋值为hellob+= test1b+= test2 // 连续b追加赋值多次,结合$@ 或者$< 使用a = hellob += "a"b += "a"b += "a"b += "a"all:echo $(a)echo $(b)@echo $(a)@echo $(b)
2025-07-18 18:00:34
1009
原创 how to use `uvm_do sequence macros?
Inand`uvm_doorand在"How to create and use a sequence" 笔记中,我们了解到序列会调用任务和。通过直接调用UVM序列宏·uvm_do或·vm_do_with,您可以避免在代码中写入所有这些语句。在编译时,这些宏将被替换为对和的调用。主要有四种类型的UVM宏可以在默认序列器上执行。
2025-07-17 18:40:52
781
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人