uvm_phase是phase机制的基础,包含phase相关的状态、执行、调度、同步、跳转等函数和变量的定义。 uvm的默认phase全部继承自uvm_topdown_phase/uvm_bottomup_phase/uvm_task_phase。uvm_topdown_phase/uvm_bottomup_phase阶段执行的是function,区别是一个自顶向下,一个是自底向上。uvm_task_phase阶段执行的是task,所...
UVM_PHASE_SCHEDULE UVM_PHASE_IMP 从代码功能角度来看可以分为两类: UVM_PHASE_DOMAIN/UVM_PHASE_SCHEDULE UVM_PHASE_IMP 比如:extract_phase的m_predecessors[]就包括run_phase和post_shutdown_phase,这里就保证phase的先后顺序。 sync是针对不同domain来说的,在不同domain的12-run_time_phase相互sync的时候才会...
run_phase+build_phase+...+final_phase是一波 12-run_time_phase是一波,包了一个壳uvm_phase_type=UVM_PHASE_SCHEDULE 将run_phase和12-run_time_phase并行 add函数堆积成了一个UVM phase的框架,跟UVM tree一个道理,这里用两个数组m_predecessors[]以及m_successors[]来表示phase之间的位置关系。 如果add的u...
最开始传入的是top,所以是top->down的方式调用子component的build_phase。 UVM_PHASE_ENDED: uvm_component的phase_ended的回调函数 遍历整个树,注意traverse的phase和state是同一个。 小结: 对于uvm_bottomup_phase.svh,就是将line93-96放在前面
登录后复制登录后复制`uvm_info("atomic_transation", "Ended...", UVM_MEDIUM) 登录后复制登录后复制end 8 ) 触发测试结束 end_test事件用于使 run_phase() 引发的异议能够删除。这表示运行阶段结束,其余的 UVM 阶段将在运行阶段完成后执行。这表示测试结束。
常用的几个phase 使用raise和drop标签来让phase机制同步运行。 断言assertion有助于提高效率,定位报错,在property里面写判断语句。 上面的意思是sequence配合.ended语句判断是否全部符合条件,验证人员编写端口的assertion。 |—>同一个时钟沿触发后面的句子 |=>下一个时钟沿触发后面的句子 判断“|”... ...
`uvm_info("","shutdown_phase called",UVM_MEDIUM) 70 phase.raise_objection(this); 71 #(m_delay); 72 phase.drop_objection(this); 73 `uvm_info("","shutdown_phase returning",UVM_HIGH) 74 endtask 75 76 77 // 4) phase_ended can be used to tidy up after a phase jump ...
UVM由phase来管理验证平台的运行,这些phase统一以xxxx_phase来命名,且都有一个类型为uvm_phase、名字为phase的参数。main_phase是uvm_driver中预先定义好的一个任务。因此几乎可以简单地认为,实现一个driver等于实现其main_phase。 上述代码中还出现了uvm_info宏。这个宏的功能与Verilog中display语句的功能类似,但是...
virtual function void build_phase(uvm_phase phase); regmodel = block_B::type_id::create("regmodel"); regmodel.build(); regmodel.lock_model(); bus = reg_agent#(dut)::type_id::create("bus", this); predict = uvm_reg_predictor#(reg_rw)::type_id::create("predict", this); ...
task spi_test::main_phase(uvm_phase phase); send_spi_char_seq spi_char_seq = send_spi_char_seq::type_id::create(“spi_char_seq”); phase.raise_objection(this, “starting spi_char_seq in main phase”); spi_char_seq.start(m_env.m_v_sqr.apb); #100ns; phase.drop_objection(this...