Chào các bạn, hôm nay cùng mình và Học Vi Mạch Cùng ICTC sẽ tìm hiểu một concept nền tảng trong SystemVerilog, giúp giải quyết các bài toán đồng bộ, đó là semaphore.
Những ngày đầu học Design Verification, hầu như thứ gì cũng mới. RTL còn có thể lần mò vì khá giống các môn digital ở trường, nhưng khi bước sang testbench, sequence, driver… thì cảm giác như đang bước vào một thế giới hoàn toàn khác. Khi đó, suy nghĩ thường rất đơn giản: chỉ cần viết stimulus sao cho DUT chạy được là ổn. Còn chuyện nhiều tiến trình chạy song song, hay dữ liệu dùng chung có thể ảnh hưởng lẫn nhau như thế nào, gần như chưa được để ý tới.
Rắc rối chỉ bắt đầu lộ ra khi testbench phức tạp hơn. Một hiện tượng quen thuộc xuất hiện: cùng một test, có lúc pass, có lúc fail. Chạy lại lần nữa thì kết quả lại khác. Không phải do code thay đổi, mà nguyên nhân thường nằm ở chỗ: có nhiều tiến trình đang cùng truy cập một tài nguyên mà không hề có cơ chế kiểm soát.
Và ở đây, semaphore xuất hiện như một người gác cổng. Nói đơn giản, semaphore là một cơ chế dùng để kiểm soát quyền truy cập vào tài nguyên dùng chung giữa các tiến trình chạy song song.
Có thể hình dung theo một ví dụ đời thường như sau trong gia đình có hai người nhưng chỉ có một chiếc ô tô. Vậy làm sao biết hiện tại ai đang sử dụng xe? Lúc này, semaphore giống như chiếc chìa khóa ô tô. Ai muốn dùng xe thì phải cầm chìa khóa đi. Dùng xong thì đặt chìa khóa lại trên bàn. Nếu nhìn lên bàn mà không thấy chìa khóa, ta hiểu ngay rằng xe đang được người khác sử dụng. Cùng xem code minh họa để hiểu thêm về semaphore nhé


















