☰
【UVM技巧与踩坑总结】为何你的Coverage总是收到相同的数据包?
2026/10/29 19:29:01 网站建设 项目流程

在使用UVM进行芯片验证时,我们常会遇到分析端(如coverage、monitor等)收到的数据包(Packet)内容不符合预期的问题。本文通过一个实际例子深入剖析原因、根源,并提出解决方法,帮助大家在以后的验证工作中避开类似陷阱。


1. 现象描述

我们在UVM环境中构建了一个基本的数据流组件:

  • component_A:每个周期随机生成一个Packet并通过uvm_analysis_port发送出去。
  • component_B:通过uvm_blocking_get_port获取Packet,并通过另一个uvm_analysis_port继续传递。
  • func_coverage:订阅Packet并采样覆盖率。

理论上每个周期应有一个全新的随机Packet传入coverage采样,然而却发现:

无论发了多少个包,func_coverage 总是打印出最后一次发送的 Packet 内容!

这看起来就像只有最后一个包“覆盖”了前面所有的包。

2. 根因分析:浅拷贝 + 对象复用

观察component_A中的代码片段:

Packet pkt; // 类成员,仅实例化一次 ... pkt = new(); // 在build_phase中new一次 ... repeat (repeat_cnt) begin assert(pkt.randomize()); a_ap.write(pkt); // 发送同一个对象引用 end

UVM的uvm_analysis_port是一个浅拷贝通道,也就是说:

它传递的不是数据本身,而是对象的“引用”(指针)!

这意味着多个接收端拿到的其实是同一个对象的地址,只不过这个对象的内容在被不断修改。


3. 导致的后果

由于你复用了pkt对象,后续的randomize()调用改变的是同一个对象的内容:

  • 第一次发送时:pkt.addr = A1, pkt.data = D1
  • 第二次 randomize 后变成:pkt.addr = A2, pkt.data = D2

但因为引用没变,所有曾经发送出去的pkt实际上都变成了A2/D2。

这个问题通常体现在:

  • Monitor或Coverage只看到最后一个包
  • 比较或断言不通过(期望多个不同包)

4. 错误示例汇总

错误 1:复用对象发送

repeat (3) begin assert(pkt.randomize()); a_ap.write(pkt); end

错误 2:用类成员对象做中转覆盖

Packet pkt_cov; // 成员对象 ... pkt_cov.copy(pkt); ap.write(pkt_cov);

即使你调用了copy(),但如果你用的是类成员对象,仍然是在复用那个对象本身。


5. 正确做法 ✅

✅ 方法一:每次 new 一个对象发送

repeat (3) begin Packet pkt = new(); assert(pkt.randomize()); a_ap.write(pkt); end

6. 衍生思考:UVM中的对象生命周期与共享

在SystemVerilog中,class对象默认是引用语义。除非主动copy()或clone(),否则任何赋值或传递操作都只是传递指针。

📌 UVM分析端传递的是引用

uvm_analysis_port.write()调用不会复制对象,只是传指针。

📌 TLM FIFO的get()也是传指针

只有你显示调用copy()并分配新对象,才会真正创建一份“快照”。否则,后续修改会影响所有使用该引用的地方。


7. 总结经验教训

问题结论
多次发送同一个对象会造成覆盖、内容更新
TLM分析链是传引用接收端共享数据地址
使用成员变量做拷贝对象依然是同一个对象的引用

UVM开发中牢记:要发送不同数据,就必须创建不同的对象!


8. 建议:开发调试技巧

  1. 打印对象地址:$display("Packet address: %p", pkt);检查是否同一个对象。
  2. 用copy()不够,要配合new()使用。
  3. 封装send_packet函数:自动生成、复制对象,避免手动出错。
  4. 用factory创建更一致的对象:保持风格统一、便于调试。

9. 最后的话

UVM是强大但“坑”也多的验证平台,理解其底层对象机制与TLM传递行为,是写出稳定可靠环境的基础。希望本文能帮你少走一些弯路,写出更优雅的UVM测试平台。

欢迎留言讨论你在项目中遇到的类似问题,我们一起踩坑,一起成长!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询