set_sequencer()函数会调用m_set_p_sequencer(),这个函数是一个空的虚函数。如果在sequence中调用了宏uvm_declare_p_sequencer则会重写这个函数,将成员变量p_sequencer指向sequence所挂载的sequencer上。所以使用者要保证start()函数传入的sequencer应该和宏 uvm_declare_p_sequencer声明的类型一致。否则$cast转换的时候...
也就是说register model中的default_map里的set_sequencer方法实现了将三者的关联,传递的两个参数分别对应着实际的sequencer和adapter。 我们看看这个default_map的声明和类型定义 于是寄存器模型的default_map就把对应的sequencer和adapter存放在了default_map中的m_sequencer和m_adapter中。 下面在看看uvm_reg_adapter中re...
在connect_phase中,adapter将uvm_reg_map和sequencer连接,实际就是调用set_sequencer给uvm_reg_map中的成员变量m_sequencerm_adapter赋值: functionvoidbase_test::connect_phase(uvm_phase phase); super.connect_phase(phase); ... rm.default_map.set_sequencer(env.bus_agt.sqr, reg_sqr_adapter); rm.defaul...
可以看到我们前面经常提到的m_sequencer就是声明在这里的,也就是说到uvm_sequence_item这一层就已经绑定了uvm_seuqencer的概念了,也就是说uvm_sequence_item类型的transaction最终都会给到sequencer再到driver中,关于transaction从产生到driver获取的详细流程参见之前的文章:数字验证大头兵:[UVM源代码研究] sequence、 seq...
set_sequencer 函数 会使m_sequencer 句柄指向执行当前 sequence 的 sequencer,即指向 env.vsqr 如果没有指定挂载的sequencer,则挂载到parent_sequence的sequencer上 `uvm_do() 宏: 相比直接调用start函数,uvm_do()宏节省了sequence的实例化和随机化的步骤 ...
uvm_ sequencer 类自建了仲裁机制用来保证多个 sequence 在同时挂载到 sequencer 时, 可以按照仲裁规则允许特定 sequence 中的 item 优先通过。在实际使用中, 我们可以通过uvm_sequencer: :set_ arbitration(UVM _ SEQ_ ARB_TYPE val)函数来设置仲裁模式,这里的仲裁模式UVM_SEQ_ ARB_ TYPE有下面几种值可以选择: ...
seq.start(sequencer); phase.drop_objection(this)//sequence的隐式启动//该方法可以在sequence中使用starting_phase提起和撤销objectionuvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence", case0_sequence::get_type());//在my_sequence中的body任务中virtualtask...
在实际使用中,我们可以通过uvm_sequencer::set_arbitration(UVM_SEQ_ARB_TYPE val)函数来设置仲裁模式,这里的仲裁模式UVM_SEQ_ARB_TYPE有如下几种值可以选择:※ UVM_SEQ_ARB_FIFO:默认模式,来自sequences的发送请求,按照FIFO先进先出的方式被依次授权,和优先级没有关系,谁先申请,谁就获得。※ UVM_SEQ_ARB_STRIC...
env.i_agt.sqr.set_arbitration(SEQ_ARB_STRICT_FIFO); 仲裁算法详细讲解可参考:UVM Tutorial for Candy Lovers – 26. Sequence Arbitration 2.4 sequence对sequencer的占用或失效 1. 用lock()和grab()排他性占用sequencer 在sequence的body()中使用lock()...unlock()或grab()...ungrab(), 可以让在其中间...
p_sequencer源代码如下: `defineuvm_declare_p_sequencer(SEQUENCER) SEQUENCER p_sequencer;//SEQUENCER是由用户指定的类型 virtualfunctionvoidm_set_p_sequencer(); super.m_set_p_sequencer();//父类的m_set_p_sequencer是空函数 if(!$cast(p_sequencer, m_sequencer)) ...