`timescale 有什么用?#1 延时意味着什么?
更新时间:2026-09-21。问题驱动短答页。阻塞/非阻塞见 NBA,门级仿真与时序见 门级仿真,SDC 见 create_clock。
一句话回答
`timescale 1ns/1ps 告诉仿真器两件事:前面的“时间单位”定义代码里 #10 这种延时数字的单位(这里 #10 = 10ns),后面的“时间精度”规定仿真时间推进和延时舍入的最小刻度(1ps)。#延时 是纯仿真概念:testbench 里用它产生时钟、设置信号建立/保持间隔,但综合工具完全忽略 # 延时**,不会把它变成电路里的延迟单元,所以 RTL 里写 #1 不代表硬件会延迟一拍或一纳秒。真实硬件延迟由工艺单元、布线和 SDF/时序分析决定,门级仿真反标 SDF 后才有物理时序。**
单位与精度
- 时间单位:
#n的量纲。 - 时间精度:延时舍入步长,应 ≤ 单位;精度越细仿真越慢。
- 多个文件 timescale 不一致时,同一个
#1在不同模块代表不同真实时间,是经典错位来源。
典型用法
verilog
`timescale 1ns/1ps
module tb;
reg clk = 0;
always #5 clk = ~clk; // 周期 10ns = 100MHz 测试时钟
initial begin
rst_n = 0; #20; // 拉低复位 20ns
rst_n = 1;
#100; $finish;
end
endmodule为什么 # 延时不能综合
- 综合是映射到真实逻辑门/触发器,延迟是这些单元和布线的物理结果,无法由“等 1ns”这种语句精确指定。
- 想“延迟一拍”要用触发器级联(时钟打拍),不是
#1,见 跨时钟域打拍。 - 想加输入/输出延时约束,用 SDC 的
set_input_delay/set_output_delay,见 SDC 时钟。 - 门级/后仿时物理延迟来自 SDF 反标,见 门级仿真。
常见坑
- RTL 里加
#1想消竞争,仿真对了、综合后行为不同(最危险的假修复),正确做法见 NBA 与竞争。 - 不同文件 timescale 不一致导致接口时序对不齐。
- 把精度设得过细,仿真速度大幅变慢却没有收益。
- 以为
#5 clk=~clk会综合出时钟——时钟必须来自端口或内部 PLL/分频逻辑。
总结
timescale 单位/精度 只作用于仿真:单位定义 #延时数字的实际时长,精度决定时间舍入刻度,多文件不一致会造成 #1 含义错位;#延时语句在综合时被直接忽略、绝不产生硬件延迟,真正的“晚一拍”要用触发器打拍,物理延迟来自工艺单元和 SDF 反标。因此 # 只应出现在 testbench 里造时钟和激励时序,绝不能当作 RTL 的时序控制手段。