创建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)在它们之间建立连接。
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的主函数类似于以下伪代码:
get_next_item()是blocking的,直到在该sequencer上运行的sequences提供一个需要驱动的数据项。
获取待驱动的数据项
除 了 get_next_item() 任 务 外 , uvm_seq_item_pull_port 类 还 提 供 了 另 一 个 任 务try_next_item()。如果没有数据项可供驱动,这个任务将在同一simulation step中返回,此时可以让driver执行一些idle transactions,比如当没有有意义的数据要传输时,给DUT发送随机数据,如下图所示:
将处理后的数据发回给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)。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !