Giảm và tránh hiện tượng chạy đua giữa code thiết kế và code kiểm tra là một mục tiêu quan trọng trong quá trình xây dựng môi trường mô phỏng, kiểm tra vì hiện tượng chạy đua sinh ra các kết quả mô phỏng không chính xác và mất thời gian để debug.
Để hạn chế hiện tượng chạy đua, System Verilog đã thêm nhiều vùng sự kiện (event region) mới so với Verilog. Loạt bài viết này sẽ mô tả chi tiết về các vùng sự kiện này dựa trên nhiều tài liệu tham khảo khác nhau để từ đó các bạn có thể tạm hiểu “hoạt động thực thi mô phỏng diễn ra như thế nào?”
Tham khảo chính:
1/ IEEE Std 1800™-20122/ IEEE Std 1364-2005
3/ http://www.sunburst-design.com/
1. Hiểu về thuật ngữ thời gian mô phỏng (simulation time)
Thời gian mô phỏng là thời gian được trình mô phỏng duy trì để mô hình hóa thời gian thực tế được chiếm giữ bởi một mô tả hệ thống trong khi mô phỏng. Một mô tả hệ thống ở đây được hiểu là code.
2. Hiểu về thuật ngữ khe thời gian (time slot)
Một khe thời gian bao gồm tất cả các hoạt động mô phỏng được xử lý trong các vùng sự kiện cho mỗi thời gian mô phỏng. Tất cả các hoạt động mô phỏng cho một thời gian mô phỏng cụ thể được thực thi cho đến khi không có bất kỳ hoạt động mô phỏng nào còn lại trong khe thời gian đó mà không làm tăng thời gian mô phỏng. Chú ý, việc thực thi các sự kiện mô phỏng trong một khe thời gian có thể cần phải lặp nhiều lần thông qua các vùng sự kiện mô phỏng trong cùng khe thời gian này. Đôi khi khái niệm khe thời gian được gọi bằng một tên khác là bước thời gian (timestep hoặc time step).
3. Hiểu một số thuật ngữ khác
3.1 Lập thời gian biểu (scheduling)
Lập thời gian biểu (hoặc lập lịch) là hoạt động sắp xếp, thiết lập thứ tự hoặc thời điểm để thực thi các sự kiện mô phỏng. Nó giống như việc bạn lập một thời khóa biểu hằng ngày, trong đó bạn sẽ liệt kê các công việc phải làm trong ngày, cái nào trước, cái nào sau và vào lúc nào. Tương tự, các sự kiện mô phỏng cũng cần được lập thời gian biểu để thực thi theo một thứ tự đúng.
3.2 callbacklà một code có thể thực thi bất kỳ (code A), code này có thể truyền đến một code khác (code B) như một đối số và code B sẽ gọi lại (call back) code A để thực thi tại một thời điểm nào đó.
4. Các vùng sự kiện trong Verilog (IEEE Std 1364-2005)
Các vùng sự kiện này cho phép lập thời gian biểu cho các phát biểu mô phỏng của Verilog để mô hình hóa hành vi phần cứng thực tế. Verilog 2005 phân biệt 5 vùng sự kiện khác nhau:
- Các sự kiện active xuất hiện tại thời gian mô phỏng hiện tại và có thể được xử lý theo bất kỳ thư tự nào.
- Các sự kiện Inactive xuất hiện tại thời gian mô phỏng hiện tại nhưng phải xử lý sau khi tất cả các sự kiện active được xử lý.
- Các sự kiện cập nhật phép gán nonblocking được ước lượng trong suốt thời gian mô phỏng trước đó nhưng phải được gán tại thời gian mô phỏng này sau khi tất cả các sự kiện active và inactive được xử lý.
- Các sự kiện monitor phải được xử lý sau khi tất cả các sự kiện active, inactive và cập nhật phép gán nonblocking được xử lý.
- Các sự kiện tương lai xuất hiện trong thời gian mô phỏng tương lai (các khe thời gian tiếp theo). Các sự kiện tương lai là các sự kiện thuộc loại inactive và các sự kiện cập nhật phép gán nonblocking. Các sự kiện này được xây dựng trước để chuẩn bị cho các khe thời gian tương lai nên sẽ không xuất hiện trong hình minh họa một khe thời gian của Verilog.
Các vùng sự kiện của Verilog 2005 |
5. Các vùng sự kiện của System Verilog (IEEE Std 1800-2012)
System Verilog mở rộng sự phân chia một khe thời gian thành 17 vùng khác nhau. Các vùng này cơ bản đã bao gồm mô hình phân chia của Verilog cho mô phỏng, với cùng một mức độ xác định. Nói cách khác, code Verilog được sử dụng lại sẽ tiếp tục xử lý đúng mà không cần sửa đổi theo cơ chế của SystemVerilog.
Hình 2: Các vùng trong một khe thời gian của System Verilog 2012 |
Một trình mô phỏng System Verilog tương thích phải duy trì một số dạng cấu trúc dữ liệu cho phép các sự kiện được linh động lập thời gian biểu, thực thi và loại bỏ. Cấu trúc dữ liệu thường được thực hiện như một tập hợp các danh sách liên kết được sắp xếp theo thời gian, được phân chia và chia nhỏ theo một cách được đã xác định rõ.
Sự phân chia đầu tiên là theo thời gian. Mỗi sự kiện có một và chỉ một thời gian thực thi mô phỏng. Thời gian này có thể ở bất cứ điểm nào đã cho trong quá trình mô phỏng, có thể là thời gian hiện tại hoặc thời gian tương lai. Tất cả các sự kiện đã được thiết lập thời gian biểu tại một thời điểm cụ thể sẽ định nghĩa một khe thời gian (time slot). Sự mô phỏng sẽ tiếp diễn bằng cách thực thi và loại bỏ tất các các sự kiện trong khe thời gian hiện tại trước khi chuyển đến khe thời gian tiếp theo theo thứ tự, khe thời gian tiếp theo phải không rỗng. Thủ tục này đảm bảo trình mô phỏng không bao giờ đi ngược thời gian, nghĩa là không bao giờ quay lại khe thời gian trước đó.
Một khe thời gian được chi thành một tập các vùng theo thứ tự như sau:
1. Preponed
2. Pre-Active
3. Active
4. Inactive
5. Pre-NBA
6. NBA
7. Post-NBA
8. Pre-Observed
9. Observed
10. Post-Observed
11. Reactive
12. Re-Inactive
13. Pre-Re-NBA
14. Re-NBA
15. Post-Re-NBA
16. Pre-Postponed
17. Postponed
Mục đích của việc chia một khe thời gian thành các vùng theo thứ tự này là để cung cấp các tương tác có thể dự đoán được giữa code thiết kế và code testbench.
Hai nhóm quan trọng của các vùng sự kiện, được dùng để giúp xác định thời gian biểu của sự hoạt động của System Verilog, là tập vùng active và tập vùng reactive. Các sự kiện được thiết lập thời gian biểu trong vùng Active, Inactive, Pre-NBA, NBA và Post-NBA là các sự kiện thuộc tập vùng active. Các sự kiện được thiết lập thời gian biểu trong vùng Re-Active, Re-Inactive, Pre-Re-NBA, Re-NBA và Post-Re-NBA là các sự kiện thuộc tập vùng reactive.
Các vùng Active, Inactive, Pre-NBA, NBA, Post-NBA, Pre-Observed, Observed, Post- Observed, Reactive, ReInactive, Pre-Re-NBA, Re-NBA, Post-Re-NBA, và Pre-Postponed regions được gọi là các vùng lặp lại (iterative regions).
Thêm vào đó, ngoài tập vùng active và tập vùng reactive, tất cả các vùng còn sự kiện có thể được phân thành nhóm vùng mô phỏng (simulation regions) và nhóm vùng PLI (Programming Language Interface regions).
5.1 Các vùng mô phỏng
Các vùng mô phỏng của một khe thời gian là Preponed, Active, Inactive, NBA, Observed, Reactive, ReInactive, Re-NBA và Postponed.
5.1.1 Vùng các sự kiện Preponed
Độ trễ lấy mẫu #1step cung cấp khả năng lấy mẫu dữ liệu trực tiếp trước khi đi vào khe thời gian hiện tại. Sự lấy mẫu #1step là đồng nhất với sự lưu giữ các mẫu dữ liệu trong vùng Preponed của khe thời gian hiện tại. Lấy mẫu trong vùng Preponed tương đương với việc lấy mẫu trong vùng Postponed ngay trước đó.
Các sự kiện PLI vùng Preponed cũng được lập thời gian biểu trong vùng này.
5.1.2 Vùng các sự kiện Active
Vùng Active giữ các sự kiện của tập vùng active hiện tại đang được ước lượng (đánh giá) và có thể được xử lý theo bất kỳ thứ tự nào.
5.1.3 Vùng các sự kiện Inactive
Vùng Inactive giữ các sự kiện để được ước lượng sau khi tất cả các sự kiện Active được xử lý.
Nếu các sự kiện đang được thực thi trong tập vùng active, một điều khiển trễ #0 yêu cầu xử lý bị hoãn lại (treo) và một sự kiện được thiết lập thời gian biểu trong vùng Inactive của khe thời gian hiện tại để xử lý có thể tiếp tục lại trong quá trình lặp lại từ Inactive đến Active tiếp theo.
5.1.4 Vùng sự kiện NBA
Vùng NBA, vùng cập nhật phép gán nonblocking (<=), giữ các sự kiện được ước lượng sau khi tất cả các sự kiện Inactive được xử lý.
Nếu các sự kiện đang được xử lý trong tập vùng active, một phép gán nonblocking sẽ tạo một sự kiện trong vùng NBA được lên lịch cho thời gian mô phỏng hiện tại hoặc sau đó.
5.1.5 Vùng sự kiện Observed
Vùng Observed là để đánh giá các biểu thức thuộc tính khi chúng được kích hoạt. Trong quá trình đánh giá thuộc tính, code pass / fail sẽ được lên lịch trong vùng Reactive của khe thời gian hiện tại. Việc gọi lại PLI không được phép trong vùng Observed.
5.1.6 Vùng các sự kiện Reactive
Vùng Reactive giữ các sự kiện của tập vùng reactive hiện tại đang được đánh giá và có thể được xử lý theo bất kỳ thứ tự nào.
Code đã được đặc tả bằng các phép gán blocking (=) trong các khối chương trình và code trong các khối hành vi (action block) của các assertion đồng nhất được lên lịch trong vùng Reactive. Vùng Reactive là vùng reactive được thiết lập kép của vùng Active.
5.1.7 Vùng các sự kiện Re-Inactive
Vùng Re-Inactive giữ các sự kiện được ước lượng sau khi tất cả các sự kiện Reactive được xử lý.
Nếu các sự kiện đang được thực thi trong tập vùng reactive, một điều khiển độ trễ # 0 yêu cầu quá trình tạm dừng và một sự kiện được lên lịch vào vùng Re-Inactive của khe thời gian hiện tại để quá trình có thể được tiếp tục trong lần lặp lại từ Re-Inactive đến Reactive tiếp theo. Vùng Re-Inactive là vùng phản ứng được thiết lập kép của vùng không hoạt động.
5.1.8 Vùng các sự kiện Re-NBA
Vùng Re-NBA giữ các sự kiện được ước lượng sau khi tất cả các sự kiện Re-Inactive được xử lý.
Nếu các sự kiện đang được thực hiện trong bộ vùng reactive, một phép gán nonblocking sẽ tạo ra một sự kiện trong vùng cập nhật Re-NBA được lên lịch cho thời gian mô phỏng hiện tại hoặc sau đó. Vùng Re-NBA là tập vùng reactive được thiết lập kép của vùng NBA
5.1.9 Vùng các sự kiện Postponed
$monitor, $strobe và các sự kiện tương tự khác được lên lịch trong vùng Postponed.
Không có thay đổi giá trị mới nào được phép xảy ra trong khoảng thời gian hiện tại khi đã đến vùng Postponed. Trong vùng này, việc ghi các giá trị vào bất kỳ net hoặc biến nào hoặc lập lịch sự kiện ở bất kỳ vùng nào trước vùng này trong khe thời gian hiện tại là bất hợp lệ.
Các sự kiện PLI vùng Postponed cũng được lên lịch trong vùng này.
5.2 Vùng PLI
Bên cạnh các vùng mô phỏng, nơi mà các callback được lập thời gian biểu, thì chúng ta có thêm các vùng đặc tả PLI. Các vùng PLI của khe thời gian.
Các cùng PLI của một khe thời gian gồm Preponed, Pre-Active, Pre-NBA, Post-NBA, Pre-Observed, Post-Observed, Pre-Re-NBA, Post-Re-NBA và Pre-Postponed.
5.2.1 Vùng PLI Preponed
Vùng Preponed cung cấp một điểm điều khiển callback PLI chấp nhận các chương trình ứng dụng PLI truy cập dữ liệu tại khe thời gian hiện tại trước khi bất kỳ net hay biến nào đổi trạng thái.
Trong vùng này, việc ghi các giá trị đến net hoặc biến hoặc lập thời gian biểu một sự kiện trong bất kỳ vùng nào khác trong khe thời gian hiện tại là bất hợp lệ.
PLI hiện tại không lập lịch callback trong vùng Peoponed.
5.2.2 Vùng PLI Pre-Active
Vùng Pre-Active cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI đọc và ghi giá trị; tạo các sự kiện trước khi các sự kiện trong vùng Active được ước lượng.
5.2.3 Vùng PLI Pre-NBA
Vùng Pre-NBA cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI đọc và ghi giá trị; tạo các sự kiện trước khi các sự kiện trong vùng NBA được ước lượng.
5.2.4 Vùng PLI Post-NBA
Vùng Pre-NBA cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI đọc và ghi giá trị; tạo các sự kiện sau khi các sự kiện trong vùng NBA được ước lượng.
5.2.5 Vùng PLI Pre-Observed
Vùng Pre-Observed cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI đọc các giá trị sau khi tập vùng active ổn định.
Trong vùng này, việc ghi các giá trị đến net hoặc biến hoặc lập thời gian biểu một sự kiện trong khe thời gian hiện tại là bất hợp lệ.
5.2.6 Vùng PLI Pre-Re-NBA
Vùng Pre-Re-NBA cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI đọc và ghi giá trị; tạo các sự kiện trước khi các sự kiện trong vùng Re-NBA được ước lượng.
5.2.7 Vùng PLI Post-Re-NBA
Vùng Post-Re-NBA cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI đọc và ghi giá trị; tạo các sự kiện sau khi các sự kiện trong vùng Re-NBA được ước lượng.
5.2.8 Vùng PLI Pre-Postponed
Vùng Pre-Postponed cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI đọc và ghi giá trị; tạo các sự kiện sau khi xử lý tất cả các vùng khác, trừ vùng Postponed.
5.2.9 Vùng PLI Postponed
Vùng Postponed cung cấp một điểm điều khiển callback PLI cho phép các chương trình ứng dụng PLI tạo các sự kiện read-only sau khi xử lý tất cả các vùng khác. PLI cbReadOnlySynch và các sự kiện khác tương tự được lập lịch trong vùng Postponed.
0 bình luận:
Đăng nhận xét