| |||
这一篇主要会为大家介绍整个验证环境中一个小的子“环境”Agent,及构成这个小“环境”的Driver, Sequencer, Monitor等验证组件。Agent之于整个验证环境就相当于一个一个小车间之于整个工厂一样。
上一篇短文(戳这里直达~)主要介绍了彩虹糖验证平台中的interface和DUT。以下是上一篇短文中主要介绍的内容:
interface
interface jelly_bean_if(input bit clk);
clocking master_cb@(posedge clk);
modport master_mp(inputclk, taste, output flavor, color, sugar_free, sour);
DUT
module jelly_bean_taster(jelly_bean_if.slave_mp jb_slave_if);
· 正 · 文 · 来 · 啦 ·
一、Sequencer
之前提到的彩虹糖的Sequence也就是包含彩虹糖口味颜色以及数量的配方,在我们的验证环境中会首先发送给Sequencer,然后再由Sequencer将配方Sequence传送给Driver,由Driver生产出相应的彩虹糖。彩虹糖验证平台中的Sequencer直接使用的是UVM提供的uvm_sequener没有添加任何新的内容。在下面的代码中jelly_bean_transaction作为参数来创建我们的Sequencer的类型,表明我们定义的Sequencer只能收jelly_bean_transaction类型的配方。
图1. [Sequencer] jelly_bean_sequencer
二、Driver
Driver通过内部例化的seq_item_port这样一种UVM内部通信的TLM端口,从Sequencer获取配方内容jelly_bean_transaction。然后通过虚拟的接口(virtual interface)来驱动DUT,即将彩虹糖的内容解析出来转换成interface上端口的信号值并输出给DUT。virtual interface的传递是通过一种类似于共享资源池的机制uvm_config_db来完成的。如下面的代码所示:
第12-13行:使用uvm_config_db获取从TB顶层发送过来的virtual interface。
第22行:通过seq_item_port内置的[Task] get_next_item从Sequencer处获得item。
第24-24行:将激励内容解析之后驱动到端口上。
图2. [uvm_driver] jelly_bean_driver
三、Monitor
Driver的数据流向是从TB流向DUT,而Monitor的数据流向正好与此相反。Monitor也是通过从uvm_config_db中获取virtual interface进而使得其能够监测DUT端口上的信号。Monitor会在每个时钟周期都检查接口jelly_bean_if上的信号值,当监测到我们生产出了一个无味(NO_FLAVOR)的有问题的彩虹糖时,就会立刻将此时interface上的信号值按彩虹糖配方的形式打包成jelly_bean_transaction。新创建的监测配方jelly_bean_transaction将通过另外一种TLM通信端口analysis_port经由Agent发送给客服中心的受理平台Subscriber来进行进一步的分析。如下面的代码所示:
第23行:在每个时钟周期的上升沿,通过interface检测生产出来的彩虹是否是无味的。
第24-28行:将采样到的信号打包成jelly_bean_transaction。
第16行:创建一个uvm_analysis_port用来和Agent中的相应的端口连接。
第31行:将打包好的jelly_bean_transaction通过uvm_analysis_port的[Task] write发送出去。
图3.[uvm_monitor] jelly_bean_monitor
四、Agent
Sequencer, Driver, Monitor被封装在Agent里面,可以构成一个独立的小整体,完成DUT的驱动以及信号的监测。这些uvm_component在Agent的build_phase中创建,在connect_phase中完成Driver和Sequencer等TLM通信端口的连接。
第18-20行:在build_phase中创建了Driver, Sequencer以及Monitor。
第25行:在connect_phase中完成了Driver中的seq_item_port和Sequencer中的seq_item_export端口的连接。
第26行:完成了Monitor的uvm_analysis_port和Agent的uvm_analysis_port的连接。
图4.[uvm_agent] jelly_bean_agent
五、总结
Sequence, Sequencer, Driver之间的数据流动
图5.Seqence, Sequencer以及Driver之间的数据传输
在UVM环境中一个uvm_sequence_item基本上就代表了我们激励的最小单元,一个item的产生到被消耗是UVM中主要的数据流动。item的生命周期起始于Sequence的body()任务中。在Sequence中完成激励item的创建与发送。Sequencer主要完成Sequence发送过程中的仲裁,并完成与Driver的握手传输,起的是连接Sequence与Driver的桥梁作用。Driver在接受到Sequencer传送过来的item之后会解析item中的内容,然后按照一定的时序将内容驱动到接口上进而驱动DUT。
如上图所示one_jelly_bean_sequence在其[Task] body()任务中创建好一个item也就是jelly_bean_transaction。然后Sequence调用start_item()方法去向Sequencer申请仲裁并试图获取可以传输给Driver的授权。Sequnencer会查看Driver是否有需要Sequence的需求并且结合设定的仲裁模式授予某个Sequence可以通过的权限。Sequence在获得授权之后,将要发送的item进行随机化,继而调用finish_item()方法将随机好的item发送出去,然后等待Driver返回一些反馈信息。在Driver一侧,其通过与Sequencer相连接的TLM端口获取传送过来的item,完成item的驱动,最后产生一些反馈信息,重新通过TLM端口经有Sequencer返回给Sequence。Sequence在接受到反馈信息之后完成整个item的发送。一次完整的数据传输过程也就结束了。
彩虹糖系列文章