- 博客(156)
- 资源 (14)
- 收藏
- 关注
原创 如何调整AXI VIP的最大延时
在验证过程中,AXI VIP经常会用到,VIP中默认的延时设置最大是16,那么如何调整这些设置的最大值呢?本文主要记录在调整AXI VIP延时的时候如何调整最大值。
2025-02-19 16:00:42
874
原创 两个无时钟源信号之间的检测
最近遇到一个问题,需要检测两个无时钟源的信号,条件是如果a信号的上升沿来了后,如果b信号的上升沿在10ns到来,则打印pass,否则打印error。本文主要记录了解决一个问题的过程,从分析问题,到提出方案,再到代码实现。
2025-01-02 12:45:28
577
原创 DPI-C多die场景下的scope设置
在IC验证仿真过程中,当SV侧不同scope下有多个相同的task,在C侧如何去指定调用。多die环境下,在SV侧,每个die都有各自独立的die_tb以及VIP,每个die所在的die TB中,都会export相同的名字的function或task,然而在C一侧,在使用SV侧export的function/task时,它不知道是哪个die TB对应的function/task,因此,需要在使用scope的变量指定,C的function中调用的是哪个die TB对应的task/function。
2024-10-25 17:39:45
462
原创 DPI-C动态库so的使用
在做IC验证EDA仿真过程中,有时候需要调用C实现的参考模块,我们可以利用DPI-C的功能,实现SV侧调用C侧的函数。在具体实现过程中,我们可以将C代码编译成一个so文件的动态库,然后在SV侧加入这个so文件进行编译和仿真。这样做的好处是,C的具体实现对SV侧不可见,SV侧只需要关心函数接口和参数的传递。本文先介绍方法,然后演示一个demo,记录这个过程。module tb;
2024-10-25 16:14:54
627
原创 verdi中查看force信号
在RTL仿真过程中,我们有时候会对信号进行force操作,从而实现某些特定的功能。但是在仿真波形中,不能直接从波形上看出,这些信号的驱动,是因为前级电路的驱动,还是因为force的原因的驱动。从而使debug非常地不友好。本文记录一种通过verdi查看force信号的方法,同时记录一种将波形中所有的force信息dump出来的一种方法。本文主要记录通过verdi查看force信号的两种方式。
2024-09-21 16:00:58
1012
原创 systemverilog中的DPI-C用例介绍
本文主要基于VCS内置的三个关于DPI-C的使用用例,记录一下DPI-C的使用方法。测试用例的路径为$VCS_HOME/doc/examples/testbench/sv/。测试用例包括:dpi_longint,dpi_packed_array,dpi_structure。本文主要通过VCS自带的三个DPI-C测试用例,记录一下SV中DPI-C的使用方法。
2024-09-01 17:30:24
1547
1
原创 C语言中将函数名作为参数进行传递
在实际应用过程中,有时候需要将函数名作为参数传递,本文主要记录这一方法。本文主要记录C语言中,将函数名作为参数进行传递的方法。
2024-08-13 17:19:53
1167
原创 芯片bring-up的测试用例
最近做了一些用测试用例点亮芯片的工作,从测试用例的规划和编写,记录几点开发测试用例的心得体会。本文主要总结在点亮芯片的过程中,我们需要做哪些测试用例,以及编写这些测试用例的时候,有哪些注意事项。
2024-08-13 10:03:22
1680
原创 C语言中利用结构体进行寄存器访问
在运用C语言进行裸机测试时,如果用base_addr加offset_addr进行访问,当需要配置的寄存器很多时,我们很难记住地址地址所表示的意思,这个时候,我们可以利用结构体对寄存器进行封装,然后绑定基地址,这样我们就可以通过结构体的方式,对寄存器进行读写访问,使得代码具备更好的可读性和可维护性。本文主要记录一种C语言通过结构体的方式访问寄存器的方法。
2024-07-02 15:37:57
667
原创 linux中如何查看一个文件的起始结尾和中间
在linux中,有时候一个log文件非常大,直接打开需要很久的时间,而我们只关注其中某些行的信息,这个时候就可以将我们需要的内容提取出来,本文主要介绍如何提取的方法。
2024-04-10 10:01:13
843
1
原创 systemverilog中的bind
通常我们需要将设计的代码和验证的代码进行分离,systemverilog中提供bind的方式,能够在不改变设计代码的前提下,在设计的代码的module或者instance下边,例化一些用于存放断言等辅助代码的module/interface/program/checker。本文主要总结和记录一下bind的用法。
2024-02-29 15:25:12
2483
原创 记录一个仿真模型在前仿和后仿中遇到的问题
在写仿真模型的过程中,为了方便,我们通常在tb里边,通过层次引用的方式,将模块的接口assign出来给interface,再将interface用config_db送给环境去处理,RTL前仿这样做没问题,但是后仿的时候存在一定的风险。
2024-02-27 16:43:59
1027
原创 合并覆盖率
在验证过程中,我们经常通过覆盖率来判断,我们验证是否趋于收敛,然而,每一个case都会生成自己的覆盖率文件,这个时候就需要将不同的覆盖率文件合并到一起,本文主要记录如何实现覆盖率的合并,以及如何对这个计算过程加速。本文主要记录一下覆盖率合并的方法。
2024-02-22 16:44:18
884
原创 event | semaphores | mailbox
在systemverilog中,我们可以利用event | semaphores | mailbox来实现进程之间的通讯,本文主要介绍这三种数据类型的使用,以及他们之间的区别。
2024-02-21 18:00:04
1183
原创 SystemVerilog约束随机(二)
集合操作set membership权重约束weighted constraints队列约束array constranint条件约束order constraints等价约束equivalence constraints顺序约束solver order主要记录一些sv中的约束方法,方便查阅。
2024-02-05 17:48:38
924
原创 如何理解派生类的构造函数
在class中,有的时候有构造函数new,有的时候又没有构造函数new,本文主要记录一下,派生类的构造函数的执行过程,帮助更好的理解class的构造函数。本文主要记录派生类的构造函数执行过程。
2024-02-01 14:40:39
1031
原创 数据的保护:local | protected
为了数据的保护,我们可以通过local或者protected去修饰数据,本文主要记录一下它俩之间的区别。
2024-02-01 11:14:20
505
原创 如何override已经存在的约束
在验证过程中,我们基本都是基于spec,做正常的约束,当我们测特定corner场景的时候,希望能够用新的约束,去override已经存在的约束。本文主要记录如何override已经存在的约束,当然这里还可以用random with操作,只不过random with约束的范围,必须在base约束的范围内。
2024-01-31 16:37:47
430
原创 join | join_any | join_none之间的区别
本文主要记录一下,与fork想匹配的三个选项,join/join_any/join_none之间的区别。
2024-01-29 17:48:31
1029
原创 信号的采样与驱动
在UVM验证过程中,有monitor和driver组件,分别用于收集信号和驱动信号,本文记录两个例子,用于理解信号的采样以及驱动的过程。本文主要通过两个例子,帮助理解一下信号的采样和驱动。
2024-01-26 16:52:44
915
原创 记录一些多维数组的方法
验证过程中,我们经常会用到多维数组存储数据,本文主要记录一下,如何去获取我们需要的数据,以及多维数组自带的一些方法。本文主要记录一下使用多维数组的一些方法。
2024-01-24 17:35:42
421
原创 流操作:打包/解包
在验证过程中,为了方便数据传输,我们经常需要对不同字段的数据先进行打包,再将打包好后的数据发到对端,对端收到数据后再进行解包,这个过程中,我们可以很方便的运用流操作符来解决。本文主要记录一下流操作符的使用。“>>”是从左往右的流操作符。“
2024-01-24 14:31:33
568
原创 记录一些队列中常用的方法
在实际项目中,我们经常会用到队列,本文主要总结一些队列的常用方法。队列自带的方法与find和with结合使用的方法本文主要记录一些队列常用的方法。
2024-01-24 10:34:08
604
原创 记录一些随机约束的控制方法
在运用UVM验证过程中,经常会用到大量的随机,这个时候我们需要控制随机约束的打开或者关闭,来实现不同模式的约束。本文主要记录一下,在随机过程中约束控制的方法。内嵌约束控制控制rand变量是否随机选择随机控制的变量控制约束块是否随机约束的嵌套控制本文主要记录一下随机控制的一些方法。
2024-01-23 16:02:22
645
原创 fifo force
在我们DUT的RTL中,经常会有很多的FIFO,很多时候,我们需要检查这些FIFO的空满,是否对系统有影响。本文主要介绍如何在验证环境中,随机force FIFO的空满。本文基于UVM的框架,自顶向下进行描述,先介绍sequence中的实现,再介绍random_fifo_force的具体实现。本文主要介绍DUT中FIFO的full和empty的随机force思路,并给出了具体的代码实现。
2023-12-28 17:33:10
558
1
原创 uvm_mem_mam
在验证过程中,我们会经常用到mem,希望能够对mem做动态内存管理,能够像C语言一样动态malloc一段空闲的地址空间。UVM的底层代码提供uvm_mem_man这个底层代码可以很方便用于实现上述功能。
2023-09-21 16:52:32
2237
原创 如何使用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
935
2
原创 $value$plusargs字符串参数传递后如何随机
在仿真过程中,经常在命令行通过$value$plusargs传递一个字符串到环境中,去选择不同的sequence,但是,有些时候需要随机选择其中某几个seq,而只有整数和枚举类型可以随机,字符串无法随机,那么如何解决这个问题呢?总的来说就是借助一个关联数组进行查表,来解决字符串不能随机的问题。
2023-09-15 17:58:15
706
原创 在sequence中对变量随机
很多时候,我们在写sequence激励的时候,有一些变量需要做一些简单的随机,但是又不希望引入其他的类,这个时候我们可以利用std::randomize()来处理。总的来说,利用std::randomize()函数可以很方便的在sequence内部对变量进行随机,而不用额外引入类。
2023-07-20 10:55:27
1134
原创 记录一些uvm自带的后门访问方法
在写case的时候,很多场景下可能需要我们后门去访问RTL中的某些信号或者寄存器的值,这个时候uvm自带的函数就很好用。本文主要记录一些uvm中自带的一些后门访问函数。
2023-03-30 17:48:15
4582
原创 UVM中如何根据字符串创建对应的类
很多时候,我们会将一些数据包的名字,以字符串的方式存放到一个字符串数组中,然后需要根据字符串去创建对应名字的数据包。本文主要介绍如何利用UVM的工厂模式,根据字符串创建对应名称的数据类。本文主要介绍,如何通过字符串,创建与之对应的数据类。
2022-12-30 18:13:18
576
原创 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
5258
5
原创 sequence如何接收来自driver的transaction
大多数情况下,验证环境都是充当host的角色,利用sequence往DUT中打激励,进而达到验证的目的。但是有些情况下,需要sequence充当device的角色,接收来自driver的transaction,进行处理后,sequence再将resp返回给driver,这种sequence被称作Reactive Sequences,本文主要记录一下Reactive Sequences的具体实现。
2022-11-07 14:05:42
820
原创 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
1979
1
原创 管理多个sequence的执行方法:top_sequence
在UVM验证环境中,我们通常会有很多不同类型的sequence,例如:控制复位的sequence、控制寄存器配置的sequence、控制总线的sequence等等,这些不同的sequence需要管理。本文主要记录一下,在同一个uvm验证环境中,不同的sequence之间,同步以及执行顺序先后,的控制方法。本文主要记录一下,如何利用top_sequence,实现多个sequence的管理。
2022-11-02 15:35:53
1018
1800-2017 - IEEE Standard for SystemVerilog--Unified Hardware Design.pdf
2021-07-06
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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人