IC验证面试之UVM(一)

本文详细介绍了UVM验证框架中的关键概念,包括工厂覆盖机制的三个条件,UVM Monitor存在的必要性,配置is_active的重要性,以及组件实例化时机的探讨。此外,还讨论了field automation在验证中的应用,强调了代码复用和灵活性在验证环境设计中的价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下为个人答案,水平有限。如有解释不对的地方,欢迎大家评论区留言一起学习交流。

后面的题目连接:《IC验证笔试题之UVM(二)》


1.UVM中,工厂覆盖机制的3个条件?

也就是在问,怎样才能确保可以正确覆盖(override)。

  • 首先确保原始类和覆盖类都应在工厂中注册原始类应该通过工厂实例化(使用type::type_id::create( )的方式,而不是传统的new()的方式);
  • 覆盖方法应该在原始类的对象创建之前被调用
  • 覆盖类为原始类的子类,而调用成员方法(原始类中)也应当声明为虚方法,这是为了确保句柄类型转换不会出错。注意,覆盖类为原始类的父类时会报错

2. UVM中Monitor存在的必要性?

由于 transaction 是由 driver 输出到DUT的端口,为什么不直接通过 diver 将事务发送给 scoreboard 或者 reference model,而是非要通过一个 monitor 将数据采集发送呢?

第一,在大型项目中,driver 根据某一协议发送数据,而 monitor 则根据同一协议收集数据。如果 driver 和 monitor 是不同人员实现的,将 driver 和 monitor 分开,可以大大地减少任何一方对协议理解的错误;

第二,UVM 的一个重要思想就是方便代码复用。在 agent 被集成时,有些场景可能不需要 diver 发送数据,只需要例化monitor就可以了。通过配置 agent 中的 is_active 变量( UVM_ACITVE 或 UVM_PASSIVE ),可以控制 agent 是否例化 diver 和 sequencer 。比如在输出端口上不需要任何驱动信号,只需要监测信号,agent中只需要例化 monitor 即可( agent 配置为 PASSIVE 模式)。

3.为什么要配置is_active呢?

比如你在模块级做验证时,拿验APB接口为例,你需要用一个APB VIP,包含master agent和 slave agent。master通过APB的接口进行读写操作,slave是通过APB接口去响应操作,所以需要 master agent和slave agent里面都要有driver,maser_driver来模拟从APB总线上发起读或写的操作(控制paddr、pwrite和pwdata等),slave_driver模拟从APB总线上做响应,返回pradta,pready和pslverr信号。
但是当你这个APB接口的模块验证环境被集成到一个更大的模块时,有真正的master模块设计连接着APB总线,设计里面自己会去对总线做操作,也有slave模块通过APB总线做响应。那这个时候,我就不需要你APB VIP里面的master agent 里面的 driver 和 sequencer 来模拟master去发送激励了,因为这个时候我有真正的master连在总线上。同样,我也有真正的slave模块来响应。但这个时候,我们仍然想监测APB总线上数据的来来回回,但又不需要发送激励,这时候我们就可以通过对APB VIP的 master agent 和 slave agent 配置UVM_PASSIVE,也就是不例化 driver 和 sequencer ,只例化monitor,实现了模块级环境复用到更高级别的环境中。

4.是不是只能在build_phase中进行例化的动作?

一般创建 agent 的实例是在 env 的 build_phase 中,创建 driver 和 monitor 的实例则是在 agent 的 build_phase 中,那么是不是只能在build_phase中创建实例呢?

不一定,也可以在 new( ) 函数中执行实例化的动作。比如可以在 agent 的 new( ) 函数中实例化 driver 和 monitor 等,但是带来的问题就是,在 env 的 build_phase 中对 agent 的 is_active 赋值不会产生任何的效果。如下:

如果采用以下的方式:均在 build_phase 中创建对象。在 agent 的 build_phase 中,可以直接获取上层env配置的 is_active 值,有选择地例化 driver 和 sequencer。

class env extends uvm_env;
    agent agt1;
    function void new(string name,uvm_component parent);
        super.new(name,parent);
    endfunction
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        agt1 = agent::type_id::create("agt1",this);
        agt1.is_active=PASSIVE;
    endfunction
endclass

class agent extends uvm_agent;
    driver drv;
    monitor mon;
    sequencer sqr;
    function void new(tring name,uvm_component parent);
        super.new(name,parent);    
    endfunction
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        if(is_active==UVM_ACTIVE) begin
        	drv = driver::type_id::create("drv",this);
            sqr = sequencer::type_id::create("sqr",this);
        end
        mon = monitor::type_id::create("mon",this);
    endfunction
endclass

如果采用以下的方式例化:在 agent 的 new( ) 函数中例化 driver 和 monitor。那么需要在 agent 实例化之前,使用 config_db 传递 is_active 值

class env extends uvm_env;
    agent agt1;
    function void new(string name,uvm_component parent);
        super.new(name,parent);
    endfunction
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        uvm_config_db#(uvm_active_passive_enum)::set(this,"agt1","is_active",UVM_PASSIVE);
        agt1 = agent::type_id::create("agt1",this);
    endfunction
endclass

class agent extends uvm_agent;
    driver drv;
    monitor mon;
    sequencer sqr;
    function void new(tring name,uvm_component parent);
        super.new(name,parent);
        uvm_config_db#(uvm_active_passive_enum)::get(this,"","is_active",is_active);
        if(is_active==UVM_ACTIVE) begin
        	drv = driver::type_id::create("drv",this);
            sqr = sequencer::type_id::create("sqr",this);
        end
        mon = monitor::type_id::create("mon",this);
    endfunction
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
    endfunction
endclass

5.field automation 的作用?

这个问题当初也被面试官问到过,现在闲下来,整理了一下,可以看:域的自动化

### 集成电路验证工程师常见面试题及答案 #### UVM框架的理解 UVM(Universal Verification Methodology)是种基于SystemVerilog的验证方法学,广泛应用于IC验证领域。其核心在于通过分层结构和标准化流程提高验证效率。例如,phase机制是UVM的重要组成部分之,它确保了仿真过程中的各个阶段能够有序执行[^3]。 - **问题**: 什么是UVM的phase机制? - **答案**: UVM的phase机制主要包括9个主要阶段和12个小阶段。主要阶段包括`build phase`、`connect phase`、`run phase`、`report phase`和`final phase`等。其中,`build phase`和`final phase`采用自顶向下的方式运行,而其他阶段则采取自底向上的方式运行。需要注意的是,`run phase`是个task类型的方法,与其他函数类型的阶段不同。此外,在实际应用中应避免同时使用`run phase`和12个小阶段以减少复杂度。 #### 验证环境的设计与实现 构建高效的验证环境对于IC设计至关重要。以下是几个典型问题: - **问题**: 如何创建个简单的UVM验证环境? - **答案**: 创建UVM验证环境通常涉及以下几个部分:定义接口(interface)、编写驱动程序(driver)、监控器(monitor)、记分板(scoreboard)以及代理(agent)。下面是个基本的代码示例: ```verilog class my_agent extends uvm_agent; `uvm_component_utils(my_agent) function new(string name, uvm_component parent); super.new(name, parent); endfunction : new virtual function void build_phase(uvm_phase phase); super.build_phase(phase); // 实现逻辑... endfunction : build_phase endclass : my_agent ``` - **问题**: 记分板的作用是什么?如何实现功能覆盖率收集? - **答案**: 记分板用于比较DUT的实际输出与预期结果之间的差异,从而判断设计是否正确工作。功能覆盖率可以通过覆盖模型来捕获特定条件的发生频率,进而评估测试质量。例如,可以利用`covergroup`语句定义覆盖率组: ```verilog covergroup cg @(posedge clk); option.per_instance = 1; addr_range: coverpoint addr { bins low = {[0:63]}; bins mid = {[64:127]}; bins high = {[128:255]}; } endgroup : cg ``` #### 测试用例开发技巧 为了全面验证芯片的功能,需要精心设计多种场景的测试用例。 - **问题**: 编写随机化的约束有哪些注意事项? - **答案**: 使用`constraint`关键字可以在类属性之间建立关系,指导生成满足指定条件的数据集。然而,过度复杂的约束可能导致求解失败或者性能下降。因此建议遵循以下原则:保持简单明了;合理设置权重分布;及时调试未收敛的情况。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小verifier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值