uvm_sequence_port介绍

在验证环境中通常使用uvm_sequence机制实现激励的发送。激励由uvm_sequence产生,经由uvm_sequencer发送给uvm_driver,uvm_driver产生rsp,反馈给uvm_sequence.
此机制中一个关键的地方便是uvm_sequencer与uvm_driver的连接,它们是通过uvm_sequence_port实现的.一般在uvm_driver中seq_item_port与uvm_sequencer中的seq_item_export连接起来的。
uvm_seq_port的源码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
从3个port的定义来看,port和export形参只有两个,用来定义req和rsp类型,而imp除了req和rsp两个形参外,还有一个IMP的形参,IMP通常是例化了uvm_seq_item_pull_imp的uvm_component.
宏UVM_SEQ_PORT、UVM_EXPORT_COMMON和UVM_IMP_COMMON用来定义此port的类型,指示其属于port、export、imp.
从类中可以看到三者都调用了uvm_seq_item_pull_imp这个宏,不同的是port和export的第一个参数是m_if,m_if是uvm_port_base类型的,type IF中传递进来的参数是uvm_sqr_if_base;uvm_sqr_if_base定义了诸如get_next_item、item_done等函数。
在这里插入图片描述
uvm_seq_item_pull_imp宏定义内容如下:
在这里插入图片描述从pull_imp的定义可以看出定义的task如get_next_item调用的其实是传入的imp中get_next_item,因此可以知道例化uvm_seq_item_pull_imp的component内必须定义上述task.
其实,在uvm_driver中调用的get_next_item最终是落脚到uvm_sequencer内的,那么它们是如何关联起来的呢?单从uvm_seq_item_pull_port的定义来看,他调用的应该是m_if中的。
我们应该知道uvm_seq_item_pull_port和uvm_seq_item_pull_imp通过connect函数关联起来。在uvm_port_base中定义了resolve_bindings函数,在end_of_elaboration phase调用次函数,将uvm_seq_item_pull_imp的imp参数,赋值给uvm_seq_item_pull_port的m_if从而完成二者的关联,进而达到uvm_driver中get_next_item调用uvm_sequencer的get_next_item目的。

发布了22 篇原创文章 · 获赞 3 · 访问量 761

猜你喜欢

转载自blog.csdn.net/weixin_39662684/article/details/104770637