sequence_item_requeated清零的位置与get_next_item_called一样,也是在item_done和stop_sequences中完成的,也就是正常情况下执行到get_next_item里的216行判断语句的时候sequence_item_requeated通常为0,会调用m_select_sequence,这个task是在uvm_sequencer的父类uvm_sequencer_base中实现的。 716-722行代码实现了等...
我们先来看看UVM源代码中对这个部分的整体讲解: 从描述可以看到,start_item到finish_item的过程调用了两个东西,一个是sequencer,一个是parent_seq,parent_seq是眼下这个sequence的父类sequence,那说到底还是个sequence,也就是说儿子把父亲做的事情先做一遍,那不重要,我们不用管它。就看sequencer的调用好了,一看发现...
首先我们看下在uvm_sequencer里是如何实现get_next_item这样一个通信方法的 这里需要注意的是get_next_item_called(sequence_item_requested同理)这样一个变量,也就是说调用get_next_item的时候get_next_item_c…
(这个wrapper的类型是通过testcase的build_phase中set过来的virtual_sequence::type_id::get()获取的,也就是说set的是一个uvm_object_wrapper类型,而不是一个实例,uvm_object_wrapper作为一个UVM源代码中定义的基类可以接受任何类型) 1394行主动调用set_sequencer()将virtual_sequencer设置为virtual_sequence启动的seque...
`uvm_declare_p_sequencer (my_virtual_sequencer) function new (string name = "my_virtual_seq"); super.new (name); endfunction apb_rd_wr_seq m_apb_rd_wr_seq; wb_reset_seq m_wb_reset_seq; pcie_gen_seq m_pcie_gen_seq; task pre_body(); ...
核心代码就是2000行的do_bus_write(),对应着2051-2184行,这个函数参数就包含了uvm_reg_item、sequencer和adapter,也就是一次register写操作所需的所有参数,而我们在adapter中override的reg2bus函数就是再2130行被调用的,具体的代码我们就不去细细分析了。 这里我们还有一个疑问,我们调用的reg2bus所产生的transfer是...