目录
1.完善"为什么sequence/sequencer?"这个的逻辑
2.lock/grab/is_relevant/wait_for_relevant
6.1 sequence
1.完善"为什么sequence/sequencer?"这个的逻辑
在《UVM实战卷Ⅰ》学习笔记 第二章 一个简单的UVM验证平台(3)_IC-V的博客-CSDN博客提及该问题的时候,核心原因只讲到了,为了将产生激励的部分中driver中剥离出来.但是为什么要将其剥离出来呢?
假设现在激励的产生还在driver::main_phase中,如果需要引入新的激励,最直接的办法无非是直接修改driver::main_phase,但是这样过程繁琐容易出错.因此想到将需要改动的部分函数化.函数化之后又面临着函数重复定义的问题(两个激励),探索的解决办法有两种:virtual function(需要重新例化UVM树)和定义不同名字函数(在main_phase不能运行),但是这两种方法不太可行.
仔细思考一下,我们目前所有的努力都在UVM树中,或者说都在其中的driver中,激励更改时的麻烦也在于UVM树的层次结构带来的麻烦,动不动就要重新构造一遍树形结构.那么我们为什么不脱离该结构呢?只在UVM树中留一个接口,激励的产生放在外边,产生之后发给接口,进入UMV树形结构中.sequence就是在UVM之外的激励发生,sequencer便是UVM树形的接口.
2.sequencer的定义如此简单,他有有什么作用?
和部分同学讨论的时候谈及到该问题.
如前一个问题所说,sqr是UVM树形结构的接口.seq会通过sqr发送至drv.在seq的自动启动中,config_db也就是设定sqr自动启动的函数的第二个参数,就会指定seq在哪个对应的sqr的main_phase启动.
在这里我们可以将sqr理解为一个函数,如书中所说,和原本drv中函数gen_pkt是没有区别的.
当然关于sqr的意义后续可以再补充
3.seq的启动和执行
1.start挂载(seq要加入objection)
2.default_sequence启动(自动完成objection)
①不例化seq ②例化seq
6.2 sequence的仲裁机制
1.sqr挂载多个seq时,发送顺序怎么定义?
①使用uvm_do系列函数定义transaction的优先级,配合sqr仲裁算法
②在使用start完成挂载时,定义seq的优先级
2.lock/grab/is_relevant/wait_for_relevant
lock/grab都是seq用于锁定sqr的函数,区别在于grab启动就会占用sqr,而lock启动会等待sqr空闲再占用.
is_relevant用于放弃sqr
wait_for_relevant:和is_relevant成对重载,在wait_for_relevant修改is_relevant的值
6.3 sequence相关宏及其实现
1.uvm_do系列函数源代码
函数较多比较繁琐,但是其本质都是由uvm_do_on_pri_with简化而来
uvm_do_on_pri_with(SEQ_OR_ITEM, SEQR, PRIORITY, CONSTRAINTS)
2.uvm_send和uvm_rand_send的意义
节省空间,先不详细了解