自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 UVM基础-Sequence仲裁机制

第三个参数就是sequence的权重。使用`uvm_do_pri或者`uvm_do_on_pri这种带有pri关键字的宏,可以对sequence设定优先级,具备设定优先级功能的宏一共有四个,分别是:`uvm_do_pri,`uvm_do_pri_with,`uvm_do_on_pri,`uvm_do_on_pro_with。经过设定,sequence的发送会优先发送cfg_sequence,因为cfg_sequence的优先级更高,发送完cfg_sequence之后,在发送sano_sequence。

2023-12-24 17:49:48 1071

原创 Linux-Shell技巧-参数化alias

芯片验证之效率提升-shell脚本

2023-08-26 19:26:25 1059

原创 UVM基础-Factory机制

回顾整个过程,总结起来就是:factory机制进行实例化的过程,会先对component进行注册,即调用f.registory,然后查询是否有重载记录,即调用find_override_by_type,如果有重载记录,则返回重载后的类,最后调用registory中的create_component函数,这个函数最终会调用重载后的类的构造函数new,如果没有重载记录,则调用当前实例化组件的构造函数(new)。这个函数有三个参数,第一个为被重载的类,第二个为重载的类,第三个为是否可以被后面的重载覆盖。

2023-06-10 17:12:18 1826

原创 UVM基础-sequence library

也就是说这个功能为:只在sequence序号为0,1,3的sequence中随机选取一个发送。配置sequence_library的三个参数:select_mode,min_sequence_count,max_sequence_count的方式,可以通过在tc中利用config_db的方式传递值,也可以通过uvm_sequence_library_cfg的方式,在new函数中直接传递值,然后利用uvm_config_db将cfg传递给default_sequence.config,实现这三个参数的控制。

2023-06-04 22:50:02 798

原创 UVM基础-sequence的响应机制

sequence在发送完tr之后,想要得到driver反馈的响应然后再决定后面transaction的发送,那么就需要是同get_response函数来获取driver的响应,而driver在get_next_item获得一个transaction后,对其进行解包驱动,如果想要给sequence传递一个响应,那么只需要put_response,这样rsp经过sequencer仲裁之后,发送给sequence,从而实现sequence和driver之间响应的交互。例如有如下sequence代码:这个se

2023-06-04 22:47:18 1614

原创 UVM基础-sequence系列宏

为什么cast会为0?使用重载pre_do,mid_do,和post_do的方法只会把简单的方式复杂化。事实上,这几个宏的底层都是`uvm_rand_send_pri_with,其他宏在其基础上做了参数固化,对于`uvm_rand_send_pri_with的源码分析,逻辑和其他的宏一样,只不过这个宏除了调用start_item和finish_item之外,还需要调用get_sequencer来获取sequencer,因此,这一系列宏需要和uvm_create系列宏配合使用。用的比较少,不过多讨论。

2023-06-04 22:41:31 3221 2

原创 UVM基础-Callback机制

一般情况下,每个工程师都有对同一个基线环境的修改需求,以适配自身的验证任务,那么环境的原始开发者,就应该考虑到环境的使用者有这样的差异性。集成验证方案的定制依赖系统或者集成dut的模块配合与耦合度,在一定程度上,集成验证的思路和SOC集成开发实际上是一样的,SOC的集成要考虑模块之间的互联,通信交互,数据流,总线等方案的设计,那么集成验证要考虑的实际上是对于每个单元验证环境的交互,单元验证环境组件之间的交互,工作量在于对各级单元验证环境之间通信机制的方案输出,以及数据流处理过程中对于数据包结构的适配。

2023-05-28 19:05:20 2012 4

原创 UVM基础-Phase机制(三)

这个功能多用于DUT之间相互解耦,模块与模块之间无强依赖关系,但是这种场景下,一般会分两个模块分别做单元验证,而不是用一套环境,通过domain的方式将两者拼接起来,从而增加整体调试的工作量。set_domain有两个参数,一个是uvm_domain类型的变量,也就是当前加入的domain变量名,另一个是hierarchy,表示是否递归加入新domain,也就是说,如果配置了第二个参数为1,uvm会将当前组件层级下,所有的节点一直到数根节点,全部加入到声明的新domain中。参考资料:《UVM实战》

2023-05-28 19:01:58 282

原创 UVM基础-Phase机制(二)

也就是说,如果其他组件有参与到投票机制中,个别组件没有参与投票,但是会在当前phase中做一些内容或者动作,那么uvm只会考虑参与投票的phase是否全部同意该phase结束,如果都执行了drop_objection,那么就会结束该phase的运行,并不会考虑为参与投票的phase结果,如果未参与投票组件的phase运行完成,那么就是正常完成,如果未参与投票的组件phase未完成,(一般的,会在这样的组件phase中写while 1循环),那么uvm也不会管他,直接结束该phase的运行。

2023-05-28 18:59:57 1338 2

原创 UVM基础-Phase机制(一)

那么对于不同component之间的执行顺序是什么样的,想象一下,uvm在运行过程,需要先建立uvm树形结构,对于function phase而言,承载的任务有建立树形结构和连接组件关系的作用,因此,function phase无非只有自顶向下建立树形结构,和自底向上连接树的节点,因此,对于build_phase而言,执行规则是自顶向下的运行,也就是说先执行顶层的build_phase,例如test_case0的build_phase,再执行env的build_phase,自顶向下建立树形结构。

2023-05-28 18:55:14 2889

原创 UVM基础-UVM之debug和打印

使用方法:component.set_report_severity_id_override(source, “id”, target),component支持路径调用,例如在base_test中将driver内ID为“my_drv”的UVM_INFO改为UVM_WARNING,可以在base_test的connect_phase中调用:env.i_agt.drv.set_report_severity_id_override(UVM_INFO, “my_drv”, UVM_WARNING)。

2023-05-24 21:24:03 5447

原创 UVM基础-Seq-Sqr-Driver交互详解

看到这里,源码的分析部分总是晦涩难懂,我们将sequence的仲裁机制排除掉,同时也将lock机制,grab等机制均排除掉,仅从整个过程中调用的函数阻塞和释放来看待这个过程。从sequence的角度看:我们只看body任务中的核心逻辑,也就是uvm_do系列宏的分解,即start_item的执行和finish_item的执行:那么阻塞释放关系是什么呢?

2023-05-14 10:58:57 1871 3

原创 UVM基础-TLM机制之analysis端口与FIFO

其他特性,与常规的port,export,imp类似,一个uvm_analysis_port与uvm_analysis_export连接会报错,终点必须是uvm_analysis_imp,uvm_analysis_port,uvm_analysis_export,uvm_analysis_imp都是参数化类,且参数与常规的port,export,imp一致。可以看到,FIFO new函数的第三个参数,实际上是FIFO的大小,默认大小为1,当size值设为0时,FIFO深度定义为无限大。

2023-05-11 21:46:20 3313

原创 UVM基础-TLM机制跨层次连接

如图3.3.4.2所示,组件B被例化到了组件C中,与外部组件A互联,而组件C和组件A被例化到了TOP中,想要实现组件A和组件B之间的通信,需要通过组件C的export端口,此时例化在组件C中的组件B和C之间互联就出现export和export之间的连接关系,通过代码说明:用transport类型端口举例说明。其实也可以直接在TOP跨层次直接将组件A的port与组件B的export相连,此时就无需通过组件C的port,代码较为简单,不在赘述。图3.3.4.1 port与port连接场景。

2023-05-11 21:41:16 292

原创 UVM基础-TLM机制之端口通信

其实在uvm底层源码逻辑中可以发现,在连接的过程中,高优先级的端口的connect函数,参数是低优先级端口的句柄,而作为与组件通信窗口的imp而言,会将实例化imp的组件的句柄,作为申明imp的参数进行传递,以blocking put类型的port为例,在传输数据包transaction时,在动作发起者组件中调用port.put函数,实际上是调用的被动接受者组件内部的put函数,那么这是为什么呢?答案是肯定的,确实可以通过省略一个port或者export,实现两个组件的通信。

2023-05-11 21:36:45 550

原创 UVM基础-TLM机制底层逻辑和用法

在表2.1中可以看到,除了put,get,transport操作之外,TLM还提供了peek操作和get结合peek类型的端口,peek操作实际上和get操作是类似的,唯一的差别在于,peek操作下,假设动作发起者A想要从组件B中拿数据包,peek操作会使B在回传数据包的同时,在自己本地再备份一个相同的数据包,以便自身使用或者发生异常的回传,实际上为组件之间的通信增加了一种容错机制,get peek类型的端口,则说明这种端口兼具get操作和peek操作。

2023-05-11 21:30:53 649

原创 UVM基础-m_sequencer和p_sequencer

在UVM的sequence机制中,sequence其实是独立与验证环境之外的部件,作为uvm_object而存在,那么sequence最终是要在某个sequencer上启动的,那么启动的方式有两种:tar_seq.start(env.i_agt.tar_sqr)config_db #(uvm_object_wrap)::set(this, “env.i_agt.sqr.main_phase”, “default_sequence”, tar_seq) 此时sequence会自动调用其pre_bo

2023-05-10 00:02:41 3242

原创 UVM基础-config_db的高级应用

组件之间点对点的寄信和收信,是config_db最基础的用法,而在真正实战的过程中,一般要多层次之间相互寄信和收信,甚至一个组件在不同时刻对同一个组件的一个变量要寄不同值的信。或者说不同的组件要给同一个组件传输变量等。

2023-05-08 23:17:17 437 1

原创 UVM基础-config_db的用法

一般的,在构建验证环境时,都会建立一层harness,作为testbench的顶层,内部包含了待测DUT,interface和一些check模块,以及运行整个UVM环境的run_test()函数。那么UVM的环境组件driver是如何得到这一组interface的,UVM提供了用于组件之间的变量交互机制-config_db机制。

2023-05-08 23:14:18 1159 1

原创 SystemVerilog-$cast详解

为什么这里可以写,因为在实际调用的时候,是两个子类之间的复制,通过调用子类的copy函数,copy函数的参数传递的是子类的句柄,在函数传参的过程中,也就将形式参数父类的句柄指向了实参子类的对象,因此可以cast。这样的化,通过父类的cast,其实就是子类的对象,同样的父类也不能访问子类本身的成员变量,父类改变自身的成员变量,子类调用自己父类的成员变量时也会发生改变。且经过cast后,等同于赋值操作,即父类的句柄指向子类的对象,且只能访问子类对象的继承类的成员变量。3. 两个不同的子类之间的cast。

2023-05-07 10:16:31 2846 1

原创 SystemVerilog-继承类的复制

多态赋予了类更多的变化和可能性,类变量中用virtual修饰的函数或任务,在子类中可以进行改写,改写过后,通过子类赋值给父类的这种操作,父类再调用virtual修饰的函数时,其实是调用的子类的函数。但是反过来操作,是不可以的,并且在指向的过程中,父类的句柄仍然无法访问子类的属性,父类和子类之间的赋值操作如下图所示代码块。父类与子类之间的复制操作,同样可以通过new函数实现浅拷贝,值得注意的是,复制规则也只能由子类的句柄复制给父类,也就是父类的句柄只能指向子类的对象,反过来是不行的,实现规则同样为浅拷贝。

2023-05-07 10:11:58 289

原创 SystemVerilog-类的复制

实际上,这种方式在UVM里有一处用到了,就是在uvm_object基类中定义的clone()函数,实现对于继承自uvm_object的类,比如uvm_sequence,uvm_transaction等非组件类型的类的复制,此时被复制的类无需实例化,因为在clone函数里,会将被复制的类实例化好,并把指针返回。浅拷贝的含义,上述代码块中其实没有很好的体现,浅拷贝的核心点是:拷贝的对象只会拷贝最高层次的类,也就是说会新开辟一块内存,复制最顶层的类,而深层次的类不会进行拷贝。如果改变深层次类的属性呢?

2023-05-05 21:12:15 713 1

原创 SystemVerilog基本功-类和$cast

如果真正要用这个类,访问类中的成员a,则还需要将其实例化,如下图代码块,也就是调用其构造函数new(),这个函数调用会返回一个指向具体内存空间的句柄,也就是说,调用过这个函数过后,example_cls句柄会真正指向一块存储空间,这块空间里有类的成员变量a。这个函数在对类进行操作时,只做句柄的强制类型转换,也就是句柄的赋值操作,因此在使用时,只需要将B用构造函数实例化出来,而A不需要实例化,因为$cast会将句柄A指向B的内存空间。也就是将B转换为A,使用A。

2023-05-05 21:07:38 297 1

原创 静态时序分析之-特殊设计约束

此时T变为周期的一半,即为T/2,因此对于setup十分不友好,相当于倍频。而lunch用反沿驱动数据,capture用正沿采样数据,同理对于setup只有半个周期的require时间,相当于提频。前端有些设计在某些路径上采用了正沿lunch,反沿capture的设计;或者是反沿lunch,正沿capture的设计,只要懂了STA的底层逻辑,这类问题分析一般都较为容易。对于Hold来讲多了T/2的余量,因此这类设计对hold友好,同理,反沿lunch正沿capture分析一样。

2023-04-26 21:38:19 144 1

原创 静态时序分析-Multicycle约束

如果不设置hold检查,当沿的hold会在capture沿提前一个cycle做,因此如图3.2.1.3所示蓝色线为hold检查沿,此时可以发现,multicycle路径下,capture沿的前一个有效沿可放过setup/hold检查。有时,前端在一些关键路径上的设计,可能会出现两个时钟周期驱动和采样一拍数据,来放松关键路径上的时序,这样的设计在STA约束过程中,如果不放松,会导致Timing违例过大,无法收敛,此时的Timing由前端逻辑实现保证,STA约束即可释放,以达到STA出口。

2023-04-26 21:31:45 1487 1

原创 静态时序分析之-IO约束

Output方向上,随路场景,板级走线要尽量做平,T1-T2趋于0,此时路径延时在Output方向最小,有利于Capture Reg收Setup;回环场景,板级走线要尽量做短,T1+T2最小,有利于减少Output Delay,帮助收敛Capture的Setup。因为T1和T2的取值一般是一个范围,因此Output Delay存在最大值和最小值,最大值用来约束setup最严的场景,最小值用来约束hold最严的场景。

2023-04-26 20:32:09 695 1

原创 STA(静态时序分析)的底层逻辑

建立时间与保持时间理解时序路径,首先要理解寄存器的建立时间和保持时间,一个边沿触发的寄存器为什么要有建立时间和保持时间,因为边沿触发的寄存器在时钟有效沿到来时,依据自身的采样能力和驱动能力,要求输入到D端的信号要尽可能保持稳定,如果输入到D的信号不稳定,则会造成信号的错误采样,导致该寄存器输出到Q的信号形成不定态,因此衍生出建立时间和保持时间的概念。在时钟有效采样沿到来之前,输入到寄存器D端的信号应该要保持稳定的时间;在时钟有效采样沿之后,输入到寄存器D的信号应该要保持稳定的时间。

2023-04-22 18:06:17 1240 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除