元直数字电路验证
天地本無心,生民自有命,往聖無絕學,萬世不太平。硅農,因bug而生,與bug為伴,以debug為生。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
[SV]在 Verilog 中,对某个信号施加一个弱下拉,但又不能影响后续的正常驱动
摘要:Verilog中实现弱下拉(weak pull-down)而不影响后续强驱动的方法主要有两种。推荐使用pulldown门级原语,它会在无强驱动时自动将信号拉低,当有assign等强驱动时会自动被覆盖。SystemVerilog还支持通过带强度的assign语句实现。关键是不能使用普通assign(会永久拉低),而应使用pulldown原语或带weak0强度的驱动。这种方法适用于总线、复用信号等需要默认状态的场景。原创 2025-07-25 17:42:51 · 25 阅读 · 0 评论 -
[SV]SystemVerilog随机数发生器
摘要:SystemVerilog提供多种随机数生成方法,包括$random()、$urandom()、randomize()等,具有随机稳定性特性。随机稳定性表现为对象/线程间的随机序列相互独立,但同一线程内不同随机方法会相互影响。影响因素包括种子变化、调用顺序改变及随机条目调整等。建议谨慎使用$random(),注意线程内随机方法的相互干扰,并在测试程序中合理控制随机操作的位置以避免意外影响随机结果。原创 2025-07-20 21:30:39 · 149 阅读 · 0 评论 -
[Verilog]在module中使用$display()函數打印文件路徑和行號
前言:在debug的時候,我們往往需要知道Log中某條打印信息的位置,那麼怎麼才能用$display()函數打印出文件路徑和行號呢?方法見下面的例子: 1、使用$display()打印信息:$dispaly("Error: file %s @Line %0d", `__FILE__, `__LINE__); 2、使用$monitor(...原创 2020-01-20 09:14:12 · 3545 阅读 · 2 评论 -
[DPI-C]SystemVerilog 和 C/C++ 之间的桥梁 DPI
摘要:SystemVerilog的DPI(Direct Programming Interface)提供了与C/C++等语言的高效交互接口,相比传统PLI方式更简洁。DPI支持数据类型转换(包括四值逻辑变量通过aval/bval表示)、参数方向控制(input/output/inout)和三种导入模式(pure/context/generic)。通过svdpi.h头文件实现数据类型映射,支持定宽数组和动态数组(openarray)传递,其中openarray需使用svGetArrayPtr获取指针。原创 2025-07-10 11:13:35 · 951 阅读 · 0 评论 -
[SV]等待32个instance的某一个信号的pulse,该怎么写?
在UVM验证环境中等待32个随机顺序的pulse信号,可以通过SystemVerilog动态路径生成和并行进程实现。通过在Monitor组件中使用fork-join_none创建32个并行进程,每个进程动态生成路径(如tb_top.dut.module_inst[index].pulse)并监听对应信号。使用标志数组和计数器记录触发情况,当所有32个pulse都被捕获时终止进程,并通过uvm_analysis_port广播事件。该方法支持随机触发顺序,确保高效捕获所有信号,同时保持代码扩展性。原创 2025-05-10 12:30:17 · 975 阅读 · 0 评论 -
[Verilog]跨时钟域数据传输解决方案
跨时钟域数据传输解决方案摘要 本文详细探讨了SoC设计中跨时钟域数据传输(CDC)的关键问题及解决方案。现代SoC通常包含多个时钟域,不同模块可能运行在不同频率或相位的时钟下,导致亚稳态、数据丢失或一致性问题。文章介绍了五种主要解决方案:1)双触发器同步器,适用于单比特信号;2)握手协议,确保多比特数据一致性;3)FIFO缓冲区,支持高吞吐量数据流;4)灰码计数器,用于指针同步;5)时钟域桥接器IP核。针对验证方案,提出了基于UVM的环境设计,包括数据完整性检查、亚稳态处理验证、时序正确性确认和性能评估。原创 2025-05-02 21:50:04 · 1181 阅读 · 0 评论 -
[SV]SystemVerilog中,系统函数$cast()的作用是什么?
摘要:SystemVerilog中的$cast()系统函数用于安全的动态类型转换,主要在类层次结构中将父类句柄转换为子类句柄(向下转换)。它通过运行时类型检查确保转换合法性,成功时返回1并赋值句柄,失败则返回0。这种机制使得可以通过父类句柄访问子类特有成员,在多态场景(如UVM验证)中尤为重要。使用时需检查返回值处理转换失败情况。$cast()比静态转换更安全,但不能用于无关类或基本数据类型间的转换。原创 2025-05-02 10:25:42 · 611 阅读 · 0 评论 -
[UVM]在UVM环境中加入C++内存模块
这个例子展示了如何将C++和SystemVerilog结合使用,建立一个内存模型并在UVM环境中操作它。您可能需要根据具体设计需求调整内存大小和接口细节。确保编译和链接时配置正确,以便SV DPI和C++之间的互操作正常工作。原创 2024-12-05 14:54:50 · 641 阅读 · 0 评论 -
[SV]如何在UVM环境中使用C Model
使用支持 DPI-C 的仿真器(如 VCS、QuestaSim 或 XSIM)进行仿真。在 SystemVerilog 文件中,声明与 C 函数对应的 DPI 导入函数。为了与 SystemVerilog 交互,需要对先前的。创建一个 Memory 驱动类,封装对 C Memory 的读写操作。函数进行修改,添加 DPI-C 兼容的。在 AXI VIP 环境中,可以使用。使用 GCC 编译 C 代码为共享库(文件,用于声明 DPI 函数。原创 2024-12-14 19:29:59 · 1155 阅读 · 0 评论 -
[SV]Types, Operator, and Expressions
【代码】[SV]Types, Operator, and Expressions。原创 2024-05-14 17:12:11 · 951 阅读 · 0 评论 -
[SV]Modules, Controls, and Interfaces
【代码】[SV]Modules, Controls, and Interfaces。原创 2024-05-14 17:10:17 · 1296 阅读 · 0 评论 -
[SV]Class and Object-Oriented Programming
【代码】[SV]Class and Object-Oriented Programming。原创 2024-05-14 17:07:35 · 886 阅读 · 0 评论 -
[SystemVerilog]Simulation and Test Benches
每次网络/变量的值发生变化时,我们都会有一个更新事件,任何对该事件敏感的进程也需要进行评估,这就是所谓的评估事件。在每个 "时间戳 "上,模拟器需要首先计算更新事件,评估更新事件,并循环查看是否有更多的更新事件是由之前的更新事件触发的。请注意,put() 和 get() 都是阻塞的,也就是说,如果邮箱已满,put() 会阻塞当前进程,直到邮箱中出现空位,而 get() 则会阻塞,直到邮箱中出现一条消息。在解释测试环境之前,让我们先简单了解一下我们的 DUT,它是一个简单的乘法器,具有现成的有效接口。原创 2024-04-12 14:11:34 · 1161 阅读 · 0 评论 -
[SystemVerilog]常见设计模式/实践
例如,由于只需要一个比特来测试状态变量,单次热编码允许更小的多路复用逻辑,而加里编码允许更低的开关功耗,因此有利于低功耗设计。由于存在这种差异,当我们在 SystemVerilog 中设计 Moore 和 Mealy 机器时,会看到时序和面积方面的不同: - 要描述相同的控制逻辑,Moore 机器的状态往往多于 Mealy 机器 - 与 Mealy 机器相比,Moore 机器的输出往往有一个额外的周期延迟。虽然有时使用宏可以节省时间,使代码更容易重复使用,但在重复代码段和宏的使用之间找到平衡点是很重要的。原创 2024-04-11 09:12:54 · 1657 阅读 · 0 评论 -
同步復位和異步復位二者各自的優缺點
同步復位和異步復位二者各自的優缺點一、同步復位:當時鐘上升沿檢測到復位信號,執行復位操作(有效的時鐘沿是前提)。always @ ( posedge clk );1.1 優點:a、有利於仿真器的仿真;b、可以使所設計的系統成爲 100% 的同步時序電路,有利於時序分析,而且可綜合出較高的 Fmax;c、由於只在時鐘有效電平到來時纔有效,所以可以濾除高於時鐘頻率的復位毛刺。1.2缺點:a、復位信號的有效時長必須大於時鐘週期,才能真正被系統識別並完成復位任務。同時還要考慮諸原创 2024-02-05 10:06:54 · 1325 阅读 · 0 评论 -
[SV]SystemVerilog线程之fork...join专题
A:对于有握手、仲裁需求的线程(比如sequence发送激励),不应该粗鲁的使用disable fork结束这些线程,而应该在县城内部,在其完成握手、仲裁之后的安全阶段结束线程,否则容易引起死锁(dead-lock)。A:后台线程不会结束,任何由fork开辟的线程(join、join_any、join_none),无论其外部任务(task)何时结束也无论fork何时跳转执行后面的程序,都不会将其开辟的线程自动结束。disable fork停止的是其所在进程或者方法中的fork触发的所有子线程,原创 2023-04-04 11:34:58 · 1341 阅读 · 0 评论 -
[SV]local和protected的区别
local和protected的区别原创 2023-04-03 19:05:10 · 1388 阅读 · 0 评论 -
[SV]SystemVerilog virtual method和method的区别
SystemVerilog中virtual method和method的区别原创 2023-04-03 16:09:30 · 441 阅读 · 0 评论 -
[VCS]Coverage Options Introduction
VCS仿真中,可以产生以下两类coverage:code coverage和function coverage,对于code coverage,在编译和仿真需要加额外参数。对于function coverage,编译和仿真不需要加额外参数,本文将详细介绍VCS coverage相关的option。原创 2023-01-31 09:25:34 · 2110 阅读 · 0 评论 -
[VCS]Condition coverage vs. branch coverage
条件覆盖测试是一种白盒测试,用于测试程序中所有条件表达式的所有可能结果。它也称为谓词覆盖。那么条件覆盖率和分支覆盖率有什么区别呢?在分支覆盖中,所有条件都必须至少执行一次。另一方面,在条件覆盖中,所有条件的所有可能结果必须至少测试一次。原创 2023-01-18 15:26:29 · 2709 阅读 · 1 评论 -
[SV]SystemVerilog二维关联数组使用案例
摘要:二维的关联数组是一种非常重要的数据结构,在验证环境中用于保存一些特定的对象,用于检索和分析。本文会介绍一种二维关联数组的使用案例。计算时间间隔,可以用Linux的时间戳(date +%s),将得到的数据写入文件,最后读回来作差。原创 2022-10-24 10:11:27 · 2519 阅读 · 0 评论 -
[SV]在SystemVerilog中调用Linux系统命令
摘要:在验证环境构建中,为了使得环境更加灵活,复用性更强,或者获取日期等等,都需要通过Linux命令来实现。那么在SystemVerilog中怎么调用Linux命令呢?本文将通过一个例子来展示实现方法。原创 2022-10-12 15:12:00 · 2321 阅读 · 0 评论 -
[SV]SystemVerilog中指定打印格式
本文主要总结一下SystemVerilog中的占位符,通过合理的使用占位符,可以再log中按自己指定的格式打印信息,方便case分析及debug。原创 2022-10-12 14:33:56 · 5910 阅读 · 3 评论 -
[MEM]Backdoor Access Memory
本文分享一种AXI slave vip memory中实现backdoorAccess memory的方法。原创 2022-09-13 16:55:34 · 789 阅读 · 0 评论 -
[SVA]如何用Assertion检查“某事件在仿真过程中一定要发生”
本文介绍了两种高效检查信号在仿真中必须出现的方法。针对传统##[1:$]写法会创建过多并行进程影响效率的问题,提出两种优化方案:1)使用goto(->)语法改写断言,更精准匹配目标信号;2)结合s_eventually和$assertoff,在首次检测到信号后关闭断言。文章还介绍了LTL操作符s_until和s_eventually在创建活动属性时的应用,强调强版本(s_前缀)能确保条件在无限跟踪中必须发生。这些方法既保证了验证需求,又提升了仿真效率。原创 2022-09-08 19:55:12 · 14 阅读 · 0 评论 -
[VCS]merge coverage --- vdb merge
本文介绍了数字电路验证中覆盖率合并的方法与注意事项。主要内容包括VCS工具中常用的覆盖率合并命令,如使用urg工具合并多个vdb文件,指定覆盖率类型(line/tgl/cond等)和灵活合并选项(flex_merge)。文中详细说明了不同场景下的合并策略,如新增coverpoint时的处理方式,并比较了drop/reference/union三种合并模式。同时提供了覆盖率报告生成方法(HTML/文本格式)和实用建议:建议采用分层合并策略(每日合并后再汇总),避免因单日数据错误导致整体合并失败;当RTL结构或原创 2019-03-12 21:43:59 · 14097 阅读 · 0 评论 -
[SystemVerilog]Interface Array使用案例
前言:在IT/SoC Level验证中,经常会遇到一个agent例化多次的问题,因此每个agent都需要给它set interface,如果展开写,将会出现很多uvm_config_db::set()语句,显得冗余。那么有没有办法通过循环来实现这种场景下的Interface set呢?本文将介绍一种可行的方案 --- 使用Interface数组和generate块来简化Interface set。...原创 2022-08-08 17:28:18 · 2501 阅读 · 7 评论 -
[SV]SystemVerilog DPI应用实例
前言:在2003年IEEE 1800 SV LRM 3.1a中提出了一种直接的编程语言接口DPI。SystemVerilog DPI(直接编程接口)是将SystemVerilog与外部语言连接的一个接口。理论上外部语言可以是C,C ++,SystemC以及其他语言。但是,现在,SystemVerilog仅为C语言定义了一个外部语言层。 DPI由两层组成:SystemVerilog层和外部语言层。两层都彼此隔离。实际使用哪种编程语言作为外语是透明的,与此接口的SystemVerilog端无关。原创 2022-07-14 17:26:32 · 2025 阅读 · 0 评论 -
[SV]SystemVerilog 断言(SVA)检查器库(OVL)
SystemVerilog断言(SVA)检查器库摘要 SystemVerilog断言(SVA)检查器库包含基础检查器和高级检查器两部分,用于设计验证和覆盖率收集。基础检查器包含31种常用断言,如assert_always、assert_one_hot等,主要用于时序关系、状态转换等基本功能验证。高级检查器则处理更复杂场景,如仲裁器验证、FIFO检查、内存访问等。 该库支持全局宏控制,可配置断言使能(ASSERT_ON)、覆盖率收集(COVER_ON)等参数。检查器在时钟上升沿采样信号,部分支持用户选择采样边原创 2022-07-08 10:12:36 · 5160 阅读 · 1 评论 -
[SV]SystemVerilog covergroup语法小结
SystemVerilog covergroup语法小结一、Covergroup定义与收集1. 1Covergroup定义与例化Covergroup是承载coverage的容器。 coverage只能收集integral Data types,对于real等类型的数据是不能收集的。1.2 Covergroup可以定义在何处Covergroup只能定义在package/class/module/program/checker/interface中。covergroup...原创 2022-03-22 09:48:26 · 10404 阅读 · 3 评论 -
[SoC]SoC验证中bootcode与firmware相关验证经验总结
本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等原创 2021-12-28 16:02:47 · 2072 阅读 · 0 评论 -
[SV]SystemVerilog中的随机方法
摘要:本文介绍了SystemVerilog中的随机方法及其稳定性。主要内容包括:1)基本随机数生成方法($random、$urandom等);2)类的随机化方法(randomize()和std::randomize());3)randcase和randsequence的使用;4)数组shuffle()方法。重点阐述了随机稳定性的三个层面:程序级、线程级和对象级,并分析了影响随机结果的关键因素,如种子变化、调用顺序等。文章建议谨慎使用$random(),并指出同一线程中不同随机方法会相互影响。原创 2021-12-02 19:44:04 · 3846 阅读 · 0 评论 -
[DMA]AXI VIP中Memory的实现方法
摘要:本文介绍了一种基于SystemVerilog的Memory实现方法,用于DMA验证中数据正确性比对。通过关联数组构建shadow_mem存储模型,实现了对非对齐地址(araddr/awaddr)的数据存取管理。在get_req函数中处理写请求,将数据按字节存入shadow_mem;在get_rsp函数中完成读数据与存储数据的比对,包括地址对齐处理和数据有效性检查。该方法支持不同传输长度和字节使能,能有效验证DMA搬运数据的准确性,为验证过程提供可靠的数据比对机制。原创 2021-10-26 17:06:07 · 2545 阅读 · 2 评论 -
Verilog门级建模及驱动强度简介
Verilog门级建模一、门级建模是指调用 Verilog 内部自定义的基本门元件(或者用户自定义基本元件)来对硬件 电路进行结构描述 门级建模方式采用的是一种特殊的模块调用方式。此时所调用的模块式 Verilog 内部预先定 义好的基本门级元件或者用户自定义的基本元件,在这种建模方式下硬件电路将被描述成由 一组基本门级元件的实例组成。二、内置基本门级元件 Verilog HDL 内含的基本门级元件有 14 中,包括 and(与门)、nand(与非门)、or(......原创 2021-10-06 09:59:36 · 6451 阅读 · 1 评论 -
[SV]Systemverilog动态数组(Dynamic Array)
SystemVerilog动态数组摘要 SystemVerilog动态数组是一种大小可在运行时设置或改变的非压缩数组,使用空下标[]声明。其内存空间需通过new[number]显式分配。主要特点包括:1) 声明语法为data_type array_name[];2) 提供new[]分配内存、size()获取大小、delete()清空数组等方法;3) 可动态调整大小,通过new[size]覆盖原数组或newsize保留原值扩展;4) 初始未分配时大小为0。示例演示了数组声明、内存分配、初始化、大小调整和删除操原创 2021-10-06 09:09:18 · 1702 阅读 · 1 评论 -
[SV]SystemVerilog压缩数组(Packed Array)和非压缩数组( Unpacked Array)
SystemVerilog中的压缩数组(packed array)和非压缩数组(unpacked array)在声明和存储方式上存在重要区别。压缩数组的维度声明在变量名左侧,由单比特数据类型组成,保证连续存储,如bit[2:0][7:0]array5表示4×2的连续二维数组。非压缩数组的维度声明在变量名右侧,可以是任意数据类型,存储可能不连续,如bit[7:0]array4[2:0]表示3×8的非连续二维数组。压缩数组常用于位操作,而非压缩数组更灵活但效率较低。原创 2021-10-06 08:39:38 · 3863 阅读 · 0 评论 -
[AXI]AXI AIP相关Assertion的研究
AXI AIP相关Assertion的研究原创 2021-10-02 16:58:27 · 6 阅读 · 0 评论 -
[SV]Interface的另类用法 --- bind interface in DUT
本文介绍了SystemVerilog中interface的另类用法,重点讲解了如何将AXI4接口绑定到DUT并通过UVM获取。主要内容包括:1)定义AXI4接口时使用port而非logic类型;2)详细展示了接口绑定方法,包括信号名不匹配时的处理方式;3)在UVM agent中通过宏定义和uvm_resource_db获取接口实例;4)总结了三种bind语法:绑定到所有实例、特定实例以及通配符连线方式。文章提供了完整的代码示例和实用宏定义,为验证工程师处理复杂接口绑定提供了详细指导。原创 2021-10-02 08:27:25 · 3574 阅读 · 0 评论 -
[SV]SystemVerilog运算相关的问题
SystemVerilog运算相关的问题 前言:在Verilog/SystemVerilog中,我们常用的是整数(bit、int、longint),小数可以用(real),对小数的处理大致分为三种:四舍五入 向上取整 向下取整 那么这三种如何实现呢?本文将给出一些例子:一、四舍五入如果除数和被除数均为整数,可以通过乘以1.0来实现bit [7:0] resync_times;bit [7:0...原创 2021-05-10 21:23:11 · 8658 阅读 · 2 评论 -
[SVA]SystemVerilog Assertion常用操作符总结及案例
SystemVerilog Assertion常用操作符总结及案例 前言:针对信号持续重复的情况,SVA提供了三种重复操作符:Consecutive repetition(持续性重复),go to repetition(跟随重复操作)和non-consecutive repetition(非连续重复操作)。本文将分别介绍这三种操作符的含义及使用方法。一、持续重复操作(Consecutive repetition)1.1 信号的重复原语: signal .........原创 2021-04-02 16:47:56 · 11789 阅读 · 2 评论