【PCIe】CDNS PCIe VIP -- Callback使用举例
【PCIe】CDNS PCIe VIP 杂记 -- Callback-CSDN博客
前言:之前针对CDNS PCIe VIP Calback部分进行了学习,并写了上面的博客。学习就是为了应用,本文就将记录一些我实际用到的我觉得比较典型的例子。仅供学习参考。
需求:
PCIe VIP作为EP,DUT是RC。EP发了一笔memory write,后对同一个地址进行memory read,想要check都回来的read data和write data是否一致。
注:实际按照CDNS PCIe VIP UG里讲的使用方法,VIP的使用一般都是成对出现的,即一个active agent(这里是EP本P)和一个passive agent(这里是DUT RC的monitor)作为monitor。因此,即使不做上述需求的check,这里的active和passive agent也是会进行比对的。从实际仿真结果也证明如此。
分析&实现:
对于read data:
基于callback的学习认知,可以从callback入手。之前的博文里也说了,对于read data可以从callback:TL_TX_completion_queue_exit里从payloadAccumulated[]获得。
第一种方法:
在CbF里直接从payloadAccumulated[]中获取read data。具体实现code如下。
基于我之前博文讲的,这种方法的实现其实是在monitor重载CbF function函数的。
但是这种方法,因为在function实现的,不能在仿真过程中实时进行比对。【当然,针对单一test测试,所有操作包括check都可以在monitor里实现,但并不通用】至少目前为止,我自己并没有找到合适好用的方法。因此,此方法比较适合monitor。
第二种方法:?
?在sequence里实现,即在发送完memory read request traffic后,并行等待TL_TX_completion_queue_exit callbck trigger后,进一步获取read data。具体实现code如下。
对于write?data:?
和read data类似,我们也可以从相应的callback函数获取,具体如下。
第一种方法:
根据这张图https://img-blog.csdnimg.cn/direct/7ab567150aa24a8496bfbe89c53d7fc2.png看,可以从callback:TL_TX_packet或者TL_transmit_queue_exit里获取。
由于我knowledge的limitation,目前我觉得这种只适合进行monitor使用。
第二种方法:
同样在sequence里进行实现。在实现过程中,我也尝试过从调用callback着手,但是如下这种实现方式会造成仿真hang。
之前一直找不到原因,后来对callback打印信息的capture,发现:比如我这里连续发了2笔write和2笔read,VIP model是会将这4笔traffic同时放到transmit queue里的。从实际仿真的时间戳也可以看出来。因此,我上面的while是会漏capture的。【除非就是没发一笔就等一笔,但这样就和我之前讲的一样,会造成仿真一笔一笔发送-完成,这在大量traffic的仿真很不现实也不通用】
因此,就只能【目前基于我自己的knowledge】在发traffic的时候获取地址和write data,这很容易办到。打印信息也如上。因此在sequence里做data check也就顺利成章了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!