课程链接:https://www.bilibili.com/video/BV1k7411H7Jo?p=28
检测接口数据的组件-monitor
chnl_monitor依靠其对应的chnl_interface从接口上面获取写入每个通道从端的数据,并且将其打包整理,写入到监测数据中
monitor_data用来存放监测到的数据,这里的data是个单数据,不是数组。这个变量被chnl_monitor和MCDT_monitor同时使用。在接下来的cheaker数据比较中,由于不需要做数据类型的转换,数据比较也比较简单。
在自定义结构体类型mon_data中,只包含两个成员:data和id。data只是一个单数据,不是数组,这和之前定义的chnl_transcation类不同,在那里data是动态数组。对于检测MCDT输入和输出端口的数据而言,不存在数据包的概念,因为每个数据之间都不存在联系。所以,用chnl_trans类型来监测数据事务类型是不妥的。
chnl_monitor和MCDT_monitor在监测数据时,都使用了monitor_data类型,也都只需要收集每个有效的数据和他们对应的id。chnl_monitor有成员变量name,在new函数中会被传入的参数赋值。在后期的消息打印中用来标记每个chnl_monitor实例的名字。virtual intf成员和上一讲介绍的chnl_initiator类的做法一样,通过set_interface函数由外部将指针传入接口,只有在获取了外部指针以后,才能利用virtual interface监测到硬件端口上的数据信息。
另一个成员变量是monitor_mb,用来发送监测到数据的mailbox句柄,chnl_monitor也需要和chnl_initiator一样执行工作,所以它也有任务run,执行的是mon_trans任务。它的功能是在每个时钟上升沿判断什么时候采集数据是有效的,从图中条件可以看出只有当valid和ready同时为1时才是有效的。注意:这里在判断四值逻辑时用的是三个等号。在有效数据到来后,将数据写入监测信号中,并且通过mon_mb句柄,最终写入到cheacker数据的缓存里面。与chnl_initiator类似的是,chnl_monitor也并没有例化mailbox,而是利用它的句柄,将数据最后写入到了cheacker中的mailbox实例中。
在实现了检测器channel_monitor后,可以看到对于MCDT来说,还差MCDT_monitor激励组件和监测组件就齐备了。
MCDT_monitor和chnl_monitor类似,不同之处在于传入的虚接口指针类型是MCDT_interface,该接口监测和驱动的数据内容不同于chnl_monitor中接收的chnl_interface。
最后,在主要的监测数据任务monitor_trans中,需要不断地等待有效的输出数据事件,即在时钟上升沿的同时,MCDT_vaild为1。由于MCDT的输出数据除了data还有id,所以需要将这两个数据都写入监测数据中。并且通过monitor_mailbox最终写入到cheacker的输出数据缓存中。
从那个关系图中可以看出,MCDT_checker可以用来数据比较的原因是MCDT_monitor和chnl_monitor将数据写入了checker中,以此可以进行数据比较。
下图是MCDT_checker类的定义。包括字符串变量name,error用来对错误计数,cmp用来对所有变量计数。三个输入端监测数据的mb和一个输出端监测数据的mb,在构建函数中分别对name,error和cmp做了初始化,以及例化了所有的mailbox实例。从输入端输出端均获取了数据以后就可以开始做比较。
如果比较错误,可以借助系统函数$error打印错误信息,如果成功就用$display函数打印信息。每一次比较,无论成功或者失败,都会给cmp_count计数,error_count只给失败计数。
到此,MCDT_checker这个重要的组件的实现就完成了,且验证环境中的各个组件都已经实现了,在下一节中要利用这些组件构成顶层的验证环境,并且连接他们,最终触发他们的运转,使得整个环境中的各个组件都能协调起来。