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

验证面试常见问题系列

一,uvm中testbench.v里都做了什么?

在 UVM (Universal Verification Methodology) 中,testbench.v 是测试平台的主要文件之一,其中会进行以下操作:

  1. 导入必要的 UVM 类库和其他需要的库文件。
  2. 定义和实例化各个组件和对象,包括 UVM 环境、UVM 测试用例、DUT (Design Under Test) 和其他相关组件。
  3. 设定仿真时钟,包括时钟源和时钟周期。
  4. 配置各个组件的连接关系和数据通路,通常使用 UVM 扫描器(uvm_config_db)来配置。
  5. 创建和启动 UVM 进程,例如 UVM 进程对象(UVM process)和 monitor 进程。
  6. 运行测试用例,调用 UVM test 的 run_test() 方法来开始测试过程。
  7. 处理仿真结束后的清理工作,例如打印测试报告、关闭仿真等。

testbench.v 文件是整个 UVM testbench 的主要入口,其中会组织和管理 UVM 环境、测试用例、监控器、驱动、代理和其他需要的组件,以及定义仿真时钟和其他系统级设置。此外,testbench.v 还可以包含其他自定义功能和扩展,以满足具体的测试需求。

二、testbench目录下的define文件可以存放哪些宏?

在 Testbench 目录下的 define 文件可以存放各种宏定义,以便在整个测试平台中使用。这些宏定义可以用于配置、控制和定制测试环境和测试用例。以下是一些常见的宏定义示例:

  1. 参数设定:可以包含各种参数的宏定义,如时钟周期、数据宽度、延迟等。

     
    `define CLK_PERIOD 10
    `define DATA_WIDTH 32
    `define DELAY 5
    

    复制插入

  2. 信号名称:可以定义各个信号的名称,以便在测试环境和测试用例中使用。

     
    `define RESET_N          top_tb.dut_reset_n
    `define CLK              top_tb.dut_clk
    `define START_SIGNAL     top_tb.dut_start
    

    复制插入

  3. 编译开关:可以定义各种编译时开关,以控制特定功能的启用或禁用。

     
    `define ENABLE_FEATURE_A
    `define DISABLE_FEATURE_B
    

    复制插入

  4. 导入库文件:可以定义需要导入的库文件路径,以便在测试环境和测试用例中使用。

     
    `define LIB_PATH "path/to/verif_lib.sv"
    

    复制插入

  5. 日志和报告输出:可以定义各种日志级别和报告输出选项,以控制日志和报告的详细程度。

     
    `define LOG_LEVEL_DEBUG
    `define ENABLE_REPORTS
    

    复制插入

定义的宏可以在整个 testbench 文件夹中的各个文件中使用,以配置和控制测试环境和测试用例的行为。

三、run_phase和main_phase之间的关系;

  • run_phasemain phase(动态运行)都是task phase,且是并行运行的,后者称为动态运行(run-time)的phase

  • 如果想执行一些耗费时间的代码,那么要在此phase下任意一个component中至少提起一次objection,这个结论只适用于12个run-timephase。对于run_phase则不适用,由于run_phase与动态运行的phase是并行运行的,如果12个动态运行的phaseobjection被提起,那么run_phase根本不需要raise_objection就可以自动执行。

四、举例说明UVM组件中常用的方法,各种phase关系,phase机制作用

  • UVM中有很多非常有趣的机制,例如factory机制,field_automation机制,phase机制,打印机制,sequence机制,config_db机制等,这些机制使得我们搭建的UVM能够有很好的可重用性和使得我们平台运行有秩序稳定。

  • 例如phase机制,phase机制主要是使得UVM的运行仿真层次化,使得各种例化先后次序正确。UVMphase机制主要有9个,外加12个小phase。主要的 phasebuild phase、connect phase、run phase、report phase、final phase等,其中除了run phase** task**,其余都是function,然后build phasefinal phase都是自顶向下运行,其余都是自底向上运行。Run phase和12个小phasereset phase、configure phase、main phase、shutdown phase)是并行运行的,有这12个小phase主要是进一步将run phase 中的事务划分到不同的phase进行,简化代码。注意,run phase和 12个小phase最好不要同时使用。从运行上来看,9个phase顺序执行,不同组件中的同一个phase执行有顺序,build phase为自顶向下,只有同一个phase全部执行完毕才会执行下一个phase

  • 所有的phase按照以下顺序自上而下自动执行:(九大phase,其中run phase又分为12个小phase)build_pase

    connect_phase

    end_of_elaboration_phase

    start_of_simulation_phase

    run_pase

    extract_phase

    check_phase

    report_phase

    final_phase

    其中,run_phase按照以下顺序自上而下执行:

    pre_reset_phase

    reset_phase

    post_reset_phase

    pre_configure_phase

    configure_phase

    post_configure_phase

    pre_main_phase

    main_phase

    post_main_phase

    pre_shutdown_phase

    shutdown_phase

    post_shutdown_phase

五、组件之间的通信机制,analysis port和其它的区别

  1. 通信分为,单向通信,双向通信和多向通信

  • 单向通信:指的是从initiatortarget之间的数据流向是单一方向的

  • 双向通信:双向通信的两端也分为initiatortarget,但是数据流向在端对端之间是双向的

  • 多向通信:仍然是两个组件之间的通信,是指initiatortarget之间的相同TLM端口数目超过一个时的处理解决办法。

  1. blocking阻塞传输的方法包含:

  • Put():initiator先生成数据Tt,同时将该数据传送至target

  • Get():initiatortarget获取数据Tt,而target中的该数据Tt则应消耗。

  • Peek(): initiatortarget获取数据Tt,而target中的该数据Tt还应保留。

  1. 通信管道:

  • TLM FIFO:可以进行数据缓存,功能类似于mailbox,不同的地方在于uvm_tlm_fifo提供了各种端口(put、get、peek)供用户使用

  • analysis port:一端对多端,用于多个组件同时对一个数据进行处理,如果这个数据是从同一个源的TLM端口发出到达不同组件,则要求该端口能够满足一端到多端,如果数据源端发生变化需要通知跟它关联的多个组件时,我们可以利用软件的设计模式之一观察者模式实现,即广播模式

  • analysis TLM FIFO

a. 由于analysis端口提出实现了一端到多端的TLM数据传输,而一个新的数据缓存组件类uvm_tlm_analysis_fifo为用户们提供了可以搭配uvm_analysis_port端口uvm_analysis_imp端口和write()函数。

b.uvm_tlm_analysis_fifo类继承于uvm_tlm_fifo,这表明它本身具有面向单一TLM端口的数据缓存特性,而同时该类又有一个uvm_analysis_imp端口analysis_export并且实现了write()函数:

  • request & response通信管道 双向通信端口transport,即通过在target端实现transport()方法可以在一次传输中既发送request又可以接收response


http://www.kler.cn/a/450302.html

相关文章:

  • go语言并发文件备份,自动比对自动重命名(逐行注释)
  • http协议的状态码
  • 计算机网络——练习题
  • nest 学习3
  • git命令恢复/还原某个文件、删除远程仓库中的文件
  • 任务2 配置防火墙firewalld
  • Python基础知识回顾
  • Apache Jmeter Liunx环境部署与接口压测
  • Typesense:开源的高速搜索引擎
  • 多个方向说下nginx和apache的区别
  • 深度学习与图像处理(国产深度学习框架——飞桨官方指定教材)
  • springboot创建web项目
  • 【数据结构练习题】链表与LinkedList
  • 华中电子展(OVC)︱2025 武汉国际半导体产业与电子技术博览会:引领未来“芯”科技
  • AIDD - 人工智能药物设计 - 在 Docker 上创建和运行 PostgreSQL + RDKit 卡带环境
  • Java实现Excel带层级关系的数据导出功能
  • 最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
  • List 集合安全操作指南:避免 ConcurrentModificationException 与提升性能
  • 模型高效微调方式
  • Mysql-索引数据结构选择合理性
  • KingbaseES(金仓数据库)入门学习
  • 如何在 Ubuntu 22.04 服务器上安装 Jenkins
  • 【LuaFramework】LuaFramework_UGUI_V2框架学习
  • 精彩回顾|在2024全球智博会 Semantic Kernel 开发者日中国站开启企业全智能化应用场景
  • 【超详细实操内容】django的身份验证系统之用户登录与退出
  • 转型云,转型AI,转型大模型,微软为什么如此人间清醒?