参考文献1:https://www.chipverify.com/verilog/verilog-timescale-scope
在数字电路仿真过程中,如果没有模块本身没有指定timescale,则编译器本身可能插入一个默认的timescale,仿真代码如下:
仿真结果:
以下我们尝试以不同的方式测试不同模块的timescale设置对仿真延时的影响。
仿真代码:
`timescale 1ns/1ns
module harness;
logic b1, c1, d1;
m1 m1 (.a1(b1), .a2(c1));
p2 p2 (.*);
p3 p3 (.*);
initial begin
$fsdbDumpfile("wave.fsdb");
$fsdbDumpvars;
end
initial begin
#100 d1 = 1;
end
endmodule
`timescale 1ns/1ns
module m1(input logic a1, a2);
assign #1.2 a = a1 & a2;
endmodule
`timescale 1ns/10ps
module p2(output logic b1);
logic b;
assign #3.345 b = 1;
initial @(b) b1 <= b;
endmodule
program p3(output logic c1);
timeunit 1ns;
timeprecision 1fs;
logic c;
assign #2.2 c = 1;
initial begin
@(c) c1 <= c;
#1000ns;
end
endprogram
脚本设置:
comp:
@vcs \
-full64 \
-kdb -lca \
-sverilog \
-debug_access+all \
-timescale=1ns/1ns \
+fsdb+region \
+libext+.sv+.v \
-l cmp.log \
*.sv
run:
@./simv \
+fsdb+delta \
-l simv.log
all:
@make clean && make comp && make run
verdi:
@verdi -ssf wave.fsdb &
clean:
@rm -rf simv* csrc ucli* vc_hdrs.h verdi* novas* vdCovLog* *.log *.fsdb
各个模块的延时
先看d1
d1在100ns时变为1,即延时100的单位为1ns,为harness模块的timescale为1ns/1ns
。
再看m1
a的延时为1ns,这是由于模块m1的timescale为1ns/1ns
, 精度也为1ns,因此#1.2
会进行舍如为#1。
接着看p2:
b的真正延时为3.35ns,这是由于其timescale为1ns/10ps
,精度为10ps,因此#3.345
舍入为#3.35
。
最后看p3:
延时时间为2.2ns,其分辨率即#1 step
为1fs
。
Note:
- 如果注释掉harness的timescale,设置脚本中的timescale为
1ns/1ns
,则脚本中的timescale将作用于harness模块。 - 如果保留harness的timescale,注释掉m1的timescale,则m1的timescale为harness的timescale,而非脚本中的timescale设置
- 由以上可知,timescale的判定原则为就近原因。如果查看波形觉得timescale异常,一定是找到了错误的timescale。