一、Sequencer和Sequence
- 相关问题:
1)如果多个sequence需要同时挂载到sequencer,则需要进行仲裁。
2)区别item和sequence的挂载方式,明确`uvm_do等宏的使用。 - sequence挂载到sequencer的方法
uvm_sequence::start(uvm_sequencer_base sequencer,
uvm_sequence_base parent_sequence=null,
int this_priority=-1, bit call_pre_post=1);
- item挂载到sequencer的方法
uvm_sequence::start_item(uvm_sequence_item item, int set_priority=-1,
uvm_sequencer_base sequencer=null);
uvm_sequence::finish_item(uvm_sequence_item item, int set_priority=-1);
//finish_item的过程中实际上调用了uvm_sequencer::send_request()和uvm_sequencer::wait_for_item_done()等方法。
-
相关宏
另外还有将优先级作为参数传递的uvm_do_pri_with等等。 -
sequencer的仲裁特性
示例:
-
锁定机制
1)lock()/unlock():一旦sequence获得授权则无需担心权限被收回。
2)grab()/ungrab():能够在sequencer下一次授权周期无条件地获取授权。
// inside the body task of a child sequence
m_sequencer.lock(this); //or grab(this)
repeat(3) #10ns `uvm_do_with(...)
m_sequencer.unlock(this); //or ungrab(this)
二、Sequence的层次化
1)hierarchical sequence
2)Virtual Sequence
- 其内部的sequence允许挂载到不同的sequencer,即可以承载不同目标sequencer的sequence的群落。
- virtual sequencer则是一个链接所有底层sequencer句柄的地方,它是一个中心化的路由器。且virtual sequencer本身不会传递item,不需与任何driver进行TLM连接;同时为避免句柄的悬空,在顶层connect阶段要完成各个sequencer句柄与底层实体对象的一一连接。
示例:
……
3)Layering Sequence
- 深层次化数据传输,例如复杂的协议总线传输,倾向于通过若干抽象层次的sequence群落来模拟协议层次。
- 包括高抽象的item、中间做转换的layer和低抽象的item。