【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如下。

【PCIe】CDNS PCIe VIP -- Callback使用举例_第1张图片

基于我之前博文讲的,这种方法的实现其实是在monitor重载CbF function函数的。

但是这种方法,因为在function实现的,不能在仿真过程中实时进行比对。【当然,针对单一test测试,所有操作包括check都可以在monitor里实现,但并不通用】至少目前为止,我自己并没有找到合适好用的方法。因此,此方法比较适合monitor。

第二种方法: 

 在sequence里实现,即在发送完memory read request traffic后,并行等待TL_TX_completion_queue_exit callbck trigger后,进一步获取read data。具体实现code如下。

【PCIe】CDNS PCIe VIP -- Callback使用举例_第2张图片

对于write data: 

和read data类似,我们也可以从相应的callback函数获取,具体如下。

第一种方法:

根据这张图https://img-blog.csdnimg.cn/direct/7ab567150aa24a8496bfbe89c53d7fc2.png看,可以从callback:TL_TX_packet或者TL_transmit_queue_exit里获取。

由于我knowledge的limitation,目前我觉得这种只适合进行monitor使用。

【PCIe】CDNS PCIe VIP -- Callback使用举例_第3张图片

第二种方法:

同样在sequence里进行实现。在实现过程中,我也尝试过从调用callback着手,但是如下这种实现方式会造成仿真hang。

【PCIe】CDNS PCIe VIP -- Callback使用举例_第4张图片

之前一直找不到原因,后来对callback打印信息的capture,发现:比如我这里连续发了2笔write和2笔read,VIP model是会将这4笔traffic同时放到transmit queue里的。从实际仿真的时间戳也可以看出来。因此,我上面的while是会漏capture的。【除非就是没发一笔就等一笔,但这样就和我之前讲的一样,会造成仿真一笔一笔发送-完成,这在大量traffic的仿真很不现实也不通用】

【PCIe】CDNS PCIe VIP -- Callback使用举例_第5张图片

因此,就只能【目前基于我自己的knowledge】在发traffic的时候获取地址和write data,这很容易办到。打印信息也如上。因此在sequence里做data check也就顺利成章了。

你可能感兴趣的:(VIP,PCIe,VIP)