浅探UVM冰山一角

目录

UVM factory机制

UVM 通信

UVM phase机制

UVM objection机制

UVM sequence 在 sequencer和driver间的流动

UVM 寄存器模型


该专栏旨在总结一下之前学习到的UVM知识(也是很久不用了),通过源码去比较详细地了解各个机制。主要包含:

UVM factory机制

通过宏注册之后,具体在factory中发生了什么。

通过工厂创建的类如何覆盖

UVM 通信

uvm_event:在分离的object,component中可以共享同一个uvm_event/barrier,实现object间的同步。

uvm_callback:在component和object都可以使用uvm_callback,是如何实现的?

UVM phase机制

run_test后,具体发生了什么。

在每次创建一个component的时候, 我们都会定义 build_phase, connect_phase,run_phase...这些是怎么被调用起来的?以及它们的执行顺序是如何确立的?

它们主要依赖于下图中的DAG。

UVM仿真的启动(一)—— run_test()_uvm怎么启动-CSDN博客

UVM仿真的启动(二)—— uvm_phase::m_run_phase()-CSDN博客

UVM仿真的启动(三)—— execute_phase()-CSDN博客

UVM objection机制

uvm中,仿真对于task phase的执行和结束主要依赖于uvm_phase中 一个 uvm_objection类型的 test_done 实例,通过它来raise_objection,以及drop_objection。整个仿真的结束也发生在环境中中所有objections dropped之后。

对于一个经典问题,仅仅在uvm domain中的12个phase中提起objection或在common domain的run_phase提起objection,task的执行是完全不同的 (参考白皮书p354),

task my_case0::main_phase(uvm_phase phase);
    phase.raise_objection(this);
    #100;
    phase.drop_objection(this);
endtask
task my_case0::run_phase(uvm_phase phase);
    for(int i = 0; i < 9; i++) begin
        #10;
        `uvm_info("case0", "run_phase is executed", UVM_LOW)
    end
endtask
task my_case0::main_phase(uvm_phase phase);
    for(int i = 0; i < 9; i++) begin
        #10;
        `uvm_info("case0", "main_phase is executed", UVM_LOW)
    end
endtask
task my_case0::run_phase(uvm_phase phase);
    phase.raise_objection(this);
    #100;
    phase.drop_objection(this);
endtask

第一段代码执行结果,run_phase的内容会被执行,"run_phase is executed"被输出了9次。而第二段没有输出内容。产生这个差异的原因是什么呢?

UVM仿真的运行(四)—— objection 机制-CSDN博客

UVM sequence 在 sequencer和driver间的流动

一个经典的问题。。。

UVM 寄存器模型

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值