- 博客(146)
- 资源 (14)
- 收藏
- 关注
原创 linux中如何查看一个文件的起始结尾和中间
在linux中,有时候一个log文件非常大,直接打开需要很久的时间,而我们只关注其中某些行的信息,这个时候就可以将我们需要的内容提取出来,本文主要介绍如何提取的方法。
2024-04-10 10:01:13 469
原创 systemverilog中的bind
通常我们需要将设计的代码和验证的代码进行分离,systemverilog中提供bind的方式,能够在不改变设计代码的前提下,在设计的代码的module或者instance下边,例化一些用于存放断言等辅助代码的module/interface/program/checker。本文主要总结和记录一下bind的用法。
2024-02-29 15:25:12 606
原创 记录一个仿真模型在前仿和后仿中遇到的问题
在写仿真模型的过程中,为了方便,我们通常在tb里边,通过层次引用的方式,将模块的接口assign出来给interface,再将interface用config_db送给环境去处理,RTL前仿这样做没问题,但是后仿的时候存在一定的风险。
2024-02-27 16:43:59 403
原创 合并覆盖率
在验证过程中,我们经常通过覆盖率来判断,我们验证是否趋于收敛,然而,每一个case都会生成自己的覆盖率文件,这个时候就需要将不同的覆盖率文件合并到一起,本文主要记录如何实现覆盖率的合并,以及如何对这个计算过程加速。本文主要记录一下覆盖率合并的方法。
2024-02-22 16:44:18 360
原创 event | semaphores | mailbox
在systemverilog中,我们可以利用event | semaphores | mailbox来实现进程之间的通讯,本文主要介绍这三种数据类型的使用,以及他们之间的区别。
2024-02-21 18:00:04 881
原创 SystemVerilog约束随机(二)
集合操作set membership权重约束weighted constraints队列约束array constranint条件约束order constraints等价约束equivalence constraints顺序约束solver order主要记录一些sv中的约束方法,方便查阅。
2024-02-05 17:48:38 371
原创 如何理解派生类的构造函数
在class中,有的时候有构造函数new,有的时候又没有构造函数new,本文主要记录一下,派生类的构造函数的执行过程,帮助更好的理解class的构造函数。本文主要记录派生类的构造函数执行过程。
2024-02-01 14:40:39 927
原创 数据的保护:local | protected
为了数据的保护,我们可以通过local或者protected去修饰数据,本文主要记录一下它俩之间的区别。
2024-02-01 11:14:20 351
原创 如何override已经存在的约束
在验证过程中,我们基本都是基于spec,做正常的约束,当我们测特定corner场景的时候,希望能够用新的约束,去override已经存在的约束。本文主要记录如何override已经存在的约束,当然这里还可以用random with操作,只不过random with约束的范围,必须在base约束的范围内。
2024-01-31 16:37:47 335
原创 join | join_any | join_none之间的区别
本文主要记录一下,与fork想匹配的三个选项,join/join_any/join_none之间的区别。
2024-01-29 17:48:31 474
原创 信号的采样与驱动
在UVM验证过程中,有monitor和driver组件,分别用于收集信号和驱动信号,本文记录两个例子,用于理解信号的采样以及驱动的过程。本文主要通过两个例子,帮助理解一下信号的采样和驱动。
2024-01-26 16:52:44 562
原创 记录一些多维数组的方法
验证过程中,我们经常会用到多维数组存储数据,本文主要记录一下,如何去获取我们需要的数据,以及多维数组自带的一些方法。本文主要记录一下使用多维数组的一些方法。
2024-01-24 17:35:42 362
原创 流操作:打包/解包
在验证过程中,为了方便数据传输,我们经常需要对不同字段的数据先进行打包,再将打包好后的数据发到对端,对端收到数据后再进行解包,这个过程中,我们可以很方便的运用流操作符来解决。本文主要记录一下流操作符的使用。“>>”是从左往右的流操作符。“
2024-01-24 14:31:33 447
原创 记录一些队列中常用的方法
在实际项目中,我们经常会用到队列,本文主要总结一些队列的常用方法。队列自带的方法与find和with结合使用的方法本文主要记录一些队列常用的方法。
2024-01-24 10:34:08 350
原创 记录一些随机约束的控制方法
在运用UVM验证过程中,经常会用到大量的随机,这个时候我们需要控制随机约束的打开或者关闭,来实现不同模式的约束。本文主要记录一下,在随机过程中约束控制的方法。内嵌约束控制控制rand变量是否随机选择随机控制的变量控制约束块是否随机约束的嵌套控制本文主要记录一下随机控制的一些方法。
2024-01-23 16:02:22 384
原创 fifo force
在我们DUT的RTL中,经常会有很多的FIFO,很多时候,我们需要检查这些FIFO的空满,是否对系统有影响。本文主要介绍如何在验证环境中,随机force FIFO的空满。本文基于UVM的框架,自顶向下进行描述,先介绍sequence中的实现,再介绍random_fifo_force的具体实现。本文主要介绍DUT中FIFO的full和empty的随机force思路,并给出了具体的代码实现。
2023-12-28 17:33:10 492
原创 uvm_mem_mam
在验证过程中,我们会经常用到mem,希望能够对mem做动态内存管理,能够像C语言一样动态malloc一段空闲的地址空间。UVM的底层代码提供uvm_mem_man这个底层代码可以很方便用于实现上述功能。
2023-09-21 16:52:32 694
原创 如何使用UVM寄存器模型中的callback
我们在使用UVM的寄存器模型过程中,有时候需要在寄存器配置配置前准备一些数据,或者在寄存器配置之后触发一些操作,这个时候就可以用到UVM寄存器模型中自带的callback,本文主要介绍如何使用UVM中寄存器模型自带的callback。在uvm-1.2\src\reg\uvm_reg_cbs.svh中,分别为读写提供了pre和post的回调函数,以及post_predict的回调函数等如下所示。
2023-09-19 18:03:47 404
原创 $value$plusargs字符串参数传递后如何随机
在仿真过程中,经常在命令行通过$value$plusargs传递一个字符串到环境中,去选择不同的sequence,但是,有些时候需要随机选择其中某几个seq,而只有整数和枚举类型可以随机,字符串无法随机,那么如何解决这个问题呢?总的来说就是借助一个关联数组进行查表,来解决字符串不能随机的问题。
2023-09-15 17:58:15 354
原创 在sequence中对变量随机
很多时候,我们在写sequence激励的时候,有一些变量需要做一些简单的随机,但是又不希望引入其他的类,这个时候我们可以利用std::randomize()来处理。总的来说,利用std::randomize()函数可以很方便的在sequence内部对变量进行随机,而不用额外引入类。
2023-07-20 10:55:27 506
原创 记录一些uvm自带的后门访问方法
在写case的时候,很多场景下可能需要我们后门去访问RTL中的某些信号或者寄存器的值,这个时候uvm自带的函数就很好用。本文主要记录一些uvm中自带的一些后门访问函数。
2023-03-30 17:48:15 2236
原创 UVM中如何根据字符串创建对应的类
很多时候,我们会将一些数据包的名字,以字符串的方式存放到一个字符串数组中,然后需要根据字符串去创建对应名字的数据包。本文主要介绍如何利用UVM的工厂模式,根据字符串创建对应名称的数据类。本文主要介绍,如何通过字符串,创建与之对应的数据类。
2022-12-30 18:13:18 396
原创 VCS自带的UPF低功耗仿真demo介绍
VCS工具安装路径下,自带了一个UPF低功耗仿真的演示用例,本文主要介绍一下这个演示用例的使用,同时解决一些使用过程中的问题。将MVSIM_NATIVE_DEMO文件夹拷贝出来,在该路径下输入tree查看层次结构,如下所示,其中,LP、LP_DVE、LP_LPA文件夹分别存放的是仿真环境,REF文件夹是不带UPF的参考对比仿真环境,RTL和UPF文件夹分别用来存放设计代码和UPF文件。
2022-11-15 16:35:44 3280 4
原创 sequence如何接收来自driver的transaction
大多数情况下,验证环境都是充当host的角色,利用sequence往DUT中打激励,进而达到验证的目的。但是有些情况下,需要sequence充当device的角色,接收来自driver的transaction,进行处理后,sequence再将resp返回给driver,这种sequence被称作Reactive Sequences,本文主要记录一下Reactive Sequences的具体实现。
2022-11-07 14:05:42 613
原创 uvm_event和uvm_event_pool
uvm_event类有两种不同的操作模式:边沿敏感和电平敏感。边沿敏感模式包括:trigger(),wait_trigger(),wait_ptrigger()和wait_ptrigger_data() 方法。不要使用reset(),is_on(),is_off(),wait_on()和wait_off()方法。wait_*方法会被阻塞,在调用trigger()时释放。
2022-11-03 14:07:05 1422
原创 管理多个sequence的执行方法:top_sequence
在UVM验证环境中,我们通常会有很多不同类型的sequence,例如:控制复位的sequence、控制寄存器配置的sequence、控制总线的sequence等等,这些不同的sequence需要管理。本文主要记录一下,在同一个uvm验证环境中,不同的sequence之间,同步以及执行顺序先后,的控制方法。本文主要记录一下,如何利用top_sequence,实现多个sequence的管理。
2022-11-02 15:35:53 715
原创 sequence启动的两种方式
如果把UVM验证环境比作一把枪,那么sequence相当于是枪里边的子弹,这里主要记录一下sequence的两种启动方式。本文主要记录一下UVM中,直接和间接启动sequence的方式,在间接启动sequence时,phase objections的管理方法。
2022-10-31 10:38:37 2729 1
原创 带参数的传输类(Parameterized Transaction Class)
在UVM的验证环境中,为了让环境具备更好的移植性,通常采用参数形式的传输类,本文主要通过代码记录一下,这些带参数的传输类,在UVM验证环境中的使用方法。带参数的传输类,需要重新定义get_type_name这个虚函数,并且返回的type_name,也需要自己构造,否则通过field automation机制使用print函数时,会打印其父类。本文主要记录一下,带参数的传输类,在UVM环境中的使用方法,以及需要注意的一些方面。
2022-10-26 17:49:19 260
原创 巧用fork—join_none启用后台进程
聊一聊最近遇到的一个问题,巧妙的利用fork——join_none启动后台进程,实现了进程之间的并行处理。
2022-10-24 10:48:13 751 2
原创 UVM如何处理out-of-order乱序传输
乱序传输(out-of-order)是指在协议中,后发出去的req,支持先回resp,通常通过ID来保证req和resp之间的关系。很多协议支持乱序传输,例如AXI4。本文主要介绍,在UVM的环境中,构造支持乱序传输的验证环境的方法。本文主要总结一下,在uvm环境中,如何处理乱序的传输。首先给出整体思路,然后分别针对sequence和driver提供具体的代码实现供参考。
2022-10-21 15:37:27 1580
原创 `uvm_do宏如何与底层的driver进行交互
在张强《UVM实战》中的179页,提到了“uvm_do系列宏其实是将下述动作封装在一个宏中”,这句话大概的提到了uvm_do这个宏里边的具体实现,但是这些内容是怎么通过sequencer,与底层的driver进行交互的,确不得而知。本文主要记录一下,uvm_do这个宏,与底层driver交互的方式,从而进一步帮助我们理解数据的传递方式。本文主要记录一下uvm_do这个宏的具体实现,以及与底层driver之间的交互过程。
2022-10-21 10:35:45 619
原创 UVM field automation机制
由于UVM中的field automation机制比较常用,用的时候需要到处去找对应的宏,本文主要记录一下UVM中的field automation机制,方便使用的时候进行查阅。
2022-10-20 15:17:45 806
原创 SystemVerilog约束随机(一)基本介绍
本节记录SystemVerilog约束随机的基础的知识。更多相关内容参考《IEEE Std 1800™-2012, IEEE Standard for SystemVerilog—Unified Hardware Design, Specification, and Verification Language》。本文主要简单的记录一下,SystemVerilog中的约束随机相关的基础知识。
2022-10-11 15:52:18 680
原创 interface中modport和clocking
interface是UVM验证过程中的一个重要的组件,主要起到连接测试用例与DUT的作用,具有简化代码,易于修改等特点。本文主要介绍interface中的modport和clocking的用法。modport和clocking都是interface组件中的块,主要用于对信号进行分组和同步采样。本主要总结了modport和clocking的基本用法,同时实战演示了interface的用法,以及在uvm环境中的传递方式。
2022-10-10 11:57:36 3991 1
原创 UVM中的中断sequence
很多时候,我们的DUT(Design Under Test)中,存在中断信号,本文主要记录一下,如何为这些中断信号创建sequence。本文主要总结并记录一下,在UVM环境中,如何处理中断。
2022-09-26 09:45:10 752
原创 利用回调函数在driver中收集覆盖率
在UVM环境中,很多时候,我们通过driver,将数据包发送完成后,希望收集一下数据包的覆盖率,那么可以在driver中添加回调函数,利用回调函数收集覆盖率,本文主要记录一下,利用driver中的回调函数,来收集覆盖率的方法。
2022-09-23 15:41:48 356
dma ral 20240404
2024-04-01
What’s Next for SystemVerilog in the upcoming IEEE 2023 standard
2024-03-20
SystemVerilog Style Guide - systemverilog.pdf
2024-03-08
UVM中处理复位信号的参考代码
2022-09-08
1800-2017 - IEEE Standard for SystemVerilog--Unified Hardware Design.pdf
2021-07-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人