Parameterized class: mỗi specialization có type và trạng thái static riêng

Khoảng 45 phútMức 3/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 type/value parameter với constructor argument
  • Kiểm conversion theo element type được chọn
  • Quan sát static property riêng cho hai specialization

Một container cần nhiều type nhưng không thể bỏ kiểm width

Box giữ hai phần tử. Box int và Box byte cùng dùng source định nghĩa, nhưng phép lưu 300/511 có kết quả khác. Generic code không làm mọi type có cùng miền giá trị hoặc cùng phép toán hợp lệ.

Type parameter quyết định element type

Box #(type T=int, int N=2) định nghĩa values theo T và N. Typedef IntBox dùng int, ByteBox dùng bit 8; main cấp phát object từ hai specialization này. T không phải một property có thể đổi type lúc runtime.

[1]

Value parameter khác constructor input

N quyết định fixed-array size trong class specialization; bài chỉ chạy N=2. Constructor khởi tạo từng phần tử 0 và tăng static counter. Muốn một buffer resize runtime cần thiết kế storage khác, không sửa N trong một object đã tạo.

ByteBox giữ byte đã conversion trước khi cộng

IntBox nhận 300/511 nên sum 811. ByteBox nhận explicit 8 bit casts, giữ 44/255 nên sum 299. Sum trả int nên không tự thu hẹp tổng 299 về 8 bit; phải xét type ở từng điểm assignment và return.

Static count không gộp mọi specialization

Main tạo hai IntBox và một ByteBox. IntBox.created phải 2, ByteBox.created phải 1. Không suy classname chung trong source có nghĩa chỉ có một counter cho toàn bộ type/value parameter combinations.

Hai object cùng specialization vẫn có dữ liệu riêng

A nhận hai giá trị, B mới tạo vẫn sum 0. A và B chia sẻ static counter của IntBox nhưng không chia sẻ values. Đây là hai trục khác nhau: specialization chọn type, instance chọn object storage.

Type hợp lệ chưa chắc dùng được với mọi method generic

Method sum trong bài cast element về int. Bài không hứa Box string, class handle hoặc real có cùng semantics, không kiểm N 0/negative, invalid index hoặc overflow. Mutation byte đầu 44→45 bị assertion parameter specialization width, storage or static scope bắt.

Hai specialization và ba object

Expected trước chạy: int_sum811,byte_sum299,untouched 0,int_created2,byte_created1,byte_bits8. Không thay expected bằng kết quả conversion tình cờ quan sát; tính 300 mod 256=44 và 511 mod 256=255 trước chạy.

Parameterized class: mỗi specialization có type và trạng thái static riêng

Expected tính trước chạy: PARAM CHECK int_sum=811 byte_sum=299 untouched=0 int_created=2 byte_created=1 byte_bits=8

tb.sv testbench
`timescale 1ns/1psclass Box #(type T=int,int N=2);  static int created=0;  T values[N];  function new();created++;foreach(values[i])values[i]=T'(0);endfunction  function void put(int index,T value);values[index]=value;endfunction  function int sum();int result=0;foreach(values[i])result+=int'(values[i]);return result;endfunctionendclasstypedef Box#(int,2) IntBox;typedef Box#(bit[7:0],2) ByteBox;module tb_param;  IntBox a,b;  ByteBox c;  initial begin    a=new();b=new();c=new();    a.put(0,300);a.put(1,511);c.put(0,8'(300));c.put(1,8'(511));    if(a.sum()!=811||b.sum()!=0||c.sum()!=299||IntBox::created!=2||ByteBox::created!=1||$bits(c.values[0])!=8)      $fatal(1,"parameter specialization width, storage or static scope");    $display("PARAM CHECK int_sum=811 byte_sum=299 untouched=0 int_created=2 byte_created=1 byte_bits=8");    $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: PARAM CHECK int_sum=811 byte_sum=299 untouched=0 int_created=2 byte_created=1 byte_bits=8

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

Chỉ T=int/bit 8,N 2 với validindex và hai specialization; không claim mọi T/N, invalidindex hoặc overflow.

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: param-class

  1. IntBox và ByteBox lưu 300/511 rồi sum cho kết quả nào?
  2. Hai IntBox và một ByteBox có created lần lượt thế nào?
  3. B mới tạo cùng IntBox specialization có sum bao nhiêu?
  4. 300 và 511 được giữ trong byte 8 bit thành gì?
  5. Bài đã kiểm Box với mọi T/N chưa?

Ghi contract cho từng specialization được hỗ trợ

Liệt kê T/N được dùng, conversion tại API và ý nghĩa counter. Test nhiều object cùng specialization và nhiều specialization khác nhau. Một class generic compile cho một type không chứng minh mọi type parameter đều được hỗ trợ.

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

  1. SystemVerilog Parameterized Classes — 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.param-class, 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.param-class, Source, self-checks, verification.json và mutation/capability probes. Trích dẫn; nguồn đã đọc toàn văn.
  5. SystemVerilog Parameterized Classes — bản chụp resources.zip, Syntax; Parameterizing a Value (Size); Parameterizing a Data Type. Trích dẫn; nguồn đã đọc các mục liên quan.