Simulator, waveform, lint và synthesis: mỗi công cụ trả lời một câu hỏi
Tiên quyết
Sau bài này bạn sẽ
- Chọn công cụ theo dấu hiệu lỗi cần tìm
- Đọc một waveform có kết quả đúng và mất carry
- Phân biệt chạy được, kiểm chức năng đúng và đạt timing
Chạy qua công cụ chưa nói hết thiết kế đúng đến đâu
Một khối có thể không có cảnh báo lint, synthesis thành công, nhưng vẫn cộng sai. Các công cụ kiểm những tính chất khác nhau; cần ghép bằng chứng theo yêu cầu cần xác nhận.
Mục tiêu bài này là biết nên nhìn vào đâu. Bạn chưa cần thuộc các tùy chọn dòng lệnh hay toàn bộ cú pháp HDL.
Chọn câu hỏi trước khi chọn công cụ
| Công cụ/hoạt động | Câu hỏi điển hình | Kết quả cần đọc |
|---|---|---|
| Parser/elaborator | Source có được chấp nhận và các tên, cấu hình được giải thế nào? | Diagnostic, hierarchy và cấu hình được dựng |
| Lint | Có mẫu viết đáng ngờ theo bộ luật đang bật không? | Cảnh báo cùng vị trí và ngữ cảnh |
| Simulator + testbench | Với các tình huống đã tạo, đầu ra có đáp ứng điều kiện kiểm không? | Kết quả so sánh, thông báo lỗi và diễn biến tín hiệu |
| Waveform viewer | Tín hiệu thay đổi thế nào theo thời gian mô phỏng? | Các lane tín hiệu và mốc cần đối chiếu |
| Synthesis | Phần RTL được hỗ trợ biến thành cấu trúc nào? | Netlist, cell/tài nguyên và báo cáo liên quan |
| STA | Timing có đạt theo mô hình và constraint không? | Slack, đường cần kiểm và constraint liên quan |
Waveform viewer giúp nhìn dữ liệu mô phỏng, không tự biết “đúng” nghĩa là gì. Điều kiện mong đợi vẫn phải đến từ đặc tả và cách kiểm.
Hai đầu ra cho cùng một phép cộng
Ví dụ nhận hai số không dấu từ 0 tới 3. Với các bit chỉ nhận 0/1, hai bit giữ được bốn giá trị ấy; tổng tới 6 cần thêm bit cao. Đầu ra good giữ đủ tổng; đầu ra broken cố ý chỉ giữ hai bit thấp rồi mở rộng thêm bit 0.
| a | b | Tổng cần có | good | broken |
|---|---|---|---|---|
| 0 | 3 | 3 | 3 | 3 |
| 1 | 3 | 4 | 4 | 0 |
| 2 | 2 | 4 | 4 | 0 |
| 3 | 3 | 6 | 6 | 2 |
Cả hai cách viết đều biểu diễn được logic tổ hợp. Lint không biết yêu cầu nghiệp vụ là giữ tổng đầy đủ nếu điều đó chưa được diễn đạt thành luật kiểm phù hợp. Synthesis cũng có thể tạo phần cứng cho cả hàm đúng lẫn hàm sai so với yêu cầu ấy.
Ở đây testbench tính tổng tham chiếu từ các số nguyên tạo đầu vào, rồi đối chiếu cả miền 16 cặp. Bản mất carry sai tại 6 cặp có tổng từ 4 trở lên.
Đọc carry trên waveform
Mỗi cột là một mẫu; chỉ số cột bắt đầu từ 0. Testbench đi qua a tăng từ 0 tới 3, với b chạy từ 0 tới 3 cho mỗi giá trị a. Cột 7 vì thế ứng với a bằng 1 và b bằng 3.
Ở cột ấy, carry_good lên 1 còn carry_bad vẫn bằng 0. Đây là dấu hiệu phần bit cao của tổng đã bị bỏ mất. Muốn kiểm trọn phép cộng còn phải đối chiếu các bit còn lại; chỉ nhìn carry chưa đủ.
Clock trong hình là mốc lấy mẫu của testbench. DUT ở ví dụ không có cổng clock hay thanh ghi; việc thêm mốc quan sát không biến bộ cộng tổ hợp thành bộ cộng có độ trễ một chu kỳ.
Từ source tới một lượt mô phỏng có ý nghĩa
Trước hết công cụ đọc source và dựng mô hình theo module top, file và parameter được chọn. Sau đó testbench tạo đầu vào, mô hình tính đầu ra và các phép kiểm đối chiếu kết quả.
Nếu chọn sai top hoặc thiếu file, chưa thể dùng một cửa sổ waveform trống để kết luận thiết kế đúng. Nếu có tín hiệu nhưng thiếu phép so, cũng chưa xác nhận yêu cầu đã được đáp ứng.
Giữ ba thứ cạnh nhau khi debug: tình huống đầu vào, thời điểm cần kiểm và kết quả mong đợi. Đọc lỗi đầu tiên có ý nghĩa trước khi lần theo các lỗi phát sinh sau nó.
Đừng lấy một báo cáo thay cho mọi báo cáo
- Không có cảnh báo lint chưa có nghĩa đã đúng đặc tả.
- Có netlist chưa có nghĩa đã đạt timing trên một công nghệ cụ thể.
- Waveform trông hợp lý chưa có nghĩa đã thử đủ tình huống biên.
- Một lượt kiểm đúng không xác nhận một phiên bản source hoặc cấu hình khác.
Với ví dụ nhỏ, có thể vét cạn mọi đầu vào đã nêu. Với hệ thống lớn, cần kế hoạch kiểm, mô hình tham chiếu, coverage và các phương pháp bổ sung; chỉ tăng số lần chạy chưa chắc lấp đúng chỗ thiếu.
Lần từ triệu chứng tới bằng chứng
- Nếu chỉ thử các cặp có tổng không vượt 3, lỗi nào trong ví dụ sẽ bị bỏ qua?
- Bạn thấy lint không có cảnh báo nhưng 1 cộng 3 ra 0. Bước tiếp theo nên là gì?
- Một waveform cho thấy đầu ra đúng tại vài mẫu. Nó đã thay cho báo cáo STA chưa?
- Tại cột 15, hai đầu vào bằng bao nhiêu và vì sao cần giữ bit cao?
Kiểm tra
Bằng chứng kiểm chứng
Expected tính trước chạy: A0 TOOL CHECK vectors=16 correct=16 lost_carry=6 mask=60544 time_ns=170. Các vector mất carry có chỉ số 7, 10, 11, 13, 14, 15; cộng các bit tương ứng được mask 60544.
Testbench kiểm kết quả good với tham chiếu số nguyên từ chỉ số đầu vào, kiểm số mẫu, số lỗi, mask của broken và thời gian thật. Bản broken là đối chứng sai có chủ đích; bỏ phép kiểm hoặc sửa kỳ vọng không phải cách xác nhận công cụ hoạt động.
Wave được trích từ VCD của chính lần mô phỏng, 16 cột giữa các cạnh lấy mẫu. Giữ thêm cạnh lên thứ 17 để chặn biên cột cuối, rồi kết thúc tại 170 ns. Vét cạn chỉ áp dụng 16 cặp số không dấu xác định; Verilator đang dùng là mô hình 2-state, chưa kiểm X/Z.
Lint kiểm file RTL không có cảnh báo theo cấu hình đã ghi. Yosys tổng hợp generic cả hai hàm và kiểm không có flip-flop/latch. Đó là bằng chứng chấp nhận/cấu trúc, không phải chứng minh hàm broken đúng, hay kết quả mapping PDK, STA, PPA hoặc silicon.
Nguồn và mức độ đối chiếu
- IEEE 1800-2023 SystemVerilog LRM, Combinational expression widths and simulation timing — chưa đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Simulation & Synthesis Tools — bản chụp resources.zip, Understanding What Simulation Does; Yosys; Vivado; RTL Elaboration; Understanding Synthesis Results; Waveform Viewers; Learning Path: From Beginner to Advanced; Making the Most of Simulation. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản A0.tools, Sixteen addition vectors, lint and generic synthesis, VCD carry comparison and runtime faults. Trích dẫn; nguồn đã đọc toàn văn.