- 博客(48)
- 收藏
- 关注
原创 systemverilog中关于多线程的若干思考
在SystemVerilog总线验证中,2048对主从设备并行通信时遇到fork语句的复杂应用问题。针对waitfork和disablefork作用域等难点,通过仿真实验深入分析了三种常用多线程语法:fork...join(阻塞)、fork...join_any(任一完成)和fork...join_none(非阻塞)。该研究为大规模并行验证提供了线程控制的关键技术参考。
2025-06-19 23:24:05
135
原创 SV学习——过程语句和子程序(第三章)
在做设计验证时,需要写很多代码,大部分在task和function里面,SV在这方面增加了许多改进使得它更接近C语言,从而使代码的编写变得更加容易,尤其是在处理参数传递上。
2023-02-26 15:00:08
2060
原创 systemverilog中shallow_copy和deep_copy辨析
本文探讨了SystemVerilog和UVM中的对象拷贝机制。通过实例分析,展示了句柄赋值、浅拷贝和深拷贝的区别:句柄赋值仅复制引用,共享同一对象;浅拷贝创建新对象但共享嵌套对象;深拷贝则完全独立复制所有层级对象。文章详细讲解了UVM中copy()和clone()的实现原理,强调深拷贝需要递归调用嵌套对象的拷贝方法。对于验证环境开发,建议优先使用clone()函数,它结合工厂机制自动完成对象创建和深度复制,确保数据独立性并简化代码。正确理解这些拷贝机制对构建可靠的验证平台至关重要。
2026-01-14 14:36:15
147
原创 uvm_factory机制学习
不仅uvm_component可以用type_id_create,uvm_object类也可以用type_id_create。
2026-01-07 23:11:44
114
原创 uvm_config_db机制学习
1. 当uvm_config_db传递一个类的句柄时,传递的是这个句柄,如果有组件在后续的phase中,改变了对象的值,那么其他组件也能感知到这个对象的值发生了变化。并不是在build_phase阶段,这个句柄被set了之后,值就不会变了。
2026-01-07 19:00:11
224
原创 由continue引发的一个debug灾难
整个代码的简化逻辑是这样的,由于continue的使用含义不清楚,导致debug了半天。这里写代码时,错误的将continue认为是else分支,什么也不干,往下继续执行。但是这样的理解是极其错误的,continue的意思是跳过本次循环中下面的所有代码,直接进入下一次循环,不是向下继续进行的意思。在 SystemVerilog 中,continue和break是用于控制循环流(forwhiledo...whileforeverrepeat。
2026-01-07 15:25:33
331
原创 I2C协议学习总结
I2C(Inter-Integrated Circuit)总线协议是一种由恩智浦(原飞利浦半导体)开发的。,广泛用于连接低速外围设备与微控制器或处理器。
2025-12-31 14:43:23
110
原创 systemverilog系统函数$test$plusargs和$value$plusargs
摘要:IC验证中,$test$plusargs和$value$plusargs是两个关键系统函数,用于运行时参数传递。$test$plusargs用于检测命令行是否存在特定字符串(前缀匹配),作为开关使用;$value$plusargs则能解析并存储参数值,支持多种格式转换(%d、%h、%s等)。两者区别在于前者仅判断存在性,后者可传递具体数值。VCS中"-"参数面向仿真器配置,"+"参数供用户代码调用。参数类型由代码中的格式说明符决定,仿真器根据格式强制转换字符串值
2025-12-29 23:34:17
681
原创 systemverilog中的virtual function
关键字(virtual, static, local)只在“类体内部”这个地盘生效,一旦出了类的大门(extern 展开),这些修饰符统统脱掉。
2025-12-23 23:37:25
331
原创 uvm phase机制中的objection机制
最近看别人的代码,发现,容易忽略在component的main phase中,忘记写raise_objection,drop_objection。
2025-12-23 21:38:28
181
原创 `uvm_declare_p_sequencer宏的作用
在UVM中,m_sequencer是基类指针,只能访问uvm_sequencer_base的成员,而p_sequencer通过宏uvm_declare_p_sequencer()实现类型转换,可访问自定义sequencer的特定成员。该宏在start()执行时完成转换,要求传入sequencer类型必须匹配。p_sequencer主要用于访问sequencer中的资源(如虚接口、配置参数)或实现VirtualSequence调度。使用时需确保类型一致性,但应避免滥用以保持sequence通用性。该机制实现了
2025-12-22 11:08:12
630
原创 systemverilog中的package
在 SystemVerilog 中,Package(包)是一种用于将相关的类型定义、常量、任务、函数和类组织在一起的容器。它是解决大型设计和验证工程中“代码污染”和“命名冲突”的核心机制。package是一个独立的命名空间。可以把它想象成一个“工具箱”,里面存放着项目通用的各种定义,供不同的module或interface调用。// 1. 类型定义// 2. 常量定义// 3. 结构体定义} packet_s;// 4. 类定义 (通常配合 `include 使用)
2025-12-20 14:48:50
814
原创 uvm_sequence机制中重要task的拆解
start()任务不是在uvm_sequence中声明的,而是在uvm_sequence_base中声明的,所以uvm_sequence继承了uvm_sequence_base中的start()方法。,确保了 sequence 在 UVM 复杂环境下的安全运行。
2025-12-17 00:07:13
625
原创 uart协议学习总结
本文全面介绍了UART(通用异步收发传输器)协议的相关知识。主要内容包括:1. UART协议基础:异步通信原理、波特率与比特率概念、常用波特率标准;2. 历史发展:从早期电路板到现代单芯片的演进过程;3. 电气接口标准:详细对比RS-232、RS-485和IrDA-SIR三种接口的特性差异;4. 关键组件:16550 UART芯片及其FIFO缓冲区的创新意义;5. 设备类型:DTE与DCE的定义、区别及连接方式;6. 协议解析:帧格式、波形分析方法和采样机制;7. 波特率计算:系统时钟、波特时钟和分频比的关
2025-12-09 11:25:56
908
原创 pcie知识扫盲
PCIe 的 EMI 指的是电磁干扰 (ElectroMagnetic Interference)。在 PCIe(Peripheral Component Interconnect Express,高速串行计算机扩展总线标准)系统中,EMI 是一个重要的信号完整性问题。电磁干扰是指电子设备在运行过程中产生的电磁能量,这种能量通过辐射或传导的方式干扰同一设备内部或附近其他设备的正常工作。简单来说,就是电子设备产生的“噪音”影响了其他信号或设备的正常运行。
2025-11-12 19:58:14
1004
原创 Synopsys VIP安装指南
本文详细介绍了Synopsys VIP(Verification IP)的安装、集成与使用方法。首先阐述了VIP安装的环境变量设置、xxx.run文件执行及license问题解决;其次讲解了通过dw_vip_setup工具添加、移除和更新VIP模型的方法,以及LIBRARIES、MODELS和EXAMPLES三者的区别与用途;然后说明了如何将VIP集成到个人验证环境,包括文件组织结构和flist编写要点;最后提供了快速上手VIP的文档资源和实践建议。文章强调VIP安装生成的文件分散在多个目录,必须通过dw_
2025-11-11 19:15:29
1007
原创 在时钟沿发生跳变的信号的采样值问题
摘要:在Verdi仿真中,当信号在时钟上升沿跳变时(如wren从1变0),波形图无法直接显示该时刻的信号值。通过添加+fsdb+region选项并使用ExpandDelta功能,可以发现仿真工具遵循"向前采样"原则,即在跳变沿采样的是跳变前的值(本例中wren为1)。这类似于微积分中取极限的概念,采样点在跳变前沿一个极小的delta时间。理解这一原则对正确分析时序信号至关重要。
2025-10-31 14:29:40
304
原创 向UVM-TLM通信发起决战
本文深入解析UVM中的TLM通信机制,主要分为三部分:1)理论概念部分,阐述port、export、imp的关系及TLM1.0与TLM2.0的区别;2)源代码分析部分,详细梳理TLM1.0端口类的类库结构及继承关系;3)实战应用部分,提供验证环境连接实例。文章指出TLM机制是验证环境的核心,如同血液流动于骨架中。重点分析了端口类的工作原理、连接规则及FIFO类的使用场景,并介绍了解决多路传输冲突的宏定义方法。通过源码级分析,揭示了TLM通信的实现细节,为搭建验证环境提供实用指导。
2025-09-15 21:33:25
1303
原创 验证平台中各组件对应的uvm_component基类
验证环境中的组件都是uvm_component类型的,在我们搭建uvm验证环境时,各个组件需要从对应的基类去扩展,比如my_driver要从uvm_driver扩展,my_test要从uvm_test扩展。而且uvm提供的uvm_driver,uvm_test这些基类,都是virtual class,是抽象类,只能被扩展,不能被实例化。对类进行扩展的前提是一定要清楚父类中都有什么,这样我们才能清楚父类有哪些特性。uvm环境中各组件是一个树形结构,整个树形结构的树根是uvm_root这个class。
2025-09-15 21:32:31
671
原创 systemverilog的class中静态方法和静态变量
SystemVerilog中类的成员默认为动态,需用static修饰静态变量和方法。静态方法属于类而非实例,可直接通过类名调用,无需实例化,且只能访问静态成员。静态变量在仿真期间持续存在,而const定义常量。静态方法常用于工具函数和单例模式,但不能访问非静态成员或声明为virtual。module中默认静态,需用automatic修饰动态成员。
2025-09-15 20:43:39
707
原创 uvm中factory相关的注册宏
当调用了`uvm_object_param_utils(T)时,发生了什么?当使用uvm_object_utils时,展开会发现调用了其他的宏。当调用了`uvm_object_utils(T)时,发生了什么?
2025-09-15 10:53:59
178
原创 systemverilog中constraint写法规范
constraint在随机化时常常用到,但是很多写法区别于过程块中的写法,如果不深入整理,每次写的时候总会由于一些思维惯性,引发一些奇怪的语法错误。要知道哪些语法可以写,哪些不可以写。
2025-09-09 17:49:14
963
原创 uvm sequence机制学习
UVM序列机制是UVM验证平台数据流传递的核心,涉及几个关键方法:seq_item_port.get_next_item()获取序列项,seq_item_port.item_done()完成传输;seqr.execute_item()执行序列项,seqr.start()启动序列;uvm_do宏则简化了序列项创建和发送流程。理解这些方法是掌握UVM验证的基础。
2025-08-23 11:21:23
878
原创 systemverilog interface相关问题记录
SystemVerilog中interface用法的关键注意事项总结: module端口声明时,interface必须采用ANSI格式,不能使用非ANSI格式。当interface与其他信号共存时,必须统一在端口声明中指定方向和位宽。 interface数组声明需注意: 必须带()结尾 可通过genvar循环索引,但不能用for/foreach遍历实体interface 可通过uvm_hdl_read或class封装实现间接遍历 modport使用要点: 方向是相对使用者而言 不同modport共享同一组信
2025-08-07 20:48:32
947
原创 Systemverilog父类句柄和子类句柄之间的转换关系
本文探讨了面向对象编程中父类与子类句柄转换的四种情况:(1)子类继承父类方法时,非virtual方法按句柄类型调用;(2)子类定义同名非virtual方法时遵循变量隐藏规则;(3)父类声明virtual方法但子类未重写时,仍调用父类方法;(4)子类重写virtual方法后父类句柄调用子类实现。结论指出:父类句柄指向子类对象时仅能访问父类成员,virtual方法需子类严格重写;子类同名变量会隐藏父类变量;$cast可实现向下类型转换。理解这些机制对开发复用性代码至关重要。
2025-07-14 13:46:29
486
原创 uvm_reg中hdl_path相关源代码解析(一)
在使用寄存器模型时,可以对每个field,reg,block添加其对应的后门路径的信号,这个信号是实际硬件信号的层次化索引对应的字符串。最终每个field对应的完整后门路径信号,为root_hdl_path + field_hdl_path,两者的拼接。又如何获取到添加的后门信号,这将是本篇文章的核心问题。在使用ralgen生成寄存器模型之后,通过uvm_reg::add_hdl_path() 函数将后门信息添加进去。在每个field名之后,加 (xxxxxx),表示这个field对应的后门信号。
2025-07-09 10:53:19
1085
原创 vcs编译选项合集
VCS提供的一些功能是他们还没有经过充分测试还没有发布的;如果你想使用这些功能就要加上 -lca参数。如果不使用kdb的话,verdi打开的波形文件中不会有pkg相关的信息,只会有design相关的文件。limited customer availability 使用用户受限功能。生成verdi kdb库,使verdi打开时能加载flist。
2025-06-10 00:26:46
348
原创 vcs仿真产生fsdb波形的两种方式
摘要: 本文介绍了使用VCS仿真生成FSDB波形文件的两种方法。方法一通过Verilog系统函数实现,包括$fsdbDumpfile设置文件名和$fsdbDumpfile指定层级范围。方法二采用UCLI命令行,需在编译时添加-debug_access+r选项,通过tcl脚本控制波形生成(如fsdbDumpvars)。推荐使用预先编写的tcl脚本(如simple_wave.tcl),通过simv-ucli -do命令执行,可灵活控制波形记录时间和层级范围。两种方法均参考自《VCS UserGuide 2021
2025-06-06 20:46:01
2410
原创 DW_apb_i2c配置指南
本篇主要记录自己在使用Synopsys的IP DW_apb_i2c时的体会。顾名思义,这个IP是基于I2C总线协议开发的,自己作为verifer的经验不足一年,所以一开始最困扰我的问题是I2C协议和这个IP有什么关系?(听起来能提出这样的问题是挺蠢的)对此,我的理解是,I2C协议是信息传递的一种规则,而DW_apb_i2c是基于verilog开发的满足I2C协议要求的硬件实体。网上关于I2C协议的解读已经很多了,这篇主要讲这个IP怎么使用。能够使用这个IP的前提是理解协议。
2024-01-17 23:33:40
5495
20
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅