时间尺度指令
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 70 课,共 90 课。
timescale 指令用于设置仿真的时间单位和时间精度。它会告诉模拟器如何解释像 #10 这样的延迟值。
在之前的课中,我们使用了类似 #10 的延迟,却没有说明“10”代表什么。它是 10 纳秒吗?还是 10 皮秒?timescale 指令可以回答这个问题。
语法:
`timescale time_unit / time_precision| 部分 | 含义 | 示例 |
|---|---|---|
time_unit | 延迟的基本单位 | 1ns |
time_precision | 仿真的精度 | 1ps |
timescale 前面的反引号 ` 表示它是一个编译器指令。
示例
`timescale 1ns / 1pstime_unit = 1ns→#10表示 10 纳秒time_precision = 1ps→ 仿真会四舍五入到最接近的皮秒
常见时间刻度值
| 时间单位 | 精度 | 使用场景 |
|---|---|---|
1ns / 1ns | 纳秒 | 简单仿真 |
1ns / 1ps | 皮秒 | 更高精度 |
1ps / 1ps | 皮秒 | 高速设计 |
1us / 1ns | 微秒 | 慢速仿真 |
它如何影响延迟
`timescale 1ns / 1ps
initial begin
#10 a = 1; // 等待 10 纳秒
end如果没有 timescale,一些模拟器会采用默认值(通常为 1ns)。最好始终指定它。
重要规则
| 规则 | 说明 |
|---|---|
| 必须位于模块外部 | 放在任何模块定义之前 |
| 反引号符号 | `timescale,而不是 'timescale |
| 时间单位 ≥ 时间精度 | 1ns / 1ps 可以,1ps / 1ns 不可以 |
| 影响文件中的所有延迟 | 常规延迟、门延迟、赋值延迟 |
挑战
要做什么:
添加缺失的 timescale 指令,让延迟分别表示 10ns、20ns 和 30ns。
亲手试试
// TODO: 添加时间尺度指令(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
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器