请教个UVM中virtual sequence的问题
virtual sequence中定义A,B 两个sequence,这两个sequence的body函数都有对应的pre_body和post_body在virtual sequence的body函数中通过`uvm_do_on的形式启动A,B sequence时,现象如下:
1)A,B 这两个sequence对应的body函数会被执行,而pre_body和post_body不会被执行;
2)virtual sequence的body函数对应的pre_body和post_body会执行。
如果采用手动的方式启动sequence,在virtual sequence的body函数中,先new A,B sequence,然后再通过seq.start启动sequence。A,B两个sequence的pre_body和post_body都能执行,在start后执行的。
麻烦各位同仁指导一二,为什么自动的方式(uvm_do_on)没法执行pre_body和post_body,是否需要特定的配置或语句? 多谢!
看一下cookbook,里面有讲为什么。不建议使用uvm_do, pre_body, post_body。
你去看一下uvm_do的macro的定义,里面有个开关,当使用uvm_do macro时,pre_body,post_body不会被调用,你可以想想为什么uvm默认会这样设置
多谢二位的耐心解答!原来一直走在不建议的路上...学习了,多谢!
感谢两位的耐心解答!原来我一直走在不建议的路上...学习了,多谢!
能解答下为什么默认设置是不执行pre_body和post_body吗?
uvm的一种推荐用法,是在pre_body和post_body中进行raise,drop objection的操作,pre_body和post_body只有在seq被set为default seq时才会执行,而在uvm_do macro中,当前seq是作为top seq中的一个sub seq或seq item进行调用的。理论上testbench的启动与关闭应该由top seq进行控制,并且尽可能只有一对raise和drop进行控制,防止过多的raise,drop引起不必要的问题,所以使用uvm_do时会屏蔽pre_body,post_body。如果想在seq body之前做一些事,可以重载pre_start,post_start task
谢谢分享,学习了!
7楼大牛,学习了
学习了,多谢分享
不太明白 先mark一下
学习了,多谢分享
1,为啥里面两个seq没有执行pre_body和post_body?
因为,在start的参数里有个call_pre_post,默认值是1,表示会调用pre_body和post_body,但是在uvm_do系里的宏里面,该形参传递的是0。所以,没有被调用。
2,为啥顶层的virtual sequence的pre_body和post_body被执行了?
因为,一般情况,顶层的virtual sequence会被设置为default sequence,在start_phase_sequence时,会直接调用start,此时call_pre_post用的是默认值1,所以调用了。
好牛,是看源码后了解的么?