1)pre_do 有一个参数,表明uvm_do 是在对一个transaction 还是sequence 进行操作。 2)mid_do 和 post_do 的两个参数是正在操作的sequence 或者item 的指针,需用cast 转换成目标类型my_transaction。
了解了uvm_do宏实现的细节之后,为了增加uvm_do系列宏的灵活度,UVM提供了三个接口:pre_do,mid_do与post_do。 pre_do是一个任务,在start_item中被调用,是start_item返回前执行的最后一行代码,在它执行完成后才开始对transaction进行随机化。pre_do有一个1bit参数,用于表明uvm_do是对一个transaction还是一个sequen...
wait_for_grant()等待sequencer仲裁。pre_do() hook函数。 在finish_item中,调用transaction挂载sequencer的函数send_request(), 这个函数定义在uvm_sequencer_param_base中。将transaction放入m_req_fifo容器中。 当driver中调用**seq_item_port.get_next_item(req)**时,实际调用的是uvm_sequencer中的get_next_ite...
其中pre_do是一个任务,在start_item中被调用,它是start_item返回前执行的最后一行代码,在它执行完毕后才对transaction进行随机化,mid_do是一个函数,位于finish_item的开始,执行完此函数后,finish_item才进行其他操作,post_do也是一个函数,位于finish_item的末尾,是finish_item返回前执行的最后一行代码。 12:sequence...
pre_do是一个任务,在start_item中被调用,是start_item返回前执行的最后一行代码,在它执行完成后才开始对transaction进行随机化。pre_do有一个1bit参数,用于表明uvm_do是对一个transaction还是一个sequence进行操作(详见下一节sequence的嵌套)。 mid_do是一个函数,在finish_item最开始被调用,在执行完此函数后才会进...
当uvm_do的第一个参数是某个sequence的指针时,uvm_do主要包括实例化+随机化和约束+启动; // for a sequence item, the following are called, in order //| `uvm_create(item)// //| sequence.wait_for_grant(prior) (task)// //| this.pre_do(1) (task) ...
第五种:使用pre_do/mid_do/post_do uvm_do宏封装了从transaction实例化到发送的一系列操作。封装的越多,则其灵活性就越差。为了增加uvm_do系列宏的功能,UVM提供了三个接口:pre_do、mid_do、post_do。 因为这个操作用的比较少,不再做详细介绍。具体内容可以参考张强编著的<<UVM实战>>卷I,位于Page 180。
第二个参数parent_sequence,如果不指定,则表示当前sequence为根sequence;如果指定了父sequence,则sequence在运行的过程中会去调用上级sequence的pre_do(),mid_do()和post_do()函数。第三个参数是当前sequence的优先级,在多sequence的情况下会有用。第四个...
this.pre_do();执行完后,将会对transation进行随机化。 this.mid_do(); 这三个do函数为callback函数。 sequencer.send_request(); sequencer.wait_for_item_done(); this.post_do(); 这些是UVM内部定义的一个task body内应该有的几个部分,但是一般可以直接new+自己的randomized+`uvm_send来完成。
对于pre_do()、mid_do()、post_do()而言,子 一级的sequence/item在被发送过程中会间接调用parent sequence的pre_do()等方法。 • 正是通过几个sequence/item宏来打天下的方式,用户可以通过'uvm_ do/'uvm _do_ with 来发送sequence或item。这种不区分对象是sequence还是 item的方式, 带来了不少便捷,但容易...