即通过get_next_item_called这样一个变量实现了driver一次只能从sequencer获取一个数据进行处理。 sequence_item_requeated src/seq/uvm_sequencer_base.svh中的源代码 与get_next_item_called同时出现的另一个变量sequence_item_requeated起到一个等待sequencer授权sequence的作用。 sequence_item_requeated清零的位置与...
总结一下,start_item里完成的主要工作就是获取sequencer -> wait_for_grant。 通过以上的源代码分析我们就知道,同一时刻某个sequencer只会被一个sequence所占用,并且发送的包在send_request到item_done之间会暂存在在一个uvm_tlm_fifo中,数据在get_next_item的时候并不会从fifo中pop出来,而是用的peek函数,只有等到...
uvm_report_fatal("SEQ",{"neither the item's sequencer nor dedicated sequencer has been supplied to start item in ",get_full_name()},UVM_NONE); return; end item.set_item_context(this, sequencer); if (set_priority < 0) set_priority = get_priority(); sequencer.wait_for_grant(this, s...
首先我们来看宏 `uvm_declare_p_sequencer 都干了啥。 查找宏 `uvm_declare_p_sequencer 的定义如图5所示: 图5 src/macros/uvm_sequence_defines.svh中的代码 `uvm_declare_p_sequencer可以认为就是定义一个SEQUENCER类型的变量p_sequencer,并且定义一个函数m_set_p_sequencer()(这个函数在uvm_sequence类中肯定以...
`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行被调用的,具体的代码我们就不去细细分析了。