目录
UVM sequence 在 sequencer和driver间的流动
该专栏旨在总结一下之前学习到的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 寄存器模型
...