首页 > 其他分享 >IC验证面试经验分享——UVM篇

IC验证面试经验分享——UVM篇

时间:2024-08-18 21:22:37浏览次数:6  
标签:do sequence 面试 UVM sequencer phase IC uvm

验证最需要会的技能树是什么?!那肯定是非UVM莫属了,趁着校招之际,准备IC面试的ICer赶快码住!

IC验证面试经验分享


UVM篇

UVM是一个库,在这个库中,几乎所有的东西都是使用类(class)来实现的,当要实现一个功能时,首先应该想到的是从UVM的某个类派生出一个新的类,在这个新的类中实现所期望的功能。所以,使用UVM的第一条原则是:验证平台中所有的组件应该派生自UVM中的类。———摘自《UVM实战》白皮书

UVM是基于SV语言开发的框架,这个是验证er的常识哦。


一、UVM验证平台组件

  1. driver: 给dut添加各种激励,激励的实现就是通过driver;
  2. scoreboard: 根据DUT的输出来判断DUT的行为是否与预期相符合,也被称为checker;
  3. monitor:收集接口信号并转换为事务转送给scb和refm;
  4. reference model: 模拟dut的行为得到参考输出作为scb的评判标准。

此外,uvm中还引入了agent,sequencer的概念。

  • agent:封装容器;
  • sequencer:连接管道,串联driver和sequence,组织并管理sequence。
    在这里插入图片描述

二、UVM_component和uvm_object

在这里插入图片描述
根据白皮书,uvm_component其实是继承自uvm_object,但是学过面向对象的都知道面向对象的三大特性之一就是多态,那么子类可能拥有一些父类没有的特性。uvm_component有两大特性是uvm_object所没有的:

  • 一是通过在new的时候指定parent参数来形成一种树形的组织结构;
  • 二是有phase的自动执行特点。
    在这里插入图片描述

三、sequence启动方式

  • 直接用my_seq.start(sequencer);
    在这里插入图片描述
  • 通过default sequence启动,有两种方式
    • 通过wrapper,直接调用start
      在这里插入图片描述
    • 先实例化要启动的sequence,之后再通过default_sequence启动
      在这里插入图片描述
      所以从上面也可以看到,uvm_config_db机制将sequence送到agen.sqr的main_phase中

四、seqence是怎么给到dut的?

这里先说sequence和sequencer的区别?

  • 按照白皮书的比喻不难理解,sqr是弹夹,sequence是子弹
    • 只有在sequencer的帮助下,sequence产生出的transaction才能最终送给driver;同样,sequencer只有在sequence出现的情况下才能体现其价值,如果没有sequence,sequencer就几乎没有任何作用。sequence就像是一个弹夹,里面的子弹是transaction,而sequencer是一把枪。——摘自《UVM实战卷I》白皮书

因此,从sqr中获取transaction,按照dut的行为模块驱动transaction至interface,返回响应到sqr,再转给seq。

五、p_sequencer和m_sequencer的区别

1)含义

  • m_sequencer 是一个定义在用户构建的 sequence/sequence_item 基类里的 sequencer 基类句柄,通过这种方式,建立起 sequence - sequencer 之间的连接,使 sequence 有通过 m_sequencer 句柄来访问 sequencer 变量的能力。
  • p_sequencer 是一个 uvm_sequencer 类型 (通常情况) 的句柄,由用户在调用宏 `uvm_declare_p_sequencer(SEQUENCER) 时指定。

2)区别

  • m_sequencer 的局限性:m_sequencer 的存在建立了 sequencer-sequence 之间的桥梁,但是由于 m_sequencer 句柄类型相较于实际用户构建的 sequencer 来说都是基于更底层的 uvm_sequencer_base 类型。虽然可以保证 m_sequencer 句柄可以指向用户构建的 sequencer,但是 m_sequencer 能访问到的变量和方法仍具有局限性 (基类句柄指向扩展类对象,但只能访问扩展类中属于基类的变量和方法)。
  • p_sequencer的引入 :基于以上问题,需要引入一个类型与用户构建的 sequencer 一致的扩展类句柄 p_sequencer,通过动态类型转化,让 p_sequencer 与 m_sequencer 都指向用户构建的 sequencer 对象,并且由于 p_sequencer 是扩展类类型的句柄,可以通过 p_sequencer 句柄,在 sequence 中访问到属于 sequencer 的内容。最终 m_sequencer 与 p_sequencer 指向对象都为用户构建的 sequencer,只是可访问的范围不一致

六、UVM_do系列宏

1)uvm_do和uvm_do_on的区别

uvm_do_on系列用于显式地指定使用哪个sequencer发送此transaction,第一个参数是transaction的指针,第二个参数是sequencer的指针。

2)系列宏的含义

	//uvm_do
	uvm_do(seq or item)
	uvm_do_pri(seq or item,优先级数)一般默认的tr优先级是-1,所以数一般要更大  	uvm_do_with(seq or item, 约束)
	uvm_do_pri_with(seq or item, 优先级数,约束)

	//uvm_do_on
	uvm_do_on(seq or item,seqr)
	uvm_do_on_pri(seq or item,seqr,优先级)
	uvm_do_on_with(seq or item,seqr,约束)
	uvm_do_on_pri_with(seq or item,seqr,优先级,约束)

七、UVM phase机制

首先,uvm中分为两类phase,这些phase自上而下执行:

  • function phase不消耗仿真时间,
  • task phase消耗仿真时间(下图灰色部分);
    在这里插入图片描述

1)运行情况

function phase

对于function phase来说,,在同一时间只有一个phase在执行

task phase

但是task phase中,run_phase和pre_reset_phase等12个小的phase并行运行,称为动态运行;4个核心phase,这四个phase通常模拟DUT的正常工作方式:

  • reset_phase:对DUT进行复位、初始化等操作;
  • configure_phase:进行DUT的配置;
  • main_phase:完成DUT的运行;
  • shutdown_phase:做一些与DUT断电相关的操作。

2)main_phase和run_phase之间关系

包含关系,run_phase中包含main_phase,run_phase和main_phase都是task phase,是并行运行的。

3)执行顺序

Build phase 自顶向下(因为要实例化,比如driver是agent的成员变量,必须先实例化agent才有driver,否则就报错),其他function phase 自底向上,task phase自顶向下,同时运行(类似run_phase、main_phase等task_phase也都是按照自下而上的顺序执行的)

此外,对于component来说,12个run-time的phase是顺序执行的,但是它们也仅仅是顺序执行,并不是说前面一个phase执行完就立即执行后一个phase。一般是等所有component的同一个phase执行完才会执行下一个phase,所以对于component来说会存在空白等待的时间,但是对于整个验证平台来说,是没有空白时间,是连续完成的
在这里插入图片描述

八、objection机制

UVM通过objection机制来控制验证平台的关闭

  • 在每个phase中,UVM会检查是否有objection被提起(raise_objection),如果有,那么等待这个objection被撤销(drop_objection)后停止仿真,如果没有则马上结束当前phase。
  • raise_objection和drop_objection要成双成对出现。raise_objection必须放在main_phase第一个消耗仿真时间的语句之前。
  • 在UVM中,objection一般伴随着sequence,通常只在sequence出现的地方raise_objection和drop_objection,sequence产生transaction,产生tr发送完毕后就可以结束仿真了。

如果想执行一些耗费时间的代码,就要在此phase下的任意一个component中至少提起一次objection。值得一提的是,如果12个动态phase有objection提起,那么run_phase根本不需要raise_objection就可以自动执行。反过来则不行。

九、UVM factory机制

factory的重载是一大特点:将父类的函数/任务定义为virtual,虚函数可以重载,重载的最大优势是使得一个子类的指针以父类的类型传递时,其表现出的行为依然是子类的行为。

1)super关键字

super关键字,父类成员被重载,那么再访问就必须用super。

super.new()

  • 在new中使用super,super.new是执行的第一条语句。
  • 在uvm中,super.new()是一个特殊的构造函数,它用于在子类构造函数中调用父类的构造函数,这是因为在uvm中,一般情况下他们都是继承来扩展已有的类,当我们在子类中创建对象时,需要先调用父类的构造函数,以初始化父类的成员变量和方法
  • 因此,super.new()的作用就是确保在子类构造函数中先调用父类的构造函数,以便完成父类的初始化工作,需要注意的时,super.new()必须放在子类构造函数的第一行,否则会出现编译错误。
  • 此外,如果父类的构造函数需要参数,也需要传递参数的

super.phase()

  • super.phase其实就是继承在uvm_compoent中已经定义好的变量/方法,建议有的可以写有的可不写,但是个人建议写上去,以免后续uvm库有更新,自己还要更改代码风格。

2)使用factory机制的重载的前提

  1. 第一,无论是重载的类(parrot)还是被重载的类(bird),都要在定义时注册到factory机制中。
  2. 第二,被重载的类(bird)在实例化时,要使用factory机制式的实例化方式(create创建对象),而不能使用传统的new方式。
  3. 第三,最重要的是,重载的类(parrot)要与被重载的类(bird)有派生关系。重载的类必须派生自被重载的类,被重载的类必须是重载类的父类。
  4. 第四,component与object之间互相不能重载。虽然uvm_component是派生自uvm_object,但是这两者的血缘关系太远了,远到根本不能重载。从两者的new参数的函数就可以看出来,二者互相重载时,多出来的一个parent参数会使factory机制无所适从。

总结

以上就是面试过程中被问的比较多的一些问题,也算是IC验证的必背八股文了吧,创作不易,都是博主精心整理的笔记,如有问题或者错误欢迎大家指正,一起学习!

标签:do,sequence,面试,UVM,sequencer,phase,IC,uvm
From: https://blog.csdn.net/m0_62972188/article/details/141304397

相关文章

  • IC验证面试经验分享——Verilog篇
    面试官(高冷脸):说说离职原因?(内心os:看看你小子是不是也被裁了还是初生牛犊不知道当今环境的恶劣在这玩裸辞)我(已读乱回):如果可以,我想和它回到那天相遇,让时间停止那场面试,红线划过拒绝offer的按钮,我用尽全力。–改自歌曲《如果可以》(内心os:挥手错的才能和对的相拥)IC验证......
  • HTTP Error 503. The service is unavailable.
    第一次遇见这个问题,装了IIS重写模块导致的。查了资料才知道,是URLRewrite的版本和2012系统的lIS不兼容导致。最新的URLRewrite的版本是2018年9月20日的7.1.1993.2351版,就是这个版本产生问题,不能用在2012上,在它前面的一个版本是2017年6月7日的7.1.1980.0版,这个......
  • AIGC时代算法工程师的面试秘籍(第二十式2024.8.5-8.18) |【三年面试五年模拟】
    写在前面【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法,力求让读者在获得心仪offer的同时,增强技术基本面。也欢迎大家提出宝贵的优化建议,一起交流学习......
  • (nice!!!)LeetCode 552. 学生出勤记录 II(动态规划dp递归版、记忆化dfs)
    题目:552.学生出勤记录II思路:记忆化搜索dfs,细节看注释classSolution{public:constintmod=1e9+7;//状态f[u][a][b]表示:在选择第u个位置前,缺勤次数为a次,且当前连续迟到次数为b次时,可以得到的合法出勤次数intf[100010][5][5];intdfs(intu,int......
  • Android usb广播 ACTION_USB_DEVICE_ATTACHED流程源码分析
    整体流程图大概意思就是UsbHostManager启动监控线程,monitorUsbHostBus会调用usb_host_run函数(使用inotify来监听USB设备的插拔)不停的读取bus总线,读取到以后,当1、设备插入:发送广播ACTION_USB_DEVICE_ATTACHED2、设备拔出:发送广播ACTION_USB_DEVICE_DETACHED本篇只分析插入......
  • LuckyPico 启动速度优化 一 (Linux 启动速度优化 )
    内核压缩方式速度优化Linux内核启动一般采用自解压的方式,在编译的时候压缩,而Linux启动时对内核固件进行自动解压。因此,在这一方面,影响内核启动速度的分为两个部分,一个是内核固件的读取时间,另一个是内核解压的时间压缩算法越复杂,则内核固件尺寸越小,内核解压时间越长压缩算法越......
  • 最佳实践:在AvaloniaChat中接入SiliconCloud
    AvaloniaChat介绍AvaloniaChat是一个基于大语言模型用于翻译的简单应用。在看英文文献的过程中,比较喜欢对照着翻译看,因此希望一边是英文一边是中文,虽然某些软件已经自带了翻译功能,但还是喜欢大语言模型的翻译,但每次都要将英文复制粘贴过去还要自己手动添加prompt,还无法对照......
  • 【工具速通】Github+PicGo+VSCode编辑md文档并将插图同步图床教程
    1.配置Github1.1创建新仓库设置为public,否则无法正常访问勾选addareadmefile1.2生成token在个人主页setting里找到developersettings用于picGo访问beta是用不上的,classic就够了填写完note,修改expiration(默认30d,作者改成了无限期)勾选repo......
  • CORDIC算法解释及FPGA实现(圆坐标系)
    CORDIC算法原理阐述CORDIC(CoordinateRotationDigitalComputer)算法,即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。伪旋转在笛卡尔坐标平面(下方左图)由\(({x_1},{y_1})\)旋转θ角度至\(({x_2},{y_2})\)得到:\(({\hat......
  • 2024年图像配准最新算法EfficientLoFTR(cvpr2024) 【补丁For 双鱼眼全景视频拼接】
    前言对于双鱼眼全景拼接这个项目来说,单应性矩阵是最重要的一环。单应性矩阵中它既包含了相机的内参,也包含了相机的外参。因此就算你的相机没有特别好的定位,也能通过好的单应性矩阵救回来。2024最新DNN配准算法在双鱼眼相机拼接中,特征点检测与匹配是影响单应性矩阵最......