Chào các bạn, hôm nay mình cùng Học Vi Mạch Cùng ICTC sẽ nói về một chủ đề quen thuộc nhưng luôn khiến nhiều kỹ sư verification băn khoăn: Direct Test và Random Test, đâu là lựa chọn tốt hơn?
Thực ra, cả hai đều cần thiết. Nếu ví quá trình kiểm thử như lái thử một chiếc xe mới, thì direct test là khi bạn kiểm tra đèn, phanh, cần số trong bãi thử; còn random test là khi bạn lái xe ra đường thật nơi mọi thứ có thể xảy ra. Cả hai giúp bạn hiểu rõ DUT (Design Under Test) nhưng ở hai góc độ khác nhau.
Direct test cho phép bạn kiểm soát hoàn toàn như biết rõ mình đang kiểm tra gì và mong đợi kết quả ra sao. Ví dụ, với bộ đếm 8-bit, bạn có thể đặt count_enable = 1 trong 20 chu kỳ và mong đợi DUT đếm từ 0 đến 19. Cách này dễ debug và hữu ích trong giai đoạn đầu khi cần xác minh các chức năng cơ bản. Tuy nhiên, direct test chỉ kiểm tra được những gì bạn nghĩ đến. Khi dự án lớn lên, việc viết hàng loạt test tương tự trở nên tốn thời gian, khó chỉnh sửa và mở rộng.
Với random test, bạn không cố định mọi thứ nữa. Chỉ với assert(obj.randomize()); và một vài constraint hợp lý, bạn có thể tạo ra hàng nghìn biến thể khác nhau của cùng một transaction, từ bật/tắt enable ngẫu nhiên, chèn reset giữa chừng, đến thay đổi mode đếm. Trong giao thức phức tạp như USB hay SPI, random test còn giúp tạo ra các tình huống thực tế như truyền gói dữ liệu có độ dài khác nhau, thay đổi mode CPOL/CPHA, chèn delay ngẫu nhiên giữa các frame, hoặc xen lẫn các lỗi giả lập như bit bị đảo. Chính sự ngẫu nhiên có kiểm soát này giúp phát hiện những bug mà direct test bỏ sót.
Cuối cùng, direct test và random test không đối lập, mà bổ trợ cho nhau. Giai đoạn đầu, direct test giúp bring-up IP và xác minh chức năng cơ bản. Khi testbench ổn định, random test mở rộng coverage, thử thách DUT trong các điều kiện phức tạp, giúp phát hiện bug tiềm ẩn mà khó phát hiện nếu chỉ dùng direct test.

















