《UVM实战卷Ⅰ》学习笔记 第六章 UVM中的sequence(1)

目录

6.1 sequence

1.完善"为什么sequence/sequencer?"这个的逻辑

2.sequencer的定义如此简单,他有有什么作用?

3.seq的启动和执行

6.2 sequence的仲裁机制

1.sqr挂载多个seq时,发送顺序怎么定义?

2.lock/grab/is_relevant/wait_for_relevant

6.3 sequence相关宏及其实现

1.uvm_do系列函数源代码

2.uvm_send和uvm_rand_send的意义


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的意义

节省空间,先不详细了解

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值