Time unit, precision và scope: cùng #1.26 không cùng thời điểm
Tiên quyết
Sau bài này bạn sẽ
- Quy đổi delay theo time unit rồi làm tròn theo precision của scope
- Phân biệt mất độ phân giải delay với làm tròn khi đọc $time
- Giải thích timeunit/timeprecision của module không lấy từ nơi instantiate
- Định dạng log có đơn vị mà không nhầm với thay đổi simulation time
Delay là một con số cần đơn vị
Hai model đều ghi #1.26, cùng bắt đầu tại t=0 nhưng một model hoàn tất 1.260 ns, model kia 13 ns. Muốn đọc đúng, phải biết time unit và precision của scope có delay, không chỉ nhìn số trong source hoặc đơn vị đang hiển thị của viewer.
Bài dùng fine model có 1 ns/1 ps, coarse model có 10 ns/1 ns và checker có 1 ps/1 ps. Các event được so trên cùng trục ps; không có ba đồng hồ thời gian độc lập chạy tách nhau. [1]
Time unit quyết định #1 dài bao lâu
Trong fine, một đơn vị local bằng 1 ns, nên 1.26 đơn vị bằng 1.26 ns. Trong coarse, một đơn vị bằng 10 ns, nên con số ấy tương ứng 12.6 ns trước khi làm tròn.
TB dùng SystemVerilog timeunit và timeprecision bên trong module. Verilog còn có directive timescale với hai thành phần unit/precision. Chúng phục vụ mô hình simulation, không đặt tần số clock hay constraint STA cho phần cứng tổng hợp. [2]
Precision lượng tử hóa thời điểm event
Fine có bước 1 ps, nên 1.26 ns được giữ ở 1260 ps. Coarse có bước 1 ns;12.6 ns làm tròn thành 13 ns, tương ứng 13000 ps. Có module khác với precision 1 ps không làm delay coarse tự lấy lại phần 0.6 ns đã bị lượng tử hóa.
Đây là phép tính trước khi chạy; TB cố ý tránh giá trị đúng nửa bước để không suy rộng cách xử lý mọi tie case. Precision cần phù hợp mô hình; chọn rất nhỏ không tự làm model có tính chính xác vật lý cao hơn. [3]
Scope khai báo khác vị trí instantiate
Checker dùng đơn vị 1 ps và instantiate cả fine lẫn coarse. Hai child không nhận đơn vị 1 ps ấy: khai báo local của từng module định nghĩa cách hiểu delay của chúng. Source còn đặt directive 100 ns/10 ns trước các module để làm rõ các local declaration vẫn quyết định ví dụ.
Với source cũ dựa vào directive timescale, thứ tự văn bản, include và cấu hình compilation unit có thể ảnh hưởng module không khai báo riêng. Tài liệu có ví dụ carry-over qua file; đừng mặc định mọi simulator gom file thành cùng một compilation unit. TB hiện không kiểm mọi include/file-list configuration.
Khi tích hợp IP, xem khai báo của model và lệnh compile thực tế; đừng suy time unit từ vị trí hierarchy. Quy tắc chuẩn đầy đủ còn [4]. [5]
$time và $realtime có thể trả hai cách biểu diễn
Fine tại 1.26 ns đọc local $realtime là 1.26 nhưng $time là số nguyên 1. Coarse tại 13 ns đọc local realtime 1.3 đơn vị 10 ns, còn $time cũng là 1. Cùng số nguyên 1 không có nghĩa hai model xảy ra cùng thời điểm.
Đây là lần làm tròn khi đọc thời gian ở đơn vị local, khác với lượng tử hóa delay trước đó. Nếu đã dùng giá trị nguyên 1 thay cho 1.26 rồi mới đổi format, phần lẻ đã mất không được phục hồi. Checker ở scope 1 ps ghi timestamp 1260/13000 bằng số nguyên để đối chiếu hai event. [6]
$timeformat đổi cách in, không đổi lịch
TB đặt $timeformat(-9, 3, " ns", 0) tại đầu mô phỏng: in theo ns, ba chữ số thập phân, suffix rõ. Format %0t không thêm padding. Mỗi child format realtime ngay trong scope của mình, nên log lần lượt 1.260 ns và 13.000 ns.
Một điểm dễ bỏ sót: biến real đã lưu chỉ là số; nếu mang số 1.3 của coarse sang checker 1 ps rồi dùng %t, formatter không tự mang theo “đơn vị 10 ns của nguồn”. Cần đổi đơn vị rõ hoặc format tại scope lấy số, như TB đang làm.
Tại checker 14000 ps, đổi timeformat sang ps làm log hiện 14000 ps mà timestamp không đổi. Setting này ảnh hưởng cách in về sau; không thay precision, không chạy lại event và không đổi delay đã lượng tử hóa. [7]
Đối chiếu 1260 ps với 13000 ps
Kỳ vọng trước chạy: fine event 1260 ps, coarse event 13000 ps, checker tại 14000 ps. Hai integer local đều 1, hai real local lần lượt 1.26/1.3; chuỗi định dạng 1.260 ns/13.000 ns.
Assertions kiểm cả event timestamp, done flag, integer, real với tolerance nhỏ và formatted string. Chỉ nhìn một dòng $time=1 sẽ bỏ lỡ hầu hết khác biệt đang thử. Parser/Icarus chạy đúng phạm vi thí nghiệm, không claim mọi cấu hình tool hoặc STA. [8]
Các bẫy khi ghép model khác đơn vị
- Quy đổi unit mà quên precision, dự đoán coarse 12.6 ns thay vì 13 ns.
- Nghĩ time precision toàn thiết kế nhỏ sẽ phục hồi delay đã bị làm tròn trong model coarse.
- Đọc
$timenguyên rồi mong%tphục hồi phần lẻ. - Cho rằng module con dùng time unit của module cha.
- Mang một số real giữa scope mà quên đơn vị nó đại diện.
- Bỏ đơn vị khỏi log rồi đối chiếu nhầm con trỏ waveform.
- Coi timeformat là lệnh thay đổi scheduler hoặc timing silicon.
Khi debug, ghi cả khai báo local, biểu thức delay, event timestamp theo đơn vị chung và cấu hình compile. Không dựa vào một default chưa kiểm.
Tự kiểm tra
Đổi đơn vị trước, xác định điểm làm tròn sau
Tách bốn việc: unit giải thích con số, precision đặt lưới event, hàm đọc thời gian chọn kiểu biểu diễn, format quyết định log. Scope là thông tin bắt buộc của phép suy luận.
Bài giữ draft/LRM needs-spec-check; kết quả thực nghiệm không thay việc đọc các quy tắc chuẩn chưa đối chiếu.
Nguồn và mức độ đối chiếu
- Verilog Timescale — bản chụp trong resources.zip, Multiple Timescales. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Timescale — bản chụp trong resources.zip, Syntax. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Timescale — bản chụp trong resources.zip, Time precision. Trích dẫn; nguồn đã đọc các mục liên quan.
- IEEE 1800-2023 SystemVerilog LRM, cần đối chiếu LRM. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Verilog Timescale Scope — bản chụp trong resources.zip, Scope. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Timescale — bản chụp trong resources.zip, Printing Time. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Timeformat — bản chụp trong resources.zip, Syntax và field width. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a7.timescale, Bằng chứng nguyên bản. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Time units/precision; time literals; timeformat and time system functions. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.a7.timescale, TB nguyên bản, assertions và verification.json. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Time units/precision; timescale directive scope; time system functions and timeformat. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Verilog Timescale — bản chụp trong resources.zip, Syntax; Printing Time: $time, $realtime and $timeformat; Multiple Timescales in One Design. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Timescale Scope — bản chụp trong resources.zip, Standard timescale scope; Scope between Verilog files; SystemVerilog local declarations. Trích dẫn; nguồn đã đọc các mục liên quan.
- Verilog Timeformat — bản chụp trong resources.zip, Syntax; %t vs %0t and the Minimum Field Width. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.a7.timescale, tb_timescale.sv và verification.json. Trích dẫn; nguồn đã đọc toàn văn.