当前位置: 首页 > news >正文

数字验证每日十问--(3)

  1. 深拷贝和浅拷贝的区别?

当只拷贝对象中的成员变量和声明的句柄时,称为浅拷贝。浅拷贝只把对象中的句柄复制了,却没有复制句柄b所指向的对象。这会导致复制后,a2中的句柄b 和 a1 中的句柄b指向同一个对象,如果a2中的句柄b修改了对象的内容,那么a1中的句柄 b 所指向的内容也会发生变化。

深拷贝会复制对象中的所有成员变量以及对象中嵌套的其他类的实例的内容。实现深拷贝,需要自己在类中定义copy方法,目的是为了在复制类中的套娃(对象里面另一个类的实例)时,产生一个新的句柄,并产生一个具有相同内容的对象。

可以将克隆clone理解为深拷贝,需要自己定义产生新对象的逻辑;

  2.类的public、protected和local的区别?

如果没有指明访问类型,那么成员的默认类型是public,子类和外部均可以访问成员。

如果指明了访问类型是protected,那么只有该类或者子类可以访问成员,而外部无法访问。

如果指明了访问类型是local,那么只有该类可以访问成员,子类和外部均无法访问。

  3.sequence机制的作用和优点?

sequence机制主要是用于控制和产生激励,并将产生的一系列transcation发送给driver。

其优点在于: 将激励的产生功能从driver中剥离出来,同时也将testcase和testbench分离开来, 在不同的testcase中,可以将不同的sequence配置成sequencer的main_phase中的default_sequence,当sequencer执行到main_phase时,就会启动sequence, 在不改变driver的情况下完成不同的激励驱动。

    4.Sequence的分类?

a.扁平类(flat sequence):这一类往往只用来组织更细小的粒度,即item实例构成的组织。

b.层次类( hierarchical sequence):这一类是由更高层的sequence用来组织底层的sequence,进而让这些sequence或者按照顺序方式,或者按照并行方式,挂载到同一个sequencer上。

          c.虚拟类(virtual sequence):这一类则是最终控制整个测试场景的方式,鉴于整个环境中              往往存在不同种类的sequencer和其对应的sequence,我们需要一个虚拟的sequence来协            调顶层的测试场景。之所以称这个方式为virtual sequence,是因为该序列本身并不会固定              挂载于某一种sequencer类型上,而是将其内部不同类型sequence最终挂载到不同的目标              sequencer上面。这也是virtual sequence不同于hierarchical sequence的最大一点。

     5.如何在driver中使用interface?

interface声明的是一个实际的物理接口;

dirver中使用virtual interface进行申明接口,然后通过config_db进行接口参数传递,这样我们可以从上层组件获得虚拟的interface接口进行处理。

Config_db传递时只能传递virtual接口,即interface的句柄,否则传递的是一个实际的物理接口

     6.field_automation机制?

可以自动实现copy、compare、print等函数。当使用uvm_field系列相关宏注册之后,可以直接调用以上三个函数,而无需自己定义。这极大的简化了验证平台的搭建,尤其是简化了driver和monitor,提高了效率。

      7.UVM中各个component之间是如何组织运行的,串行还是并行,通过什么机制进行调度的?

搭建的uvm验证环境是自顶向下的树形结构;UVM中运行是通过Phase机制进行层次化仿真的。从组件来看各个组件并行运行,从phase上看是串行运行,有层次化的。Phase机制的9个phase是串行运行的,不同组件中的同一个phase都运行完毕后才能进入下一个phase运行,同一个phase在不同组件中的运行也是由一定顺序的,,build 和 final是自顶向下。

      8.所搭建的验证平台为什么要用RAL(寄存器)?

        首先,寄存器对设计非常重要,其是模块间交互的窗口,我们可以通过读寄存器值去观察模            块的运行状态,通过写寄存器去控制模块的配置和功能改变

保证寄存器的读写正确才能保证dut设计的正确性;采用RAL寄存器模型去测试验证,寄存器模型独立于TB之外,我们可以搭建一个测试寄存器的agent,去通过前门或者后门访问去控制DUT的寄存器,使得 DUT按照我们的要求去运行;

      9.前门访问和后门访问的区别?

a.前门访问顾指的是在寄存器模型上做的读写操作,最终会通过总线UVC来实现总线上的物理时序访问,因此是真实的物理操作。

b.后门访问,指的是利用UVM DPI (uvm_hdl_read()、uvm_hdl_deposit()),将寄存器的操作直接作用到DUT内的寄存器变量,而不通过物理总线访问。前门访问在使用时需要将path设置为UVM_FRONTDOOR

在进行后门访问时,用户首先需要确保寄存器模型在建立时,是否将各个寄存器映射到了DUT一侧的HDL路径:使用add_hdl_path

    从上面的差别可以看出,后门访问较前门访问更便捷更快一些,但如果单纯依赖后门访问也不能称之为“正道”。实际上,利用寄存器模型的前门访问和后门访问混合方式,对寄存器验证的完备性更有帮助。

      10.前门访问和后门访问的方法?

前门访问:

第一种uvm_reg::read()/write(),在传递时,用户需要将参数path指定为UVM_FRONTDOOR。除了status和value两个参数需要传入,其他参数可采用默认值.

寄存器模型提供的方法

//reg_model寄存器模型实例名,reg寄存器实例名

reg_model.reg.write(status, value, UVM_FRONTDOOR, .parent(this));

reg_model.reg.read(status, value, UVM_FRONTDOOR, .parent(this));

第二种uvm_reg_sequence::read_reg()/write_reg(),在使用时,也要将path指定为UVM_FRONTDOOR,uvm_reg_sequence预定义方法

read_reg(rgm.ss, status, data, UVM_FRONTDOOR);

write_reg(rgm.ss, status, data, UVM_FRONTDOOR);

后门访问

确保寄存器模型在建立时将各个寄存器映射到DUT一侧的HDL路径

add_hdl_path("reg_backdoor_access.dut");

chnl0_ctrl_reg.add_hdl_path_slice($sformatf("regs[%0d]", `SLVO_RW_REG), 0, 32);

lock_model();

通过uvm_reg_block::add_hdl_path()将寄存器模型关联到DUT一端

通过uvm_reg::add_hdl_path_slice完成将寄存器模型各个寄存器成员与HDL一侧的地址映射

lock_model()函数结尾,结束地址映射关系,保证模型不会被其他用户修改

          寄存器模型完成HDL路径映射后,利用uvm_reg或uvm_reg_sequence自带的方法进行后门             访问

uvm_reg::read()/write(),在调用该方法时设置UVM_BACKDOOR的访问方式。uvm_reg_sequence::read_reg()/write_reg(),在调用该方法时设置UVM_BACKDOOR的访问方式。uvm_reg::peek()/poke()两个方法,分别对应了读取寄存器(peek)和修改寄存(poke)两种操作,本身只针对后门访问,所以无需设置UVM_BACKDOOR。

寄存器模型提供的方法read()/write()

rgm.ctrl.read(status,data,UVM_BACKDOOR,.parent(this));       

rgm.ctrl.write(status,'h11,UVM_BACKDOOR,.parent(this));

uvm_reg_sequence预定义方法read_reg()/write_reg()

read_reg(rgm.ss,status,data,UVM_FRONTDOOR);

write_reg(rgm.ss,status,'h22,UVM_FRONTDOOR);

寄存器模型提供的方法peek()/poke()

rgm.ctrl.peek(status,data,.parent(this));   

rgm.ctrl.poke(status,'h22,.parent(this));

http://www.lryc.cn/news/426457.html

相关文章:

  • 22.给定 n 对括号,实现一个算法生成所有可能的正确匹配的括号组合
  • 检测到目标URL存在http host头攻击漏洞
  • C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧
  • 018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用
  • xlnt在Windows中的dll,lib生成
  • 【网络】私有IP和公网IP的转换——NAT技术
  • java 面试 PDF 资料整理
  • 初步认识Linux系统
  • JavaScript AI 编程助手
  • 达梦数据库的系统视图v$datafile
  • Triton/window安装: triton-2.0.0-cp310-cp310-win_amd64.whl文件
  • 应急响应-DDOS-典型案例
  • JAVA学习之知识补充(下)
  • qt生成一幅纯马赛克图像
  • python循环——九九乘法表(更加轻松的理解循环结构)
  • UDS诊断系列之十八故障码的状态掩码
  • 【jvm】直接引用
  • PythonStudio 控件使用常用方式(二十七)TActionList
  • PDF 转Word 开源库
  • Docker - 深入理解Dockerfile中的 RUN, CMD 和 ENTRYPOINT
  • Python 函数式编程 内置高阶函数及周边【进阶篇 3】推荐
  • 【Rust光年纪】探秘Rust GUI库:从安装配置到API概览
  • Element plus部分组件样式覆盖记录
  • 重塑业务生态,Vatee万腾平台:引领行业变革的新引擎
  • 标准术语和定义中的【架构】应该如何描述
  • 华为鸿蒙Core Vision Kit 骨骼检测技术
  • Table API SQL系统(内置)函数System (Built-in) Function详解
  • 一键运行RocketMQ5.3和Dashboard
  • HAL STM32 SG90舵机驱动控制
  • 【Kubernetes】k8s集群图形化管理工具之rancher