SystemVerilog
文章平均质量分 74
本专栏记载了笔者10年以来的验证经验,总结了大量的数字电路验证中常语法、结构。
元直数字电路验证
天地本無心,生民自有命,往聖無絕學,萬世不太平。硅農,因bug而生,與bug為伴,以debug為生。
展开
-
[SV]Types, Operator, and Expressions
【代码】[SV]Types, Operator, and Expressions。原创 2024-05-14 17:12:11 · 846 阅读 · 0 评论 -
[SV]Modules, Controls, and Interfaces
【代码】[SV]Modules, Controls, and Interfaces。原创 2024-05-14 17:10:17 · 1162 阅读 · 0 评论 -
[SV]Class and Object-Oriented Programming
【代码】[SV]Class and Object-Oriented Programming。原创 2024-05-14 17:07:35 · 753 阅读 · 0 评论 -
[SystemVerilog]Simulation and Test Benches
每次网络/变量的值发生变化时,我们都会有一个更新事件,任何对该事件敏感的进程也需要进行评估,这就是所谓的评估事件。在每个 "时间戳 "上,模拟器需要首先计算更新事件,评估更新事件,并循环查看是否有更多的更新事件是由之前的更新事件触发的。请注意,put() 和 get() 都是阻塞的,也就是说,如果邮箱已满,put() 会阻塞当前进程,直到邮箱中出现空位,而 get() 则会阻塞,直到邮箱中出现一条消息。在解释测试环境之前,让我们先简单了解一下我们的 DUT,它是一个简单的乘法器,具有现成的有效接口。原创 2024-04-12 14:11:34 · 876 阅读 · 0 评论 -
[SystemVerilog]常见设计模式/实践
例如,由于只需要一个比特来测试状态变量,单次热编码允许更小的多路复用逻辑,而加里编码允许更低的开关功耗,因此有利于低功耗设计。由于存在这种差异,当我们在 SystemVerilog 中设计 Moore 和 Mealy 机器时,会看到时序和面积方面的不同: - 要描述相同的控制逻辑,Moore 机器的状态往往多于 Mealy 机器 - 与 Mealy 机器相比,Moore 机器的输出往往有一个额外的周期延迟。虽然有时使用宏可以节省时间,使代码更容易重复使用,但在重复代码段和宏的使用之间找到平衡点是很重要的。原创 2024-04-11 09:12:54 · 1374 阅读 · 0 评论 -
同步復位和異步復位二者各自的優缺點
同步復位和異步復位二者各自的優缺點一、同步復位:當時鐘上升沿檢測到復位信號,執行復位操作(有效的時鐘沿是前提)。always @ ( posedge clk );1.1 優點:a、有利於仿真器的仿真;b、可以使所設計的系統成爲 100% 的同步時序電路,有利於時序分析,而且可綜合出較高的 Fmax;c、由於只在時鐘有效電平到來時纔有效,所以可以濾除高於時鐘頻率的復位毛刺。1.2缺點:a、復位信號的有效時長必須大於時鐘週期,才能真正被系統識別並完成復位任務。同時還要考慮諸原创 2024-02-05 10:06:54 · 1226 阅读 · 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 · 1117 阅读 · 0 评论 -
[SV]local和protected的区别
local和protected的区别原创 2023-04-03 19:05:10 · 1165 阅读 · 0 评论 -
[SV]SystemVerilog virtual method和method的区别
SystemVerilog中virtual method和method的区别原创 2023-04-03 16:09:30 · 361 阅读 · 0 评论 -
[VCS]Coverage Options Introduction
VCS仿真中,可以产生以下两类coverage:code coverage和function coverage,对于code coverage,在编译和仿真需要加额外参数。对于function coverage,编译和仿真不需要加额外参数,本文将详细介绍VCS coverage相关的option。原创 2023-01-31 09:25:34 · 1751 阅读 · 0 评论 -
[VCS]Condition coverage vs. branch coverage
条件覆盖测试是一种白盒测试,用于测试程序中所有条件表达式的所有可能结果。它也称为谓词覆盖。那么条件覆盖率和分支覆盖率有什么区别呢?在分支覆盖中,所有条件都必须至少执行一次。另一方面,在条件覆盖中,所有条件的所有可能结果必须至少测试一次。原创 2023-01-18 15:26:29 · 2056 阅读 · 1 评论 -
[SV]SystemVerilog二维关联数组使用案例
摘要:二维的关联数组是一种非常重要的数据结构,在验证环境中用于保存一些特定的对象,用于检索和分析。本文会介绍一种二维关联数组的使用案例。计算时间间隔,可以用Linux的时间戳(date +%s),将得到的数据写入文件,最后读回来作差。原创 2022-10-24 10:11:27 · 2047 阅读 · 0 评论 -
[SV]在SystemVerilog中调用Linux系统命令
摘要:在验证环境构建中,为了使得环境更加灵活,复用性更强,或者获取日期等等,都需要通过Linux命令来实现。那么在SystemVerilog中怎么调用Linux命令呢?本文将通过一个例子来展示实现方法。原创 2022-10-12 15:12:00 · 1954 阅读 · 0 评论 -
[SV]SystemVerilog中指定打印格式
本文主要总结一下SystemVerilog中的占位符,通过合理的使用占位符,可以再log中按自己指定的格式打印信息,方便case分析及debug。原创 2022-10-12 14:33:56 · 4857 阅读 · 3 评论 -
[MEM]Backdoor Access Memory
本文分享一种AXI slave vip memory中实现backdoorAccess memory的方法。原创 2022-09-13 16:55:34 · 511 阅读 · 0 评论 -
[VCS]merge coverage --- vdb merge
一、記錄一些常用的VCS Commandmerge coverage:urg -full64 -metric line+tgl+cond+fsm+assert+branch -warn none -dbname <merge_coverage_name>.vdb -dir simv.vdb -elfile <el_filename.el> 注意:其中-dir之後的第...原创 2019-03-12 21:43:59 · 12834 阅读 · 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 · 1771 阅读 · 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 · 1719 阅读 · 0 评论 -
[SV]SystemVerilog 断言(SVA)检查器库(OVL)
前言:SystemVerilog 断言(SVA)检查器库由如下两部分组成: 检查器库放置在如下路径中(由于本文所讲解的是针对 Synopsys 的 VCS 工具,所以有很多内容都是和 Synopsys 的 VCS 相关的,详细的 VCS 使用文档可以参阅相关的文档,VCS 的讲解不是本文档的最终目的): 如下标记参数都是使用`define 进行定义的宏,并且这些宏被应用到所有的检测器。............原创 2022-07-08 10:12:36 · 4200 阅读 · 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 · 8270 阅读 · 3 评论 -
[SoC]SoC验证中bootcode与firmware相关验证经验总结
SoC验证中bootcode与firmware相关验证经验总结一、backdoor load memory1.1 将bootcode写入ROM 在Verilog语法中,可以使用系统函数$readmemh()将bootcode写入ROM:(1)$readmemb("<数据文件名>", <存储器名>);(2)$readmemb("<数据文件名>", <存储器名>, <起始地址>);(3)$readmemb("<数据文...原创 2021-12-28 16:02:47 · 1845 阅读 · 0 评论 -
[SV]SystemVerilog中的随机方法
SystemVerilog中的随机方法一、基本知识 随机数发生器(RNG)对于对象和线程来说都是本地的,被一个对象或者线程使用的随机序列独立于其他的对象或者线程,这个特性被称之为随机稳定性。随机稳定性的基础是伪随机数发生器,一般来说,伪随机数由算法和种子决定,当算法固定时,通过控制种子就可以控制其产生的随机数序列。二、SV中的随机方法2.1 产生随机数的方法$random(),$urandom(),$urandom_range()$random(seed=0),其他.....原创 2021-12-02 19:44:04 · 3328 阅读 · 0 评论 -
[DMA]AXI VIP中Memory的实现方法
AXI VIP中Memory的实现方法 摘要:在DMA验证过程中,需要对比read data与write data,但是araddr与awaddr未必是aligned address,那么我们怎么去对比DMA搬运的数据是否正确呢?为此我们需要造一个memory来存放数据,然后再对比DMA搬运的数据是否正确。一、用SystemVerilog实现Memory。 下面介绍一种用关联数组来模拟Memory的例子:class dma_scb extends uvm_s...原创 2021-10-26 17:06:07 · 1876 阅读 · 2 评论 -
Verilog门级建模及驱动强度简介
Verilog门级建模一、门级建模是指调用 Verilog 内部自定义的基本门元件(或者用户自定义基本元件)来对硬件 电路进行结构描述 门级建模方式采用的是一种特殊的模块调用方式。此时所调用的模块式 Verilog 内部预先定 义好的基本门级元件或者用户自定义的基本元件,在这种建模方式下硬件电路将被描述成由 一组基本门级元件的实例组成。二、内置基本门级元件 Verilog HDL 内含的基本门级元件有 14 中,包括 and(与门)、nand(与非门)、or(......原创 2021-10-06 09:59:36 · 5738 阅读 · 1 评论 -
[SV]Systemverilog动态数组(Dynamic Array)
Systemverilog Dynamic Array A dynamic array is one dimension of an unpacked array whose size can be set or changed at run-time. Dynamic array is Declared using an empty word subscript [ ]. The space for a dynamic array doesn’t exist until...原创 2021-10-06 09:09:18 · 1284 阅读 · 1 评论 -
[SV]SystemVerilog压缩数组(Packed Array)和非压缩数组( Unpacked Array)
SystemVerilog Packed Array and Unpacked Array。The termpackedarray is used to refer to the dimensions declared before the data identifier name The termunpackedarray is used to refer to the dimensions declared after the data identifier namebit [7:0...原创 2021-10-06 08:39:38 · 3505 阅读 · 0 评论 -
[SV]Interface的另类用法 --- bind interface in DUT
Interface的另类用法 --- bind interface in DUT一、harness interface(AXI4)interface axi4_if#(`AXI4_VIP_PARAMETER_DECLEAR)( //Global Signals input ACLK, input ARESTn, //Write Command Channel Signals inout [MAX_ID_WI原创 2021-10-02 08:27:25 · 3219 阅读 · 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 · 7511 阅读 · 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 · 9520 阅读 · 2 评论 -
[SV]在循环体中创建线程
在循环体中创建线程 前言:在SerDes的验证中,经常需要check每条lane的行为,对于check的task而言,只需要传入参数lan_num即可,其他的地方都相同。那么对于6T6R SerDes而言,怎么开6个线程呢?本文将给出一个例子。一、循环体中创建线程的例子task main_phase(uvm_phase phase);`ifdef DL_DIR for(int i = 0; i < ...原创 2021-03-27 15:04:54 · 607 阅读 · 0 评论 -
[SV]UVM验证环境中define的应用
UVM验证环境中`ifdef的应用 前言:在环境管理中,我们经常用`ifdef来选择需要编译那些代码,避免吧大量的代码再复制一份。但是define也是一把双刃剑,使用的define过多会造成环境混乱,有些define会造成编译错误。一、预编译指令的基本语法`ifdef T2R_LOOPBACK`elsif UL_DIR`else`endif为了避免其他同仁没有加define造成的编...原创 2021-03-18 20:52:30 · 2926 阅读 · 0 评论 -
[DV]数字验证之Clock debounce
数字验证之Clock debounce 前言:在数字电路中,为了节省power,需要对clock进行管理,例如档data_duration拉低之后,关闭clock。为了确保数据能够传输完成,在valid拉低之后通常还要放若干个clock出来,那么这个IP需要怎么设计呢?本文将给出一种设计思路。一、模块定义module lane_clk_gate_sync_on( clk, rst_b, ck......原创 2021-03-18 20:39:21 · 837 阅读 · 0 评论 -
[SVA]SystemVerilog Assertion中的重复
SystemVerilog Assertion中的重复 前言:如何在Assertion中实现计数功能呢?本文将给出一个常见的用法。一、用局部变量实现计数器property check_counter; int L_cnt; @(posedge clk) ( ($rose(start),L_cnt = 0) ##1 (1, L_cnt = L_cnt+1)[*0:$] ##1 (L_...原创 2021-03-18 19:43:16 · 857 阅读 · 0 评论 -
[DV]在长burst中漏采样的问题
在长burst中漏采样的问题一、背景 最近在验SerDes的过长中,发现了一个在长burst中漏采样的问题。本来lane上的data应该是均匀的,但是在data传送一段时间之后,就会出现valid信号少了一个,本来是2T clock来一个valid,但是某时刻4T才来了一个burst。二、问题探索 开始,怀疑是使用clock blocking造成的,可能是setup_time和hole_ti...原创 2021-01-19 11:15:05 · 340 阅读 · 0 评论 -
[SVA]SystemVerilog Assertion Property开发技巧总结
SystemVerilog Assertion开发技巧总结一、在property中可以使用if-else条件语句如下面的例子,根据misc_phy_12g_rx的取值,选择不同的判断语句property ck1_en_rose_chk(); @(posedge clk) disable iff(~rst_n) ad_pn_ck1en & (current_state !== ST_IDLE) |->...原创 2020-11-12 13:34:22 · 4533 阅读 · 0 评论 -
[SV]SystemVerilog随机加权决策(分支)--- randcase
SystemVerilog随机加权决策(分支)--- randcase一、Randcase syntaxrandcase randcase_item : statement; ...endcase1.1.randcase的权重为常数 关键字randcase引入了一个case语句,该语句随机选择它的一个分支。randcase_item表达式是组成分支权重的非负整数值。一个项目的权重(randcase_item)除以...原创 2020-10-23 09:39:47 · 7060 阅读 · 0 评论 -
[SV]SystemVerilog数据类型、运算、以及运算优先级总结
SystemVerilog数据类型、运算、以及运算优先级总结一、SystemVerilog数据类型和运算符 二、SystemVerilog运算优先级原创 2020-10-09 22:20:10 · 9124 阅读 · 0 评论 -
[SV]do while循环使用案例总结
SystemVerilog do while循环使用案例总结 前言:在SV中,我们经常会用到do while循环,其基本语法如下图所示。对于do while循环,他至少会被执行一次,然后判断while条件是否成立,如果成立,则继续执行循环体,如果while条件不成立,跳出循环体,继续执行后面的程序。do begin ...end while(condition);一、应用场景一1.1.等待某个信号拉高(或拉低)int...原创 2020-08-19 19:43:03 · 13693 阅读 · 1 评论 -
[SV]SystemVerilog学习笔记之过程块
第一章 System Verilog过程块、任务和函数1.1. verilog通用目的always过程块(procedural block)(可综合)always过程块的综合指导方针:组合逻辑1.关键词always后必须跟一个边沿敏感的事件控制(@符号)2.事件控制的敏感表中不能包含posedge和negedge限定词3.敏感表必须列出过程块的所有输入,所谓输入是指在该块读入并且在块外赋值的信号4.过程块中不能包括其他的事件控制5.所有在过程块中赋值的变量必须随所有...原创 2020-07-26 10:45:55 · 5094 阅读 · 0 评论 -
[SV]SystemVerilog学习笔记之struct & union
SystemVerilog学习笔记(四)一、结构体(struct)1.1、结构体(struct)结构体声明:结构体默认是变量,也可以声明为线网var struct{ //通过var进行结构体变量声明 logic [31:0] a, b; logic [ 7:0] opcode;} Instruction_Word_var;wire struct{ //结构体线网声明,定义为线网类型时,结构体的所有成员必须...原创 2020-07-25 20:05:48 · 11229 阅读 · 0 评论