Static, this và const: xác định thứ gì dùng chung và thứ gì bị giữ cố định
Tiên quyết
Sau bài này bạn sẽ
- Phân biệt static property với dữ liệu riêng mỗi object
- Dùng this để chọn field của object hiện tại
- Giới hạn const theo biến được bảo vệ và ghi rõ giới hạn công cụ
Ba câu hỏi khác nhau về trạng thái
Created đếm tổng số Counter đã tạo; serial gắn với từng object; value có thể thay đổi theo object. Gộp chúng thành một loại biến khiến ID bị lặp, dữ liệu bị chia sẻ hoặc caller hiểu nhầm tính bất biến. Hãy hỏi phạm vi chia sẻ và quyền sửa cho từng field.
Static property có một bản trong class này
Counter.created khởi tạo 0 và tăng một lần trong mỗi constructor. Tạo ba object cho tổng 3; gán alias_handle=first không gọi constructor nên không tăng count. Count này là số lần construction trong ví dụ, không phải số object đang sống, số handle hay một phép đo garbage collection.
Static method có thể gọi trước khi tạo object
Counter::total() được gọi trước new và trả 0, rồi trả 3 sau ba lần new. Nó đọc static created, không ngầm có một object hiện tại để đọc value. Phân biệt static class method với lifetime của local variable; bài không dùng cú pháp function static hoặc hứa mọi tool hỗ trợ biến thể đó.
This chọn field của object đang nhận call
Constructor nhận formal value rồi gán this.value = value. Method add cũng nhận value và cộng vào this.value. Với first 3 rồi add 4, field thành 7; second được sửa riêng thành 50; third giữ 8. Nếu bỏ this trong phép gán có shadowing, field có thể không nhận input.
Instance const serial được gán trong constructor
Mỗi object có const int serial, được gán lần lượt 1/2/3 từ created trong constructor. Main chỉ ghi serial tại construction rồi đọc để kiểm. Không biến const runtime property thành parameter hoặc compile-time constant; negative parser probe ghi serial sau new phải bị từ chối đúng diagnostic trước khi được báo là đã kiểm.
Const handle không đồng nghĩa mọi dữ liệu phía sau bất biến
Counter.contents là const handle tới Payload. Trong main, một handle thường mutable_view nhận contents rồi sửa object qua mutable_view.data=55; đọc qua first.contents thấy 55. Case đã chạy chỉ chứng minh const handle không tự tạo snapshot hoặc đóng băng object thông qua mọi alias.
Giữ riêng capability probe mà tool chưa chạy được
Probe viết trực tiếp first.contents.data = 55 được pyslang chấp nhận nhưng Verilator 5.050 từ chối với CONSTWRITTEN trước runtime. Giữ nguyên probe và diagnostic ở toolcheck/probes, không tắt diagnostic hoặc gọi direct-member write là pass. Main dùng đường alias nêu rõ ở section trước; điều đó không chứng minh direct syntax được hỗ trợ trên simulator này.
Ba instance, một alias và một view tới payload
Expected tính trước chạy: static total0→3, serial 1/2/3; value 7/50/8; payload thấy 55 qua alias; alias_handle vẫn cùng identity với first. Chỉ claim parse và simulation 2-state của source chính; không claim synthesis, GC timing hoặc full const semantics.
Tự kiểm tra
Ghi rõ sharing và mutability riêng cho từng lớp dữ liệu
Dùng static cho dữ liệu thực sự dùng chung, this cho receiver hiện tại và const cho binding/field cần bảo vệ. Khi cần transaction bất biến, phải review cả alias tới object bên trong. Một const handle đơn lẻ không thay thế ownership hoặc deep-copy contract.
Nguồn và mức độ đối chiếu
- SystemVerilog Static Variables & Functions — bản chụp resources.zip, Nguồn đào tạo đã đọc theo section. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b5.static-this-const, Bằng chứng thực nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class handles, construction, static and const properties. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b5.static-this-const, Source, self-checks, verification.json và mutation/capability probes. Trích dẫn; nguồn đã đọc toàn văn.
- SystemVerilog Static Variables & Functions — bản chụp resources.zip, The Default: Each Instance Gets Its Own Copy; Static Variables; Static Functions. Trích dẫn; nguồn đã đọc các mục liên quan.
- this keywords in classes — bản chụp resources.zip, Example without this keyword; Example with this keyword; Example for this keyword with static method. Trích dẫn; nguồn đã đọc các mục liên quan.
- Constant class properties in SV — bản chụp resources.zip, Global constants; Instance constants. Trích dẫn; nguồn đã đọc các mục liên quan.