热度 25| |
如果激励 (stimulus) 正确,SDF 反标后仿 (SDF back annotated gate level simulation) 大概是最接近实际的仿真了。即使跑得慢,还是应该尽可能在各个 corner 下把所有的 test case 都跑一遍。
SDF 反标可以通过 verilog task $sdf_annotate 实现。$sdf_annotate 是 Verilog 标准的一部分,具体细节可以在 Verilog LRM (language reference manual) 里找到。$sdf_annotate可以直接在 test bench 里加上。下面是我自己常用的代码。
`ifdef GLS_SDF
initial begin
`ifdef SDF_MAX
$display("Performing SDF_MAX back annotation for adc_dig ...");
$sdf_annotate("/home/project/digital/adc_dig/pd/EXPORT/SDF/adc_dig_func_max.sdf", tb_dig_core.u_adc_dig,,"./adc_dig_sdf_max.log", "MAXIMUM");
`elsif SDF_MIN
$display("Performing SDF_MIN back annotation for adc_counter, adc_dig ...");
$sdf_annotate("/home/project/digital/adc_dig/pd_1p2v/EXPORT/SDF/adc_dig_func_min.sdf", tb_dig_core.u_adc_dig,,"./adc_dig_sdf_min.log", "MINIMUM");
`elsif SDF_TYP
$display("Performing SDF_TYP back annotation for adc_counter, adc_dig ...");
$sdf_annotate("/home/project/digital/adc_dig/pd/EXPORT/SDF/adc_dig_func_typ.sdf", tb_dig_core.u_adc_dig,,"./adc_dig_sdf_typ.log", "TYPICAL");
`else
$display("\nINFO: No SDF back annotation for adc_counter, adc_dig ...");
`endif
end
`endif
以 Cadence 仿真工具为例,跑后仿的时候,在 irun/xrun 命令行加上 -DEFINE GLS_SDF -DEFINE SDF_MAX, 仿真工具就可以编译上面这段代码并进行反标。 这里 -DEFINE SDF_MAX 选择的是 worst case corner。
这里需要注意两点。
- SDF 文件的路径。如有疑问,用完整路径。
- 待反标模块在 test bench 中的 hierarchy。上面这个例子里 u_adc_dig 模块直接在 test bench 里例化 (instantiate)。很多时候会在下面几层,路径会长一些。
仿真启动后应该查一下 log,找到类似下面这段。这里的 % 很重要,代表了 SDF 反标的成功率。通常都应该在 95% 以上。如果低了,就应该查一下是哪里出错。通常是 hierarchy 没对上,或是电路中其他模块是网表,test bench却没有加上 SDF 反标文件。
Annotation completed successfully...
SDF statistics:
No. of Pathdelays = 10133 No. of Disabled Pathdelays = 0 Annotated = 97.88% (9918/10133)
No. of Tchecks = 5292 No. of Disabled Tchecks = 1524 Annotated = 92.36% (3480/3768)
Total(T) Disabled(D) Annotated(A) Percentage(A/(T-D))
Path Delays 10133 0 9918 97.88
$width 2531 762 1737 98.19
$recrem 831 254 577 100.00
$setuphold 1930 508 1166 82.00
上面这个例子里 $setuphold 反标成功率比较低,原因是设计中同步电路第一级的被禁止做 timing check 了,是有意这样做的。同步器第一级不做 timing check,避免了同步器输出 X。
Cadence irun/xrun 有个命令行开关,可以很方便地报告哪些部分反标不成功。在 irun/xrun 命令行加上 -sdf_stats sdfstats.log,在文本编辑器中看一下 sdfstats.log,一目了然。
Lover_Momo: 请教两个问题:
1. 数字后端在做的时候,特别是先进工艺制成,无法做到所有的Corner都setup/hold clean(一(一般Sign-off只要求某些Corner setup clean, 某些co ...
李九阳: 请教下,“同步器第一级不做 timing check”,这个要怎么做呢?sdf反标语法中支持哪些cell不做检查么?
涟漪~: 请教一下这样标出来,Pathdelays 反标率100%,Tchecks反标率38%,width和removal完全没反标成功,这大概是什么问题啊
jake: Tchecks, width, recrem太低了。我会先打开标准元.v文件,仔细看一下DFF的模型,看看是不是模型里有什么define之类的在仿真器命令行没有定义 ...
njupt_nzt: 请问一下我在vcs的dve运行命令行输入-DEFINE GLS_SDF -DEFINE SDF_MAX,但是它提示我unknown option '-DEFINE GLS_SDF -DEFINE SDF_MAX',这是什么问题 ...
ldjiang: 您好,我刚刚开始学习数字电路后端仿真,使用nclaunch进行仿真模拟尝试观察延迟时,我发现加入了sdf文件后Tchecks始终为0,原始sdf文件是用write_sdf -edges noe ...