【PCIe】CDNS PCIe VIP 杂记 -- Callback

最近在研究Cadence PCIe VIP,怎一个“惨淡”来描述。用的真是一言难尽啊,都是泪。

记录一些最近学习的觉得想记录的内容在此,仅供参考讨论学习哈。有不对之处请指出大家一起讨论。

本文记录最近正在研究学习的Callback,只针对Cadence PCIe VIP。

Callback作用和分类

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第1张图片

Callback可以在不进行polling的前提下,被TestBench用作来告知什么event被触发了。有以下几种用法:

  • 同步transaction
  • 进行记录跟踪比对
  • 错误注入
  • coverage使能

Cadence PCIe VIP有两种类型的callback:

  • 数据类型callback(Transaction Callback)
    • 数据包所经之“路”上的不同的点都会被trigger
  • 存储类型callback(Memory Callback)
    • 当寄存器或者memory空间被读写访问时,这类callback会被trigger

Packet Callback介绍 

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第2张图片

从上面这张图可以清楚的看出什么点有什么样的callback。个人觉得这张图是CDNS PCIe VIP Callback使用的精髓所在,有种犹如一张“神”图在脑,对“战况”了如指掌的感觉。(哈哈哈哈,夸张夸张哈,反正就是这张图真有用)

Along with details of packet callback, it is important to know about built-in queues in PCIe VIP.
Queues transport data from one layer to the other or represent a change in the contents of the packet.

Following the callback PCIE_CB__exit, the callback PCIE_CB__enter for the next queue is called and the Transaction Layer Packet (TLP) enters the next queue in the dataflow.
Packets can be modified only at entry or start callback points, and not at exit or end callbacks. Exit and end callbacks can only be used for viewing and capturing packets for score-boarding,
synchronization, or coverage purposes.
The Above diagram shows packet queues which are present in PCIe VIP and can be viewed in the tracefile. Corresponding to all queues mentioned, there are callback function which can be used in user testbench.

  • 这里有个packet queue的概念,对应每一个协议层。
  • 只能在开始callback点进行packet更改。
  • 退出callback点只能进行查看view, 捕获capture,以方便进行比对,同步或者coverage收集。

Enabling a Callback

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第3张图片

这里要注意的就是,callback的打开是会影响仿真时间的。所以UG里建议只enable使用的。

【=======================下面是我自己真实仿真举例=========================】 

  • 我的sequence是对同一个地址先后进行写(MWr_32)和读(MRd_32);
  • 我的意图是想每次发完等待MRd_32数据完全读回来,才进行下一次写操作;
  • 除了直接hardcode delay时间外,就是调用callback函数。
    • hardcode delay真的很难把控,和TLP包的数据大小,仿真环境大小等等都有关。或者可以直接说这种行为一点都不可取。
    • 根据packet callback diagram和UG相关内容,我们可以用Completion Queue的callback TL_TX_completion_queue_exit.
  • 此Callback相关的描述如下。可以看出当所有completion都收到后会trigger这个callback,正好符合我想要check的点(MRd读数据都返回回来)。

  •  实际应用如下:
    • Callback应用code 

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第4张图片

  • 仿真结果1):
    •  Read/NP TLP也直接return。可以看出来在同一个时间点所有TLP包被驱动。

  • 仿真结果2):
    •  NP TLP不return。可以看出来每次read TLP drive后再到callback被trigger是有时间delay的。

【=======================上面是我自己真实仿真举例===========================】 

检查Transaction Callback是否被enable

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第5张图片

即在tracefile里去搜如上关键字。

dentranscbkset后的第一个数字时instance ID号,第二个数字时transaction callback ID号。因此上面的结果时说VIP instance ID为0,有callback ID为11 和12两个被enable了。

用如下command来查看instance。

 grep " i " trace_log

得到

0 i top.RC
2 i top.EP

另外,从$DENALI/ddvapi/sv/denaliPcieTypes.svh里可以找到denaliPcieCbReasonT各个callback 枚举变量的值。

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第6张图片 检查Memory Callback是否被enable

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第7张图片重载Callback Function

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第8张图片

这时UG里这么写的,实际我在应用过程中,我是在cdnPcieUvmUserMonitor里重载的function。从目前版本的VIP code里看, 我的理解最终的实现还是在monitor里,感觉这里和上面的UG有些出入。

update更新:【CDNS VIP版本也是不断再更新的,具体实现也是不断更新的】

新版本的CDNS  PCIe VIP callback使用方法如我上面所说,实际是在monitor实现的。

新的doc 描述:

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第9张图片

这里首先讲了callback function是在 class denaliPcieInstance里定义的;其次讲了一个callback一个function,且当callback 被enable以及event触发时,function会执行;最后以DefaultCbF为例,说了DefualtCbF function的具体实现。

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第10张图片

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第11张图片

 【PCIe】CDNS PCIe VIP 杂记 -- Callback_第12张图片

 【PCIe】CDNS PCIe VIP 杂记 -- Callback_第13张图片

Callback Events and Ports

每一个PCIe VIP的transaction callback都有一个UVM analysis portUVM event

【PCIe】CDNS PCIe VIP 杂记 -- Callback_第14张图片

  • analysis port可以用来表示事务非阻塞传播。
  • uvm_event经常被用在TB sequence中,来等待某个event触发。
    • 可以用wait_trigger_data();来判断event是否发生。

[注]:这里是uvm_event,和SV中的event区分开来。

未完待续......

你可能感兴趣的:(PCIe,VIP,开发语言)