agent组件是UVM验证中重要的组件内容,在其中包含driver/sequencer/monitor组件。其核心功能是实现一组特定总线的控制:transaction发送/接收、抓取总线数据流、协议检查、错误注入等。对于无现成VIP的UVM验证项目,agent必须由验证人员开发。interface划分,决定了agent组件结构以及实现方法,是agent组件开发的基础,也是重要的准备事项。
常见UVM验证架构,其中包含数个agent组件,以下图为例,其包含一个active agent(in_agent)和一个passive agent(out_agent)。agent组件是UVM验证中重要的组件内容,在其中包含driver/sequencer/monitor组件。其核心功能是实现一组特定总线的控制:transaction发送/接收、抓取总线数据流、协议检查、错误注入等。
如果项目所需接口总线有现成的VIP可供使用,那么agent的所有功能都会集成在VIP中。验证人员只需合理使用VIP即可。对于无现成VIP的UVM验证项目,agent必须由验证人员开发。
interface划分,决定了agent组件结构以及实现方法,是agent组件开发的基础,也是重要的准备事项。
以如下一个DUT项目为例,AXI总线直接使用新思VIP;Avalon和AVMM总线,由于自定义修改较多,无现有的VIP可以使用。
一、Avalon总线interface划分
Avalon总线端信号如下,总线可以区分为写请求、读请求以及读响应。功能上,DUT始终是作为slave设备,无法主动发起操作;无寄存器访问需求;无case读操作需要携带响应返回需求。
由于写请求、读请求以及读响应三各功能所需总线信号独立且近似,对于这类总线,我们可选:
- 将三组信号合并到同一个interface也就是agent中,这也是常用的interface处理方式。这种处理方式与稍后介绍的AVMM总线划分处理方式相同。
- 将它们区分成三个agent,由于信号相似,所以也只需要开发一个agent组件代码。在env中使用时例化成三份即可。这一小结介绍这种划分处理方式。
由于agent代码只有一份,所以此agent例化成三份时,其分别承担的角色是:
- 写请求:agent组件是作为master,发起对dut的写请求。
- 读请求:agent组件是作为master,发起对dut的读请求。
- 读响应:agent组件是作为slave,接收来自于dut的读响应。
interface组件与之类似的,需要区分作为master和slave的角色,如下。建立三个clocking,分别作为master、slave,以及monitor使用,这是基于输入输出方向产生的结果。
与此同时,agent对应的config类需要添加对应的设置来区分master和slave。
由于agent说承担的角色不同,所以driver组件也需要针对master和slave有不同的处理逻辑。代码上通过条件选择执行master或者slave功能,使用clocking mst_cb和slv_cb;monitor中使用clocking mon_cb。
在完成agent组件开发后,env将引用agent并将其实例化。此处,env将例化产生写请求、读请求和读响应三个agent组件,三个agent组件使用相同的agent代码例化而来,通过给其config类设置不同的角色,让最终按照需求生效。
总结,使用此方式,依赖其良好的拓展性,可以有效的减低interface/agent组件内容,也方便后续总线扩展。如果后续项目新增写响应通路,UVM验证环境甚至完全不需要对interface/agent内容进行修改,只需要在env中多例化一份写响应即可。
但这种方式,也有需要注意的内容:
- 被划分的总线,功能上,各通道之间不要求有联系。比如:读操作需要携带数据返回,这是由于响应来自于另一个agent,跨agent的处理相对艰难。换而言之,这种划分,更适合数据通路相关的验证,此时数据比对完全由reference model和scoreboard承担,agent只关心发送过程,不关注响应结果。
- 注意区分active/passive,和master/slave区别。
二、AVMM总线interface划分
AVMM总线端信号如下,总线可以区分为tx/rx方向。功能上,DUT可以作为slave设备,接收外部的寄存器访问(rx接收请求,tx响应);也可以作为master设备,向外发起请求(tx发送请求,rx接收响应)。
由于一个agent中集成了所有的总线信号,所以也无需在其对应的config中定义master/slave角色。driver组件使用clocking drv_cb实现tx/rx信号所有连接;monitor中使用clocking mon_cb。
最终在env中仅需将此agent例化一次。如果有多组AVMM总线,则对应例化。
总结,使用此方式,集成了所有总线信号,方便做信号间的联系处理,如rx接收读寄存器地址,等待tx响应寄存器读取结果,然后将其赋值到transaction中返回给case。