uvm_ sequencer 类自建了仲裁机制用来保证多个 sequence 在同时挂载到 sequencer 时, 可以按照仲裁规则允许特定 sequence 中的 item 优先通过。在实际使用中, 我们可以通过uvm_sequencer: :set_ arbitration(UVM _ SEQ_ ARB_TYPE val)函数来设置仲裁模式,这里的仲裁模式UVM_SEQ_ ARB_ TYPE有下面几种值可以选择: ...
uvm_sequencer基类包含了sequencer与driver通信所需的基本功能。在sequencer类的定义中, 默认情况下,response数据类型与request数据类型相同。如果需要不同的response数据类型,必须为uvm_sequencer指定可选的第二个参数 uvm_sequencer #(simple_item, simple_rsp) sequencer; 连接Driver和Sequencer driver和sequencer通过TLM连接...
在之前我们就谈到了,uvm_sequencer类自建了仲裁机制用来保证多个sequence同时挂载到sequencer时,可以按照规则允许特定的sequence中的item优先通过。在实际使用中,我们可以通过uvm_sequencer::set_arbitration(UVM_SEQ_ARB_TYPE val)来设置仲裁模式。这里的仲裁模式UVM_SEQ_ARB_TYPE有下面几种值可以选择: UVM_SEQ_ARB_FIFO...
uvm_sequence和uvm_sequence_item不是组件,所以无法通过config_db按照层次关系对其进行配置。因此要用一个trick:sequence一旦活动起来,它必须挂载到一个sequencer上(发送item),也就是sequence能够获取sequencer的句柄,通过句柄来访问sequencer中的成员变量或等信息,那么这样sequence可以依赖于sequencer的结构关系,间接通过sequence...
uvm_sequencer_base sequencer, uvm_sequence_base parent_sequence = null, int this_priority = -1, bit call_pre_post = 1 ) parent_sequence控制这三个任务/函数会不会执行: parent_seq.pre_do() (task),parent_seq.mid_do(this) (func),parent_seq.post_do(this) (func) 。
首先我们看下在uvm_sequencer里是如何实现get_next_item这样一个通信方法的 这里需要注意的是get_next_item_called(sequence_item_requested同理)这样一个变量,也就是说调用get_next_item的时候get_next_item_called一定为0,调用完get_next_item取出数据后get_next_item_called赋值为1。那么什么时候赋值为0的呢?
1 Sequencer和Driver sequencer和item只在合适的时间点产生需要的数据,至于怎么处理数据,则由driver来实现。为了便于item传输,UVM专门定义了匹配的TLM端口供sequencer和driver使用: 由于driver是请求发起端,所以在driver 一侧例化了下面两种端口: 而sequencer 一侧则为请求的响应端,在sequencer 一侧例化了对应的两种端口: ...
1、driver&sequencer: driver同sequencer之间的TLM通信采取了get模式,即由driver发起请求,从sequencer一端获得item,再由sequencer将其传递至driver。 1、由于driver是请求发起端,所以在driver一侧例化了下面的两种端口: uvm_seq_item_pull_port#(REP, RSP)seq_item_port ...
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行代码实现了等...
将sequence挂载到sequencer 将sequence挂载到sequencer上: uvm_sequence::start(uvm_sequencer_base sequencer, uvm_sequence_base parent_sequence = null, int this_priority = -1, bit call_pre_post = 1) 第一个变量,是指明sequence要挂载到哪个sequencer上面;第二个sequence是默认当前的sequence是没有parent sequ...