UVM driver和sequencer的通信

描述

创建Sequencer 

sequencer生成激励数据,并将其传递给driver执行。UVM类库提供了uvm_sequencer基类,其参数为request和response数据类型。

uvm_sequencer基类包含了sequencer与driver通信所需的基本功能。在sequencer类的定义中, 默认情况下,response数据类型与request数据类型相同。如果需要不同的response数据类型,必须为uvm_sequencer指定可选的第二个参数

uvm_sequencer #(simple_item, simple_rsp) sequencer;

连接Driver和Sequencer

driver和sequencer通过TLM连接,driver的seq_item_port连接到sequencer的seq_item_export。sequencer产生数据项,通过seq_item_export提供。driver通过它的seq_item_port获取数据项,并提供response(可选)。包含driver和sequencer的验证组件(通常是agent)在它们之间建立连接。

TLM

uvm_driver中的seq_item_port定义了driver获取sequence中下一个数据项的一组方法,并且提供了driver与sequencer同步的能力。sequencer实现了一套方法,允许驱动器和序列器之间进行灵活和模块化的交互。

Sequencer和Driver的基本交互方式

driver和sequencer之间的基本交互是通过get_next_item()和item_done()任务完成的。

driver使用get_next_item()来获取下一个要发送的随机数据项。发送到DUT后,driver向sequencer发出信号,使用item_done()表示该数据项已被驱动。通常情况下,driver的主函数类似于以下伪代码:

TLM

get_next_item()是blocking的,直到在该sequencer上运行的sequences提供一个需要驱动的数据项。

获取待驱动的数据项 

除 了 get_next_item() 任 务 外 , uvm_seq_item_pull_port 类 还 提 供 了 另 一 个 任 务try_next_item()。如果没有数据项可供驱动,这个任务将在同一simulation step中返回,此时可以让driver执行一些idle transactions,比如当没有有意义的数据要传输时,给DUT发送随机数据,如下图所示:

TLM

将处理后的数据发回给Sequencer 

在某些sequences中,正在生成的值取决于先前生成的数据驱动后的响应,那么driver需要使用item_done(rsp)将处理后的响应返回到sequencer中。

seq_item_port.item_done(rsp);

或使用put_response(rsp)方法

seq_item_port.put_response(rsp);

或使用uvm_driver的内置analysis port

rsp_port.write(rsp);

在提供response之前,必须使用rsp.set_id_info(req)将response transaction与request transaction相对应。put_response()是一个blocking方法,所以sequence必须有一个对应的get_response(rsp)。




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分