- 博客(64)
- 收藏
- 关注
原创 IC验证典型测试向量
时序电路拥有内部状态序列,其内部状态必须用寄存器变量进行建模,该寄存器的值就是时序电路的当前状态,它的下一个状态是山放在基元功能列表中的状态转换表决定的,而且寄存器的下一个状态就是这个时序电路UDP的输出值。在Verilog测试中,总线测试信号通常是通过将片选信号,读(或者写)使能信号、地址信号以及数据信号以task任务的形式来描述,通过调用以task形式的总线信号测试向量来完成相应的总线功能。(2)UDP的输入端可有多个,一般时序电路UDP的输入端口最多9个,组合电路UDP 的输入端口可多至10个。
2025-02-17 07:38:25
648
原创 verilog程序设计及SystemVerilog验证
在Testbench模块内,例化待测设计的顶层模块,并把测试行为的代码封装在内,直接对待测系统提供测试激励。自动检查仿真结果是通过在设计代码中的关键节点添加断言监控器,形成对电路逻辑综合的注释或是对设计特点的说明,以提高设计模块的观察性。由于门级建模属于结构级建模,建议仿真代码尽量使用行为级语句,建模层次越抽象,执行时间就越短。测试平台需要产生时钟信号、复位信号和一系列的仿真向量,观察DUT的响应,确认仿真结果。通过直接观察各信号波形的输出,比较测试值和期望值的大小,来确定仿真结果的正确性。
2025-02-15 20:24:19
1095
2
原创 Python math 模块
Python模块提供了许多对浮点数的数学运算函数。模块下的函数,返回值均为浮点数,除非另有明确说明。如果你需要计算复数,请使用 cmath 模块中的同名函数。
2025-02-14 16:01:45
621
原创 Linux 系统使用教程
Linux 是一种开源的操作系统内核,由 Linus Torvalds 创建于 1991 年。基于此内核构建的各种发行版提供了完整的操作系统环境。这些发行版通常包含了 GNU 工具集以及其他自由软件项目成果,形成了功能强大且灵活多变的工作平台1。
2025-02-11 15:54:10
363
原创 总线协议的4K边界
在 AXI 协议中,4KB 边界是指地址的低 12 位全为 0 的地址。以 32 位地址为例,像 32’h00001000、32’h00002000、32’h00003000 等这些地址均为 4KB 边界。也就是说地址空间被划分为 4KB(即 4096)字节大小的块,(31:12) 位相等的地址都是同一个 page,属于同一个 4KB 空间。
2025-02-09 16:25:42
409
原创 PYTHON正则表达式的模式
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 \\t )匹配相应的特殊字符。下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。多数字母和数字前加一个反斜杠时会拥有不同的含义。模式字符串使用特殊的语法来表示一个正则表达式。反斜杠本身需要使用反斜杠转义。
2025-02-09 16:22:25
469
原创 AMBA总线详解
本文主要介绍总线相关的知识,会从以下几个方面展开:什么是总线,为什么需要总线,总线的组成,总线的分类,ARM中常见的总线协议是什么,然后后面的部分会着重介绍一下ARM中常见的总线协议及工作原理。什么是总线呢?总线是计算机各种功能部件(运算器、控制器、内存、输入、输出等)之间传送信息的公共通信干线,它是由导线组成的传输线束。简单来说总线也是导线,是连接两个以上计算机部件的专用信号线,在各个部件之间传送信息的公共通路。为什么需要总线呢?
2025-02-08 14:49:16
1083
原创 如何集成VIP到我们的testbench
vip发送的trans在验证环境中可能需要被捕捉,典型的做法是,当VIP用作master的时候把trans送给ref model进行进一步处理,当VIP作为slave的时候把trans送给scoreboard进行比较。:一般VIP是来模拟某种接口协议,协议本身有很多版本,不同的feature,比如AMBA的APB需不需要pprot,pstrb,pslverr信号,所以需要验证人员根据DUT的情况制定好正确的配置。如果要接的DUT是SoC的一部分,本身已经和其他模块相连,可以通过force的形式进行连接。
2025-02-06 19:19:15
796
原创 systemverilog关键字vritual的应用场景和用法
虚类只用来定义类的格式, 和成员的名字, 参数, 不能被实例化, 只能被重载, 用于在项目中定义一些标准的类, 例如driver类, 这样大家extend出来的driver的基本的格式都是一样的, 易读易理解. 在virtual class里的方法最好使用 pure virtual 修饰, 叫做纯虚方法, 也是用来定义方法的名字和参数列表的, 方便大家统一名字。虚函数是指一个类中你希望重载的成员函数 ,当你用一个基类指针或引用指向一个继承类对象的时候,调用一个虚函数时, 实际调用的是继承类的版本。
2025-02-06 08:37:35
715
原创 python 脚本之元组和列表
Python 的元组与列表类似,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
2025-02-05 17:03:58
1071
原创 python之面向对象
类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。类变量或者实例变量, 用于处理类及其实例对象的相关的数据。如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。定义在方法中的变量,只作用于当前实例的类。在类的声明中,属性是用变量来表示的。
2025-02-05 16:38:05
670
原创 IC验证之中断
上述只是中断树的某一级中断合并的查询处理,而对CORE而言,原则上需要遍历中断树上的每个节点才能够获取所有的源中断。因此源模块产生的中断信号需要和其他模块产生的中断信号,或者模块内多个中断信号进行合并,合并成单个中断信号后,再送往上一级模块,直到CORE的入口。中断合并过程中,不仅需要做信号的merge,还需要给每个源中断设计相应的中断配套寄存器,用于指示当前有哪些源中断触发。系统里,都会存在众多的外部中断源,比如一些模块的维测中断信号,业务上报中断,总线挂死,,逐级回读查询,最终查询到所有的源中断。
2024-12-25 21:07:49
1106
原创 验证面试常见问题系列
文件是整个 UVM testbench 的主要入口,其中会组织和管理 UVM 环境、测试用例、监控器、驱动、代理和其他需要的组件,以及定义仿真时钟和其他系统级设置。端口发出到达不同组件,则要求该端口能够满足一端到多端,如果数据源端发生变化需要通知跟它关联的多个组件时,我们可以利用软件的设计模式之一观察者模式实现,即广播模式。定义的宏可以在整个 testbench 文件夹中的各个文件中使用,以配置和控制测试环境和测试用例的行为。日志和报告输出:可以定义各种日志级别和报告输出选项,以控制日志和报告的详细程度。
2024-12-24 19:39:21
1011
原创 UVM学习总结
在环境中,您可以使用uvm_config_db来将配置设置传递给序列,并使用uvm_sequence_base中的start()方法启动序列。因此,在不同组件内同时出现多个相同的uvm_config_db.call()调用时,每个组件内的调用都是有效的,并且不会相互干扰。当多个组件同时出现多个相同的uvm_config_db.call()调用时,每个组件内的调用都是独立的,不会相互影响。因此,在同时出现多个相同的uvm_config_db.call()调用时,最后一个调用将是有效的,并将覆盖之前的调用。
2024-12-23 20:23:11
568
原创 systemverilog的一些知识点
event是静态的同步对象句柄,翻译翻译就是句柄一般可以是不同对象,是一个动态的,这里的even是一个静态的,只是指明一个事件可以用于线程同步,可以被赋值给其他事件,这样两个事件句柄会指向同一个对象,触发任意一个句柄就触发这个事件;每个进程都可以在共享内存写下自己的信息,其他进程也可以读取这些信息,这种方式可以实现高效的数据共享和通信,因为它不需要数据夫人复制和传递。mailbox的使用方法。3.事务级建模(TLM):模块之间进行高层次的通信,在验证环境中,可以使用TLM来实现DUT和验证组件之间的通信。
2024-12-23 19:44:29
751
原创 UVM知识点系列
用户自定义的main_phase会在程序执行的主要阶段中执行。具体情况包括:程序启动时执行:当程序启动时,main_phase是第一个被执行的用户自定义函数。程序进入主循环时执行:在程序的主循环中,main_phase可以定义程序的主要逻辑和流程。每次循环迭代时,main_phase会被调用一次。特殊事件发生时执行:根据用户的需求,可以将某些特殊事件的处理逻辑放在main_phase中。比如,当程序收到特定的输入或触发了某个事件时,main_phase可以执行相应的处理操作。
2024-12-12 22:41:50
541
原创 UVM知识点系列
通过以上步骤,当DUT的输出满足特定条件时,ScoreboardMonitor回调类的"pre_do"方法将被调用,并根据条件生成相应的报告。但是,缺点是在start方法被调用后,sequence内部的所有items都会被连续地执行,没有中间的控制点,因此不够灵活。通过虚拟接口,我们可以在测试环境中连接不同模型或组件的接口,实现它们之间的通信和数据交换。通过虚拟接口,我们可以在测试环境中连接不同模型或组件的接口,实现它们之间的通信和数据交换。它允许不同的部分在系统级别进行连接和通信,而无需实际的物理接口。
2024-12-11 18:54:34
970
原创 UVM之寄存器模型生成
field_access = sheet[field_access_column+str(i+field_num)].value # 域的access。field_access = sheet[field_access_column+str(i+field_num)].value # 域的access。field_bit_start = sheet[bit_start_column+str(i+field_num)].value # 起始位数。
2024-12-10 19:09:54
1114
原创 IC验证基础知识系列随笔
在IP验证工作中,我们通常会引入寄存器模型,针对寄存器模型的功能是否正确,我们会有专门的case进行测试,通常测试寄存器的读写功能,采用寄存器前门访问先写后读的方式,但是有些寄存器的偏移地址错误的情况,这种先写后读的方式并不能检查出来,此时需要换一种方式,比如采用前门写入,后门读出,进行检查。,然后去仿真,保证仿真正确性,收集覆盖率;第七步就是review验证工作,找有经验的工程师前辈,一起查看验证tb和testcase,一方面查看是否有验证遗漏,另一方面可以借鉴前辈的经验优化验证环境。
2024-12-09 20:32:10
921
原创 IC验证工程师基础知识
SystemVerilog断言(Assertion)是一种用于设计验证的语言扩展,它可以在仿真或形式验证过程中指定设计属性并检查其正确性。SystemVerilog断言提供了一种表达设计应满足的属性的方式,允许设计者执行断言、覆盖属性和假设保证推理。该语言基于SystemVerilog的标准语言构造的一个子集,并提供了专门用于指定断言的附加构造。SystemVerilog断言通常以并发断言(concurrent assertions)的形式编写,这些断言在仿真过程中持续进行评估。
2024-12-09 19:31:21
824
原创 深入理解AMBA之AXI ordering model和非对齐访问
AXI支持outstanding以及乱序操作,这里需要ID的支持,即编号,不同的应用场景我们可以授予ID不同的含义。比如根据ID怎么返回给对应的master(很多时候并不是一个master就对应唯一一个ID,不同的master使用同样的ID也是有可能的)。非对齐访问,通常情况下,对于32bit的传输,一般是要满足4bytes对齐,即访问地址的低两bit为00。强顺序(Strongly Ordered):在强顺序模式下,所有的读写操作都是按照程序中的顺序执行的,不会发生任何重排序或乱序执行。
2024-11-28 20:07:16
618
原创 SV中几个常见的问题
另外,always_comb会告诉综合工具,这里需要的是一个组合逻辑电路,假如我们设计时,if语句或者case语句没有写完整,在综合时,会报warning, 这里的语句被写成了latch。class中的成员默认是private的,这意味着他们不能在class外部被直接访问,需要通过class提供的方法来访问。4.随机化次数限制,如果设置了随机化尝试的最大次数(例如使用set_max_randomize_tries方法),并且在最大次数之前没找到满足所有约束条件的解决方案,randomize()会失败。
2024-11-27 19:05:04
959
原创 UVM验证之平台
m_sequencer不能访问用户自定义的seqr的属性,因为m_sequencer句柄的类型为当前seqr类型的父亲,访问用户自定义seqr类的对象中属性的方法只能通过具有该类型的句柄p_sequencer才行。简单来讲,phase机制中的9大phase是串行的,不同组件中的同一个phase是并行的,只有同样的phase执行完,才会执行下一个phase。真实值(actual value):寄存器模型在硬件中的实际值,在进行读取操作时,会从硬件中读取真实值,并与镜像值进行比较,以确保寄存器的状态是正确的。
2024-11-26 20:00:35
813
原创 SV中的@和wait
在Verilog中,当一个线程在一个事件上发生阻塞的同时,正好另一个线程触发了这个事件,则竞争的可能性便出现了。就像在打电话时一个人等待另一个人的呼叫,在Verilog中,一个线程总是要等待一个带@操作符的事件。这个操作符是边沿敏感的,所以它总是阻塞着,等待事件的变化。其他的线程可以通过一>操作符来触发事件,解除对第一个线程的阻塞。整体来说,wait()和@()都是等待()中的内容发生,当wait/@和 ->同时发生时,wait可以触发,而@会发生竞争,此时@有可能等到,也有可能等不到。
2024-11-25 20:07:10
1003
原创 DDR3流程解析
例如,可以使用循环生成多个随机对象,或者使用条件语句控制生成对象的属性值。求解过程会根据约束条件和生成的随机数,确定对象的属性值。对象赋值:一旦约束求解完成,生成的随机数就会映射到对象的属性上,从而生成具有随机属性的对象。综上所述,initial关键字用于定义初始值可变的变量,而final关键字用于定义常量或不可变的变量。方法的使用需要具备一定的理解和经验,以确保生成的测试数据符合设计规范,并具有良好的随机性。在SV中,initial和final是两个关键字,用于声明和定义变量的初始值和最终值。
2024-11-25 20:06:19
785
原创 SV 数组详解
简单的讲,例如bit[4:0][3:0][2:0][1:0]array,只在变量名左侧声明位宽的可以看成合并数组,而如果是左侧右侧都有维度的这种混合声明,如bit[2:0]array[3],就是非合并数组。对于遍历对foreach更好用,但是打印关联数组的时候,出来不一定按顺序,把里面的数据先放到一个数组里,可以用数组自带的sort()方法去对标号做一个排序,详细操作可以看下面。在需要等待数组发生变化的情况下,必须使用合并数组,比如用@等待某个标量或者合并数组变化,如果要对非合并用@操作,需要扩展,如下。
2024-11-14 20:38:44
1199
原创 function and task
function<返回值类型或位宽><函数名>;<输入参量与类型声明><局部变量声明>begin语句1;语句;...语句n;end函数定义是嵌入在关键字function和endfunction之间的,其中关键词function标志着一个函数定义结构的开端,endfunction标志着一个函数定义结构的结束。"<函数名>"是给被定义函数取的名称。这个函数名在函数定义结构内部还代表着一个内部变量,函数调用后的返回值是通过这个函数名变量传递给调用语句的。
2024-11-13 19:19:19
415
原创 验证平台常用的系统任务
根据参数值(0,1或2)的不同,输出不同的信息。$monitoron和$monitoroff任务的作用是通过打开和关闭监控标志来控制监控任务$monitor的启动和停止,这样使得程序员可以很容易的控制$monitor何时发生。用这两个时间系统函数可以得到当前的仿真时刻,不同的是,$time函数以64位整数值的形式返回仿真时间,而 $realtime函数则以实数型数据返回仿真时间。在$display中,输出列表中数据的显示宽度是自动按照输出格式进行调整的,总是用表达式的最大值所占的位数来显示表达式的当前值。
2024-11-11 20:42:29
590
原创 Systemverilog的随机和约束
同一个randc关键字定义的实例在执行随机化时是轮流值,每个元素是唯一的,但是必须是对同一变量多次随机时才会有这个性质,只有遍历所有值以后,才会出现相同的值。(2)可以直接把数组当成一个集合,然后使用inside进行约束,注意,如果数组中某个元素出现多次,求解中不影响元素出现的概率。通过结合随机特性和约束,我们可以创建出更具随机性和多样性的测试用例,以尽可能地覆盖设计的各种情况和边界条件。(2)动态数组:可以使用size()约束数组的大小,使用sum()约束数组的和,使用product()约束组的积。
2024-11-11 19:56:08
2293
原创 SPI通信协议
这样就实现了主机和从机一个字节的数据交换,SPI 的数据收发都是基于字节交换这个基本单元来实现的,当主机需要发送一个字节同时需要接受一个字节时,就可以执行一下字节交换的时序,这样主机要发送的数据跑到从机,主机要从从机接收的部分,跑到主机,这就完成发送同时接收的目的。MISO 的 0,会采样输入到主机这里的最低位,这就是第一个时钟结束后的现象。时钟继续运行,下一个上升沿,同样操作,移位输出,主机现在的最高位,也就是原始数据的最高位,输出到 MOSI,从机现在的最高位,输出到 MISO,变成主机的最低位…
2024-10-31 21:07:53
1180
原创 验证工程师如何使用UVM
要成为一个优秀的IC验证工程师,可以考虑以下几个方面的努力:学习基础知识:掌握数字电路设计和验证的基础知识,包括逻辑门、时序逻辑、寄存器传输级描述等。深入了解如何使用硬件描述语言(如Verilog或VHDL)进行设计和验证。学习验证方法学:学习常用的验证方法学,如模拟仿真、形式验证、断言、代码覆盖率等。了解和掌握常见的验证工具,如ModelSim、VCS等。实践项目经验:尽量参与实际的IC设计项目,积累实践经验。可以通过参与学校的项目或者自己进行一些小型的设计和验证练习来锻炼自己。
2024-10-31 20:04:37
691
原创 Systemverilog 的运算符优先级
表达式里面的运算符是有优先级的,不能想当然的按照从左到右的思维来进行运算和判断。运算符优先级问题通过加括号是完全可以避免的,但是实际中往往因为嫌麻烦或者嫌括号加太多影响代码可读写就省略掉。尤其在修改代码的时候,必须格外谨慎。比如上面第2个例子,本来if(a+b == c)不加括号是OK的,但是把+改成^的时候忽略了这一点,结果引入了bug。
2024-10-30 19:36:59
509
原创 AMBA之AXI 总线
AMBA(Advanced Microcontroller Bus Architecture)是ARM公司开发的一种高级微控制器总线架构,用于连接处理器、存储器和外设的通信。AMBA总线架构定义了一组协议和接口,用于实现高性能、低功耗、可扩展的系统设计。
2024-10-29 20:30:28
1315
原创 AMBA之AHB总线
1. AHB Lite是AHB协议的简化版本。AHB Lite本质上意味着只有一个Master。这反过来也意味着:1.1.无仲裁;1.2.无HBUSREQ信号,无HGRANT信号;1.4.无拆分或重试响应类型->HRESP只能是1位;5.不得提前终止总线。2. 如何将完整的AHB主设备连接到AHB Lite从设备:2.1.保持HBUSREQ打开;2.2.将HGRANT置“1”。
2024-10-27 10:17:13
1120
原创 uvm_info、uvm_warning,uvm_error、uvm_fatal
调试语句除了uvm_info,UVM内部根据问题的严重性(severity)由低到高,还引入了uvm_warning/uvm_error/uvm_fatal。这个plusargs不单能把UVM_ERROR变成UVM_INFO,反过来也可以把UVM_INFO变成UVM_ERROR,就看大家实际的需求了。默认情况下,uvm_info语句的严重程度就是UVM_INFO,uvm_error的严重程度就是UVM_ERROR,以此类推。它们也是UVM预定义的宏,格式跟umv_info很像,只是不再需要设定啰嗦程度了;
2024-10-26 18:54:40
1242
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人