Net và variable: ai drive tín hiệu, ai giữ giá trị?
Tiên quyết
- Module A2: Logic tổ hợp: Đang tải
- Module A4: Tuần tự & timing: Đang tải
- Đọc Verilog từ token đến bốn trạng thái 0/1/X/Z: Đang tải
Sau bài này bạn sẽ
- Phân biệt resolution của net với gán biến trong process
- Đọc scalar/vector và chiều chỉ số mà không đảo bit
- Dự đoán Z, xung đột X, wired-AND/OR và pull trong ví dụ
- Giải thích vì sao logic/reg không đồng nghĩa một flip-flop vật lý
Một tín hiệu có thể có nhiều người drive
Hai thiết bị nối cùng một đường dữ liệu không có nghĩa “lệnh gán cuối cùng thắng”. Đường dây cần resolve các driver đang tác động. Nếu cả hai nhả Z, không ai chủ động đưa 0/1. Nếu hai driver cùng độ mạnh drive ngược nhau, mô hình wire thường cho X.
Đó là câu hỏi khác với một biến được cập nhật trong process. Ta dùng ví dụ 1 bit để nhìn rõ từng trường hợp, rồi thêm vector để tránh nhầm vị trí bit. Các quy tắc đầy đủ, đặc biệt mặc định ở port declaration, vẫn [1].
Net kind và kiểu dữ liệu là hai câu hỏi
Trong TB, wire bus_line là net nhận hai continuous assignments. logic mirror là biến được gán trong always @*. Hai chỗ không thể hoán đổi tùy ý chỉ vì đều chứa bit 0/1/X/Z trong mô phỏng.
logic mô tả kiểu dữ liệu bốn trạng thái; từ khóa này không tự tạo quy tắc resolve nhiều driver như wire. Ngược lại, việc dùng reg trong khai báo biến không tự suy ra một thanh ghi vật lý. Phải đọc cả nơi và cách gán.
Cụ thể, always @* mirror = bus_line ở TB chạy khi input liên quan thay đổi. Nó gán mirror đủ trong mỗi lần chạy, không có clock, và mirror theo cả X/Z của bus. Ví dụ này quan sát bằng simulation, không có báo cáo synthesis của mirror.
Không dùng bài này để đoán mọi mặc định net/variable của input, output, inout hoặc mọi kiểu wire logic. Khi cần phân loại port chính xác, phải đọc khai báo đầy đủ và LRM thay vì chỉ tìm chữ logic.
Cùng byte 96, index 0 khác nhau
TB có hai vector:
logic [7:0] descending = 8'h96;
logic [0:7] ascending = 8'h96;
96 hex là 10010110. Cả hai vector rộng 8 bit, nhưng chỉ số bên trái là 7 ở vector đầu và 0 ở vector sau. Vì vậy descending[0]=0, còn ascending[0]=1. Gán cùng literal không làm cùng số index mang cùng trọng số ở hai chiều range khác nhau.
logic scalar chỉ rộng 1 bit trong chương trình. TB kiểm $bits(scalar)==1 và $bits(descending)==8. Khi nối bus vào port, kiểm cả độ rộng và quy ước index; đừng sửa số index theo hình thức chỉ để hết warning.
Bus có hai driver: Z, giá trị hay X?
Hai continuous assignments của bài:
assign bus_line = enable_a ? data_a : 1'bz;
assign bus_line = enable_b ? data_b : 1'bz;
Mỗi driver hoạt động khi enable riêng bằng 1, còn lại nhả Z. Với các input 0/1 đã kiểm:
- Cả hai enable bằng 0: bus là Z.
- Chỉ một driver hoạt động: bus theo data của driver đó.
- Hai driver cùng drive 1: bus là 1; hai driver cùng drive 0: bus là 0.
- Hai driver cùng độ mạnh drive 0 và 1: bus là X.
Đổi thứ tự hai dòng assign không phải cách sửa tranh chấp. Trong thiết kế thật, cần một quy tắc sở hữu bus, enable hợp lệ hoặc cấu trúc mux đúng yêu cầu.
Kiểm đủ 16 tổ hợp enable và data
Có bốn input một bit: hai enable và hai data, tổng 2^4=16 tổ hợp. Oracle phân loại bằng số nguyên enable/data trước khi so bus và mirror bằng !==. Nó không đọc bus làm đáp án cho chính bus.
Dự đoán trước chạy: nhả cả hai cho Z; tranh chấp 0/1 cho X; đồng thuận 1/1 cho 1. Output thực NET RESULT released=z conflict=x agree=1 wand=1 wor=1. Dòng vector kiểm 0/1 khác nhau tại index 0. Parse và simulation Icarus 4-state đạt; không gắn nhãn lint hoặc synthesis cho TB này. [2]
Wired nets và pull không giống wire thường
TB còn dùng wand và wor, mỗi net có hai driver data 0/1 luôn hoạt động. Với các vector đã kiểm, wand khớp AND và wor khớp OR. Ví dụ data 0/1 cho wired-AND bằng 0 và wired-OR bằng 1; không resolve thành X như wire thường cùng độ mạnh trong thí nghiệm trước.
Hai net tri0 và tri1 không có driver ngoài được quan sát lần lượt là 0 và 1 do pull mặc định của kiểu net trong ví dụ. Đây không phải chứng minh “mọi wire chưa nối đều bằng 0”: wire thả nổi ở bài lexical là Z.
Tên net type mang ý nghĩa mô phỏng cụ thể. Không đổi wire thành wand chỉ để hết X nếu yêu cầu thiết kế không phải wired-AND. Strength được học riêng ở bài tự chọn; ví dụ hiện tại không phủ mọi tổ hợp strength hoặc X của wired nets.
Từ khai báo đến phần cứng suy ra
Một biến được gán trong process có thể tham gia mô tả logic tổ hợp hoặc logic tuần tự, tùy cấu trúc process. Chữ logic/reg không phải bằng chứng đã có FF. Một net nhiều driver cũng không bảo đảm FPGA sẽ tạo tri-state bên trong fabric.
Trong RTL sản phẩm, cần biết target hỗ trợ gì và xem synthesis/mapping report. Bài này chỉ có TB mô phỏng nên không tuyên bố số cổng, FF hoặc I/O buffer vật lý. Bài mức mô tả RTL có flow synthesis riêng để kiểm phần cứng ở các top cụ thể.
Checklist khi một net ra X
- Liệt kê mọi driver và enable, gồm cả kết nối qua port.
- Phân biệt variable chưa gán với net đang tranh chấp; cùng in X nhưng nguyên nhân khác nhau.
- Kiểm net kind: wire thường, wired net và pull có quy tắc khác nhau.
- Kiểm thời điểm sample sau khi các continuous/process cập nhật; không đổi expected thành X để bỏ qua lỗi setup TB.
- Kiểm range trước khi dùng index; vector ascending không tự đổi nội dung literal thành một byte khác.
- Dùng assertions về quyền drive khi thiết kế cần một chủ sở hữu, không trông chờ thứ tự source giải quyết xung đột.
Tự kiểm tra
Đọc kiểu, driver và process cùng nhau
Để hiểu một tín hiệu, cần ít nhất ba thông tin: khai báo, nguồn drive/gán và thời điểm cập nhật. Sau đó mới kết luận hành vi simulation và kiểm báo cáo synthesis cho phần cứng.
Bằng chứng của bài là 16 tổ hợp tri-state, wired nets với data 0/1, hai pull và range cụ thể. Chưa xác minh toàn bộ net type, port default, charge storage hoặc quy tắc LRM, nên nhãn draft và needs-spec-check vẫn giữ.
Nguồn và mức độ đối chiếu
- IEEE 1800-2023 SystemVerilog LRM, cần đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thử nghiệm A6.types: source và verification.json, Bằng chứng net resolution. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Nets and variables; vector ranges; net types and resolution. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thử nghiệm A6.types: source và verification.json, Ví dụ đã chạy: source và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Nets and variables; vector ranges; net resolution. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thử nghiệm A6.types: source và verification.json, tb_types.sv và verification.json. Trích dẫn; nguồn đã đọc toàn văn.