Shallow và deep copy: độc lập ở tầng nào của transaction?

Khoảng 45 phútMức 2/3Bản nháp: một số khẳng định chưa đối chiếu spec

Sau bài này bạn sẽ

  • Phân biệt assignment handle, shallow copy và copy có ownership riêng
  • Kiểm identity của cả object ngoài và object con
  • Ghi rõ giới hạn của clone đối với null và đồ thị object

Snapshot cần giữ dữ liệu dù producer sửa tiếp

Scoreboard giữ expected rồi producer đổi transaction để dùng lại. Một bản copy chỉ độc lập ở object ngoài vẫn có thể chứa handle tới payload producer đang sửa. Cần xác định tầng nào phải độc lập, thay vì chỉ hỏi đã gọi new hay chưa.

Gán handle không tạo transaction thứ hai

B5.class-handle đã kiểm việc hai handle trỏ cùng object. Khi cần snapshot, assignment không đủ. Trong bài này, Frame có id kiểu int và payload kiểu handle tới Payload; hai member có cách chia sẻ khác nhau khi copy.

[1]

New source tạo object ngoài mới, giữ nested handle

shallow = new original là cú pháp shallow copy được kiểm trong ví dụ. Shallow khác identity với original, id được copy, nhưng hai payload handle vẫn trỏ cùng object. Source còn có static constructed để kiểm constructor không chạy lại cho shallow copy trên flow này.

Clone tự viết phải quyết định ownership của từng member

Method clone tạo Frame mới, copy id rồi tạo Payload mới với value cũ nếu payload nguồn khác null. Main kiểm cả Frame identity và Payload identity trước khi sửa dữ liệu. Không có phép copy chung tự hiểu mọi policy của transaction trong dự án.

Sửa nguồn sau copy để phân biệt hai đường

Ban đầu original có id 1 và payload 7. Sau copy, nguồn đổi id 9/payload 30. Shallow giữ id 1 nhưng thấy payload 30; deep giữ id 1/payload 7. Chỉ so ba object ngay sau copy chưa đủ, vì chúng đều có cùng dữ liệu tại thời điểm ấy.

Clone phải có hợp đồng cho nested null

Main tạo thêm Frame rồi đặt payload=null; clone của nó phải là Frame khác có payload=null. Code không dereference null hoặc tự tạo payload mặc định 7 để che trạng thái absent. Tổng constructor 4 gồm original, deep, empty và empty_copy; shallow không thêm một lần.

Một cấp clone chưa giải quyết mọi đồ thị object

Example chỉ có một nested Payload không chứa handle khác. Nếu có cycle, shared child giữa nhiều field, derived type hoặc external resource, cần policy riêng để giữ đúng identity và tránh recursion vô hạn. Không gọi method này là deep clone tổng quát cho mọi transaction.

Kiểm cả identity và dữ liệu sau mutation

Expected trước chạy: outer identity khác; nested shallow thấy 30; deep giữ 7; shallow id 1/original id 9; null được giữ; constructed 4. Mutation thay allocation payload bằng gán handle bị bắt với symptom deep clone must own nested storage.

Shallow và deep copy: độc lập ở tầng nào của transaction?

Expected tính trước chạy: COPY CHECK outer_distinct=1 shared_nested=30 deep_saved=7 shallow_id=1 original_id=9 null_preserved=1 constructors=4

tb.sv testbench
`timescale 1ns/1psclass Payload;  int value;  function new(int value=7);this.value=value;endfunctionendclassclass Frame;  static int constructed=0;  int id;  Payload payload;  function new();constructed++;id=1;payload=new();endfunction  function Frame clone();    Frame result;    result=new();result.id=id;    if(payload==null)result.payload=null;    else result.payload=new(payload.value);    return result;  endfunctionendclassmodule tb_copy;  Frame original,shallow,deep,empty,empty_copy;  initial begin    original=new();shallow=new original;    if(Frame::constructed!=1||original==shallow||original.payload!=shallow.payload)$fatal(1,"shallow copy outer versus nested identity");    deep=original.clone();    if(deep==original||deep.payload==original.payload)$fatal(1,"deep clone must own nested storage");    original.id=9;original.payload.value=30;    if(shallow.id!=1||shallow.payload.value!=30||deep.id!=1||deep.payload.value!=7)$fatal(1,"copy independence contract");    empty=new();empty.payload=null;empty_copy=empty.clone();    if(empty_copy==empty||empty_copy.payload!=null||Frame::constructed!=4)$fatal(1,"clone null or construction count");    $display("COPY CHECK outer_distinct=1 shared_nested=30 deep_saved=7 shallow_id=1 original_id=9 null_preserved=1 constructors=4");    $finish;  endendmodule

Đã kiểm chứng thế nào

  • Phân tích và elaborate theo LRM (pyslang 12.1.0)
  • Mô phỏng, exit 0 và output khớp kỳ vọng tính tay (Verilator 5.050, 2-state)

Output phải khớp: COPY CHECK outer_distinct=1 shared_nested=30 deep_saved=7 shallow_id=1 original_id=9 null_preserved=1 constructors=4

Verilator 2-state, không claim X/Z hoặc synthesis.

Một nested Payload, null policy rõ; không claim clone mọi cyclic/shared graph, derived dynamic type hoặc external resource.

Các kiểm tra chạy lúc xây dựng nội dung (2026-11-06), không chạy trong trình duyệt. Kỳ vọng được tính tay trước khi chạy.

[2]

Tự kiểm tra

Tự kiểm tra: copy

  1. Sau sửa original.payload thành 30, shallow và deep thấy giá trị nào?
  2. Static constructed cuối main bằng bao nhiêu?
  3. Sau original.id=9, shallow.id bằng bao nhiêu?
  4. Clone một Frame có payload=null giữ trạng thái gì?
  5. Example đã chứng minh clone đúng cho mọi cyclic object graph chưa?

Review copy theo sơ đồ ownership

Vẽ object ngoài và từng handle con. Với mỗi đường tham chiếu, quyết định share hay copy, null có nghĩa gì và ai có thể sửa sau khi gửi. Test phải sửa nguồn sau copy và kiểm cả identity; một hàm tên clone không tự bảo đảm snapshot độc lập.

Nguồn và mức độ đối chiếu

  1. Copying Techniques in SV — bản chụp resources.zip, Nguồn đào tạo đã đọc. Trích dẫn; nguồn đã đọc các mục liên quan.
  2. Thí nghiệm nguyên bản ex.b5.copy, Bằng chứng thực nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
  3. IEEE 1800-2023 SystemVerilog LRM, Class handles, inheritance, virtual methods, access and parameterization. Chưa đối chiếu với văn bản nguồn (chưa mở).
  4. Thí nghiệm nguyên bản ex.b5.copy, Source, self-checks, verification.json và mutation/capability probes. Trích dẫn; nguồn đã đọc toàn văn.
  5. Copying Techniques in SV — bản chụp resources.zip, Shallow copy in SystemVerilog; Example for shallow copy. Trích dẫn; nguồn đã đọc các mục liên quan.
  6. Deep copy in SystemVerilog — bản chụp resources.zip, Deep copy Example; Highlights. Trích dẫn; nguồn đã đọc các mục liên quan.