1. SystemVerilog对象复制基础概念
在SystemVerilog验证环境中,对象复制是一个高频使用但容易被误解的操作。我刚接触SV时,曾经因为不理解复制机制导致整个测试平台出现数据污染,后来花了三天时间才排查出问题根源。对象复制本质上涉及内存管理和引用机制,理解这个机制对构建稳定的验证环境至关重要。
SystemVerilog中的class对象本质上是通过句柄(handle)操作的动态内存块。这个句柄类似于C++中的指针,但语法上更接近Java的引用。当我们声明一个class变量时,实际上创建的是一个能指向该类实例的句柄,而不是对象本身。例如:
systemverilog复制class Packet;
int address;
bit [7:0] payload;
endclass
Packet pkt1; // 仅声明句柄,此时对象尚未创建
pkt1 = new(); // 现在才真正创建对象
2. 浅复制(Shallow Copy)的陷阱与原理
2.1 默认复制行为分析
SV的浅复制是许多验证工程师踩过的第一个坑。我见过不少同事在构建scoreboard时,直接使用赋值语句复制transaction对象,结果导致参考模型和监测数据莫名其妙地被修改。浅复制的核心特点是仅复制对象的一级成员变量,对于嵌套的对象成员则只复制句柄引用。
systemverilog复制class Nested;
int value = 100;
endclass
class Container;
int id = 1;
Nested obj = new();
endclass
Container orig = new();
Container copy = new orig; // 浅复制
在这个例子中,copy.id会获得orig.id的值拷贝(1),但copy.obj与orig.obj指向的是同一个Nested对象实例。修改copy.obj.value会直接影响orig.obj.value,这往往不是我们想要的效果。
2.2 内存布局可视化
通过内存示意图可以更直观理解浅复制的问题:
code复制原始对象orig:
[Container实例]
├─ id: 1
└─ obj:
