[UVM机制]sequence与driver

在UVM中,sequence-->sequencer-->driver的通信十分基础且关键,基于某大厂的一面面试,阅读源码总结一下sequence到driver之间通信的机理。

1、sequence item和sequence的区别

sequence item是一个对象,其构建了两个验证组件之间传输的信息(transaction)。如:读操作和写操作中的地址和数据信息。

sequence是由driver驱动的sequence item序列模式,由body()实现,如连续读取10次transaction。

对于激励生成和场景控制是由sequence来编制的,而对于激励所需要的具体数据和控制要求则是从item的成员数据得到的。

2、sequenec的启动方式有哪些

sequence的启动方式分为直接启动和间接启动两种。

直接启动是在tc中创建sequence,再通过调用sequence内置的start函数,挂载到sequencer上启动。

直接启动只能在tc中进行,虽然简单但很难控制,复用性不高,一般用于tc的run_phase()中,利用objection机制进行举手和放手,利用sequence的start()函数指定特定的sequencer从而启动该sequence。

间接启动是利用uvm_config_db将sequence送到sequencer上的main_phase中。

间接启动是一种更推荐的方式,利用uvm_config_db将sequence配置到对应sequencer的run_phase中从而启动sequence,不需要直接例化seq。

间接启动的方式可以在env或test的build_phase中设置,并且可以被更高层次的组件重载。

uvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get());

3、sequence的start调用什么task

body()

4、body中有哪些操作流程

如果是发送sequence_item,那么首先创建例化item,然后调用start_item(),随机化item,调用finish_item()。

如果是发送sub sequence,那么首先创建例化该sequence,并且随机化,然后调用start()函数,如果该sequence的item有相关的resp,还要在sequence中调用get_response()。

5、sequence和driver之间是怎么进行通信的

sequence产生transaction,driver负责接收transaction。一个sequence在向sequencer发送transaction之前,要先向sequencer发送一个请求,sequencer会将这个请求放在一个仲裁队列中。

当sequence在tc中启动时,会自动执行body()中的代码,用`uvm_do系列的宏进行激励的发送。在这个宏中,会执行start_item(),而start_item()中会调用seqr的wait_for_granted(),作为sequencer此时要做两件事,第一是检测仲裁队列中是否有sequence发送transaction的请求;第二是检测driver中get_next_item()是否申请了transaction

如果仲裁队列中有发送请求,driver也向sequencer申请了新的transaction,那么将同意发送请求,此时完成第一次握手,执行seqr.begin_tr()进行transaction的生成,`uvm_do宏中的finish_item()则表示transaction已经生成完毕,在finish_item()中又执行了seqr.send_request(req)向driver发送了transaction,响应get_next_item(req);driver接收到transaction后,执行item_done()响应finish_item中的seqr.wait_for_item_done(),给sequencer确认完成信号,完成二次握手

 6、driver一侧如何获取激励

driver向sequencer申请transaction。

在uvm_driver中有成员变量seq_item_port,而在uvm_sequencer中有成员变量seq_item_export(import类型)。两者之间建立一个通道,通道中传递的transaction类型是定义sequencer和driver时指定的transaction类型。

7、driver如何将获取的response返回给sequence一侧

重要!这样有时可以省去scoreboard这个组件,简化环境,直接在sequence中进行数据比对。

在sequence中发送完数据之后,需要通过get_response(rsp)来获取响应。

而在driver中,将数据包下发dut后,需要先构建一个rsp,再获取req的id信息,然后通过item_done.put_response(rsp)将rsp反馈给sequence。

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值