Comparator và parity: thứ tự giá trị khác kiểm lỗi bit
Tiên quyết
- Module A1: Biểu diễn số: Đang tải
- Boolean: từ yêu cầu đến bảng chân trị: Đang tải
- Signed, complement và overflow: đọc đúng ý nghĩa của bit: Đang tải
Sau bài này bạn sẽ
- So sánh từ bit cao và phân biệt signed với unsigned
- Tạo và kiểm even/odd parity với đơn vị frame rõ ràng
- Giải thích vì sao parity bắt lỗi lẻ nhưng không xác định vị trí lỗi
Hai câu hỏi khác nhau về cùng các bit
Comparator hỏi hai giá trị có bằng nhau, lớn hơn hay nhỏ hơn. Parity hỏi số bit 1 của một nhóm có đúng quy ước chẵn/lẻ không.
Một dữ liệu có parity đúng vẫn có thể mang giá trị sai. Một phép so đúng theo unsigned vẫn có thể sai yêu cầu nếu giao diện thực dùng signed. Hãy chốt ý nghĩa dữ liệu trước khi chọn phép kiểm.
Bằng nhau khi mọi cặp bit bằng nhau
XNOR một cặp bit cho 1 khi chúng giống nhau. AND các kết quả XNOR sẽ tạo điều kiện bằng nhau cho cả từ dữ liệu.
Cách tương đương là XOR từng cặp để tìm bit khác, rồi chỉ báo bằng nhau khi không có bit khác nào. Với đầu vào chỉ 0/1, hai cách cho cùng kết quả.
| A | B | Bằng nhau? |
|---|---|---|
1010 |
1010 |
Có |
1010 |
1000 |
Không, khác ở bit 1 |
0000 |
0000 |
Có |
So sánh logic này chưa nói về X/Z. Các toán tử equality khác nhau trong SystemVerilog có quy tắc unknown riêng; bài này chưa coi kiểm Boolean là kiểm đầy đủ 4-state.
Bit khác đầu tiên từ MSB quyết định unsigned
So unsigned từ bit cao nhất xuống. Nếu cặp bit đang xét khác nhau, bên có 1 lớn hơn; nếu bằng nhau, tiếp tục xuống bit thấp.
Ví dụ A là 1010, B là 1001: bit 3 bằng nhau, bit 2 bằng nhau; bit 1 là 1 so với 0 nên A lớn hơn. Không cần lấy bit 0 để đảo quyết định.
Với nhiều nhóm bit, nguyên tắc vẫn vậy: nhóm cao lớn hơn thì cả từ lớn hơn; chỉ khi nhóm cao bằng nhau mới dùng kết quả nhóm thấp. Ba kết quả less/equal/greater phải loại trừ nhau và phủ hết miền 0/1 của cùng một kiểu đọc.
Signed thay trọng số của bit dấu
| A | B | Unsigned A < B | Signed two’s complement A < B |
|---|---|---|---|
1111 |
0001 |
Không: 15 > 1 | Có: −1 < +1 |
1000 |
0111 |
Không: 8 > 7 | Có: −8 < +7 |
1101 |
1110 |
Có: 13 < 14 | Có: −3 < −2 |
Nếu hai dấu khác nhau, số âm nhỏ hơn. Nếu dấu giống nhau, thứ tự raw unsigned trong cùng nửa miền tương ứng với thứ tự two’s complement.
Dùng dấu của hiệu đã bị cắt không đủ để so signed. Ví dụ bốn bit +7 trừ −1 có hiệu toán học +8, nhưng mẫu giữ lại là 1000, đọc signed thành −8. Cần xử lý overflow hoặc dùng phép so có kiểu đúng.
Chọn even hay odd rồi tính trên cả frame
Với bốn bit payload, thêm một parity bit. Even parity chọn tổng số bit 1 của cả năm bit là chẵn; odd parity chọn tổng là lẻ.
XOR bốn bit payload cho parity bit của even convention. Đảo kết quả ấy cho parity bit của odd convention.
| Payload | Số bit 1 | Even parity bit | Odd parity bit |
|---|---|---|---|
0000 |
0 | 0 | 1 |
1011 |
3 | 1 | 0 |
1111 |
4 | 0 | 1 |
Bộ nhận even kiểm XOR cả frame phải bằng 0. Bộ nhận odd kiểm XOR cả frame phải bằng 1. Quy ước phải thống nhất ở hai đầu; cùng một payload không làm hai loại parity bit bằng nhau.
Một bit lỗi đổi parity, hai bit lỗi có thể lọt
Mỗi bit bị đảo làm kết quả XOR đổi một lần. Số lần đảo lẻ làm parity thay đổi; số lần đảo chẵn đưa parity về giá trị cũ, với giả thiết các bit đảo là các vị trí phân biệt.
Ví dụ frame even 11011 có bốn bit 1. Đảo một bit bất kỳ cho tổng lẻ nên bị báo lỗi. Đảo hai vị trí khác nhau vẫn cho tổng chẵn, dù payload hoặc parity bit đã thay đổi.
Parity báo có vấn đề theo một điều kiện, không chỉ ra vị trí để sửa. Nó cũng không kiểm thứ tự frame hoặc ý nghĩa dữ liệu. Muốn khả năng phát hiện/sửa khác phải chọn cơ chế phù hợp với mô hình lỗi; không gọi parity là bảo đảm không sai dữ liệu.
Những phép kiểm nhìn đúng nhưng sai hợp đồng
- So raw unsigned cho một trường signed.
- Dùng chỉ bit dấu của hiệu hẹp thay phép so signed.
- Tính parity trên payload ở một đầu nhưng trên miền bit khác ở đầu kia.
- Gọi odd parity là parity bit luôn bằng 1.
- Xem parity không báo lỗi là bằng chứng payload chắc chắn đúng.
Trong log, ghi kiểu đọc của comparator và toàn bộ frame của parity. Một cờ pass rời dữ liệu sẽ khó giúp tìm lỗi.
Tìm phản ví dụ nhỏ
- So bốn bit 1001 và 0110 theo cả unsigned và signed.
- Với A bằng 1010, B bằng 1001, bit khác đầu tiên từ MSB là bit nào?
- Payload 0110 cần parity bit nào theo even và odd convention?
- Từ frame even hợp lệ 00110, đảo hai bit để tạo frame sai dữ liệu nhưng vẫn pass parity.
- Vì sao parity error không cho biết nên sửa bit nào?
Kiểm tra
Bằng chứng kiểm chứng
Expected tính trước chạy: COMPARE CHECK pairs=256 equal=16 unsigned_lt=120 signed_lt=120 order_different=128 parity_words=16 single_detected=80 double_undetected=160 time_ns=512.
Comparator duyệt 256 cặp bốn bit. Tham chiếu signed dùng số nguyên u trừ 16 ở nửa âm; unsigned dùng chỉ số nguyên, tách khỏi mạch ưu tiên MSB. Có 16 cặp bằng nhau, 120 cặp nhỏ hơn trong mỗi miền và 128 cặp khác kết quả thứ tự do khác dấu.
Parity dùng đủ 16 payload, frame năm bit gồm cả parity bit. Tham chiếu đếm bit bằng phép chia số nguyên. Đảo lần lượt cả năm vị trí cho 80 single-error được hai checker even/odd phát hiện; đảo mọi cặp vị trí cho 160 double-error không bị phát hiện, đúng giới hạn đã tính.
Parsed/linted/simulated/synthesized đạt; không có flip-flop/latch trong synthesis generic. Không claim hiệu năng mạch, sửa lỗi, mọi chiều rộng hay X/Z.
Nguồn và mức độ đối chiếu
- Comparators & ALUs — bản chụp resources.zip, Equality Comparator; Magnitude Comparator: MSB First; Comparing With a Subtractor. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản A2.compare, Exhaustive signed/unsigned comparisons and all single/double errors of five-bit parity frames. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Signed comparison versus packed bit equality, reduction XOR/XNOR and fixed widths — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Boolean Logic — bản chụp resources.zip, Where Does Boolean Logic Show Up? — equality and parity checks. Trích dẫn; nguồn đã đọc các mục liên quan.