我们在sequence中往driver发包时,最常用的方法就是使用uvm_do()系列宏,偶尔会使用方法start_item()和finish_item()的组合,极个别场景下会 使用`uvm_create()和`uvm_send()宏,极极个别场景下还会看到create_item()方法的使用,这些宏和方法有什么区别,各自使用场景有什么局限和注意事项,他们分别定义在了UVM源代码...
1.create_item 产生seq_item(factory) 2.wait_for_grant向sqr发出request,和等sqr的grant; sqr返回grant给seq 3.random seq_item ,然后send_request把seq_item 发给sqr.这个过程不消耗仿真时间,然后seq进入wait_for_item_done()的阻塞性等待状态,直到获取drv的response。 sqr的REQ FIFO会把seq_item转给drv。 dr...
uvm_do及uvm_send宏的最终实现均是依靠start_item和finish_item任务来实现。调这两个任务可指定优先级参数。 start_item里会调用wait_for_grant及parent_seq.pre_do任务。 finish_item里会调用mid_do,send_request,wait_for_item_down及post_do等 create_item(item) sequencer.wait_for_grant(prior) (task) \ ...
UVM_INFO verilog_src/uvm-1.1d/src/base/uvm_resource_db.svh(121) @ 500000: reporter [CFGDB/GET] Configuration ‘uvm_test_top.env_h.e_apb_agent_h.sequencer.post_shutdown_phase.default_sequence’ (type class uvm_pkg::uvm_object_wrapper) read by uvm_test_top.env_h.e_apb_agent_h.sequ...
一旦start_item返回,则该序列已被授予使用driver的权限。start_item应该被真正称为“REQUEST_TO_SEND”。现在,该序列具有使用driver的权限,它可以使事务随机化,或者根据需要设置数据值。这就是所谓的“后期随机化”这一理想功能。事务应尽可能接近执行随机化,通过这种方式它们可以捕获任何约束中的最新状态信息。
seq_item send_request seq_item wait_for_item_done start_sequence OVM_REPORT_ ovm_seq_prod_if ovm_seq_cons_if ovm_seq_item_prod_if ovm_seq_item_cons_if ovm_virtual_sequencer ovm_scenario check_connection_size do_display absolute_lookup ...
通过finish_item(),在对item进行了随机化处理之后,执行parentsequence的mid_do(),以及调用uvm_sequencer::send_request()和uvm_sequencer::wait_for_item_done()来将item发送至sequencer再完成与driver之间的握手。最后,执行了parent_sequence的post_do()。
sequencer.send_request(); sequencer.wait_for_item_done(); this.post_do(); 这些是UVM内部定义的一个task body内应该有的几个部分,但是一般可以直接new+自己的randomized+`uvm_send来完成。 wait_for_grant和pre_do又可以组成一个start_item的宏,剩下四部分还能组成finish_item的宏。整个还可以组成uvm_do系...
item在start_item之后,因为挂载在了sequencer的上面,所以会通过句柄调用sequencer的send_request和wait_for_item_done函数,同时这两个又会去调用driver的函数,连接起来。 (3)sequencer(参数化类):负责调度sequence与driver之间的传输。 没有指明传输的transaction类型的话,缺省就是uvm_sequence_item类型,是父类类型,因此...
sequencer.send_request(item)这个函数完成的是将item发送给sequencer,将item发送到req fifo中 finish_item会一直阻塞等待driver 侧的item done 在driver侧发生的事情 driver在调用get_next_item,尝试从req fifo中取出数据,但实际上get_next_item真正是在哪里执行的呢,实际上是在sequencer中执行的,这与TLM1.0通信有关...