|
发表于 2022-5-15 10:04:32
|
显示全部楼层
本帖最后由 dtyuzhou 于 2022-5-15 10:07 编辑
config db可以简单粗暴的理解为把所有要共享的东西都放到全局为一的config db中了,那么生下来的的就是放入(set) 、取出(get)、检查(exists)。对于set/get 而言,肯定需要知道放入的类型(#type, 参数化),还需要知道set的内容,就是set/get 函数最后的value。剩余的3个都是用来防止命名冲突的。你可以简单的理解这两个参数构成了一个索引描述符,第一个参数是cntxt,这个是component,sequence不是component所以不能用this的。后续两个是字符串,想怎么玩都可以。
至于第一个为什么是component,我的理解是,uvm tree让各个component都能有一个精确描述的位置,configdb中的第一个参数cntxt,拿过来之后就是用来执行get_full_name()的,能获取一个精确描述路径,减少不必要的冲突,而且描述都是从当前层次往下的,方便高层复用。再配合第二个第三个参数,形成了类似这样的一个描述符 cntxt.get_full_name() + inst_name + field_name。当然实现的时候要考虑通配符的使用,会比这个实现要负责不少。
回到问题,seq确实不能用this,但是seq中默认带过来的component也就是m_sequencer比较方便一点,所以不少人喜欢用m_sequencer。如果环境简单话,你用null也是可以的,set的时候也set到null,get的时候第一个也用null, 这样cntxt 就是uvm_root了,不推荐这种cntxt = null 的做法啊,高层复用的时候挺容易冲突的。
再说m_sequencer 和 p_sequencer 有什么区别,回答是这两个玩意是一个东西,m_sequencer 的类型是uvm_sequencer的基类,p_sequencer的类型是真实sequencer的类型(就是个declare定义的),m_sqr 是用父类的句柄指向了子类(p_sqr), 如果sequencer中定义了一些东西,在sequence中想用的话,就不能用用m_sqr了,会有语法错误的。但是用p_sqr就行了,源代码是$caset(p_sqr, m_sqr),所以就是一个东西。v_seq的时候为什么非要定义p_sqr就是这个原因,因为你无法直接使用m_sequencer.xxx_sqr(语法错误)。但是p_seuqncer.xxx_sqr就是可以的。
|
|