Chỉ thị timescale
Thuộc phần Kiến thức nền tảng trong hành trình Verilog của Coddy. Bài học 70 trên 90.
Chỉ thị timescale đặt đơn vị thời gian và độ chính xác thời gian cho mô phỏng. Chỉ thị này cho trình mô phỏng biết cách diễn giải các giá trị độ trễ như #10.
Trong các bài học trước, chúng ta đã dùng độ trễ như #10 mà không nói rõ “10” có nghĩa là gì. Đó là 10 nano giây hay 10 pico giây? Chỉ thị timescale sẽ giải đáp câu hỏi này.
Cú pháp:
`timescale time_unit / time_precision| Thành phần | Ý nghĩa | Ví dụ |
|---|---|---|
time_unit | Đơn vị cơ bản cho độ trễ | 1ns |
time_precision | Độ chính xác của mô phỏng | 1ps |
Dấu backtick ` trước timescale cho biết đây là một chỉ thị của trình biên dịch.
Ví dụ
`timescale 1ns / 1pstime_unit = 1ns→#10nghĩa là 10 nano giâytime_precision = 1ps→ Mô phỏng làm tròn đến pico giây gần nhất
Các giá trị thang thời gian thường dùng
| Đơn vị thời gian | Độ chính xác | Trường hợp sử dụng |
|---|---|---|
1ns / 1ns | Nanogiây | Mô phỏng đơn giản |
1ns / 1ps | Picogiây | Chính xác hơn |
1ps / 1ps | Picogiây | Thiết kế tốc độ cao |
1us / 1ns | Microgiây | Mô phỏng chậm |
Ảnh hưởng đến độ trễ như thế nào
`timescale 1ns / 1ps
initial begin
#10 a = 1; // Chờ 10 nano giây
endNếu không có timescale, một số trình mô phỏng sẽ dùng giá trị mặc định (thường là 1ns). Tốt nhất bạn nên luôn chỉ định giá trị này.
Quy tắc quan trọng
| Quy tắc | Giải thích |
|---|---|
| Phải nằm ngoài các module | Đặt trước mọi định nghĩa module |
| Ký hiệu dấu huyền | `timescale, không phải 'timescale |
| Đơn vị thời gian ≥ độ chính xác thời gian | 1ns / 1ps hợp lệ, 1ps / 1ns không hợp lệ |
| Ảnh hưởng đến mọi độ trễ trong tệp | Độ trễ thông thường, độ trễ cổng, độ trễ phép gán |
Thử thách
Cần làm gì:
Thêm chỉ thị timescale còn thiếu để các độ trễ biểu thị 10ns, 20ns và 30ns.
Tự làm thử
// TODO: Thêm chỉ thị timescale (1ns / 1ps)
module timescale_challenge;
initial begin
$display("Time %0t", $time);
#10 $display("Time %0t (10ns = 10000ps)", $time);
#10 $display("Time %0t (20ns = 20000ps)", $time);
#10 $display("Time %0t (30ns = 30000ps)", $time);
$finish;
end
endmoduleBài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Kiến thức nền tảng
1Giới thiệu
Verilog là gìPhần cứng và phần mềmModule đầu tiênChú thíchCác mức trừu tượng hóa thiết kế4Toán tử phần 1
Toán tử số họcToán tử moduloToán tử so sánhÔn tập: phép tính đơn giảnToán tử thao tác bit7Gán và cổng logic
Gán liên tụcGán bằng toán tửCác cổng nguyên thủy tích hợp sẵnCổng AND, OR, NOTCổng XOR, XNORÔn tập: mạch cổng logic10Ra quyết định
Câu lệnh ifIf và elseÔn tập: Bộ so sánh đơn giảnCâu lệnh caseCasex và casezÔn tập: Thiết kế ALU13Thời gian và độ trễ
Độ trễ là gìĐộ trễ cổngĐộ trễ phép gánChỉ thị timescaleTạo xung nhịpÔn tập về điều khiển thời gian5Các toán tử, phần 2
Toán tử logicToán tử rút gọnToán tử dịch bitToán tử nốiToán tử điều kiệnÔn tập: thử thách về toán tử11Vòng lặp
Vòng lặp forVòng lặp whileVòng lặp repeatVòng lặp vô hạnCâu lệnh vô hiệu hóaÔn tập: các mẫu vòng lặp3Hệ thống số
Biểu diễn nhị phânSố có kích thướcSố không có kích thướcSố âmCác giá trị đặc biệt X và ZÔn tập: định dạng số6Module
Cấu trúc moduleCổng đầu vào và đầu raCổng vào ra hai chiềuKhởi tạo moduleÁnh xạ cổng theo tênÁnh xạ cổng theo thứ tựÔn tập: xây dựng module9Khối thủ tục
Khối alwaysKhối initialDanh sách độ nhạyPhép gán chặnPhép gán không chặnÔn tập: always và initial12Dự án bộ ghép kênh
Thiết kế bộ ghép kênh 2 thành 1Thiết kế bộ ghép kênh 4 thành 115Bộ điều khiển đèn giao thông
Xác định các trạng tháiLogic máy trạng tháiTự luyện tập: Trình biên dịch Verilog online