VLSI DV Interview Puzzles · All levels
Queue of Handle Cells Still Aliases
A sequence item stores a queue of class-handle cells. Why does `dst.cells[0].v` change when only `src` is modified after copy?
Puzzle
Difficulty: Medium · Puzzle 2 of 6 · Topic: Handle and Copy Puzzles
A sequence item stores a queue of class-handle cells. Why does `dst.cells[0].v` change when only `src` is modified after copy?
Code
class cell extends uvm_object;
`uvm_object_utils(cell)
int v;
function new(string name="cell"); super.new(name); endfunction
endclass
class tr extends uvm_sequence_item;
`uvm_object_utils(tr)
cell cells[$];
function new(string name="tr");
super.new(name);
cells.push_back(cell::type_id::create("c0"));
cells.push_back(cell::type_id::create("c1"));
endfunction
function void do_copy(uvm_object rhs);
tr r;
if (!$cast(r, rhs)) return;
cells = r.cells;
endfunction
endclass
initial begin
tr src = tr::type_id::create("src");
tr dst = tr::type_id::create("dst");
src.cells[0].v = 5;
dst.copy(src);
src.cells[0].v = 99;
$display("src=%0d dst=%0d", src.cells[0].v, dst.cells[0].v);
endHint
Queue assignment copies queue structure, but inspect the element type.
Step-by-step solution
1) `cells` is a queue of class handles, not packed values.
2) `cells = r.cells` duplicates queue indices but each element still points to the same `cell` objects.
3) Mutating `src.cells[0].v` mutates the shared object referenced by both queues.
4) Deep-copy by resizing `cells` and cloning each element in a loop.Answer
Answer: Because queue assignment is shallow for class-handle elements; both queues share identical `cell` objects.
Why candidates get it wrong
People treat class-handle queues like queues of ints and assume assignment implies value-copy.
Interviewer follow-up
How would you deep-copy while preserving element dynamic type if `cell` has subclasses?