什么是SDF文件?
SDF(Standard Delay Format)文件是把布局布线过程中器件之间的延迟和线之间的延迟信息保留下来,据此就可以在路径时序分析时将电路中整条路径的时序计算出来,再根据时序约束条件判断电路时序是否满足要求。没有反标SDF文件的门级仿真,用综合出的门级网表就能完成,这时由于hold没有修,所以会出现不少时序违例。带时序的反标的门级仿真,也就是布局布线后的仿真,这时的网表是修补完timing的网表,与没有反标SDF的门级仿真相比,时序违例会减少。
SDF延迟反标注方法:
方法一:使用$sdf_annotate将SDF文件反标到网表中:
$sdf_annotate("sdf_file" [,module_instance] [,"sdf_configfile"] [, "sdf_logfile"] [,"mtm_spec"]
[, "scale_factors"] [, "scale_type"]);
其中,module_instance是例化的模块名,例如在testbench中,例化顶层:
digital_top digital_top_u
digital_top_u是例化的模块名,那么按照上面的格式,在testbench中添加下列代码:
initial begin
$sdf_annotate( "fast.sdf" ,digital_top_u , , “fast_sdf.log" ,"MAXIMUM" , , );
end
sdf_file: sdf文件;(此例中sdf文件名为fast.sdf)
module_instance:调用$sdf_annotate模块实例的范围;
sdf_configfile:指定SDF配置文件;
sdf_logfile:生成所有的sdf反标错误的文件,需在编译时使用+sdfverbose。
mtm_spec:指向哪一种延时类型,通常有三种min,typ,max,分别表示最小延时,常规延时,最大延时。对应写在$sdf_annotate函数中是"MINIMUM", "TYPICAL", "MAXIMUM"。
在仿真器读入SDF的时候,要指定使用哪一组。
scale_factors:指定min:typ:max的缩放因子,默认为三个正实数“1.0:1.0:1.0”。
由于是默认参数,所以在上面的$sdf_annotate( "fast.sdf" ,digital_top_u , , “fast_sdf.log" ,"MAXIMUM" , , ); 中的对应位置用空格表示,也可以不用空格,用空格对应参数看起来更清楚。
scale_type:指定SDF文件中缩放前使用的延迟值,它可能的值是"FROM_TYPICAL",
"FROM_MINIMUM" , "FROM_MAXIMUM"和默认"FROM_MTM";
此项参数也是默认,同样在$sdf_annotate函数中对应位置可以用空格来表示。除sdf_file必须要给出以外,其他参数都可以使用默认值,用空格来表示,也可以不用空格。
VCS编译指令:-full64 -kdb -sverilog -f vflist -l com.log -debug_access+all +vcs+vcdpluson +negdelay -sdfretain +sdfverbose
Notes:其中testbench,dut.v,sdf文件放在同一层目录(同一个文件夹),但vflist里面只需要有testbench和dut.v的文件名,不需要把sdf文件的名字写进去,因为sdf文件已经用$sdf_annotate函数调用了。
如何确认成功反标?
编译完成后,可以从终端或者log文件中看到这么一句话:
SDF annotation completed.
同时也会显示反标过程中有多少个error和warning。
方法二:VCS编译器配置
在VCS编译指令中加上 -sdf min|typ|max:instance_name:file.sdf,
具体格式为 -sdf max:tb_digital_top.digital_top_u:fast.sdf
其中,tb_digital_top为testbench的模块名,digital_top_u为顶层的例化名。
同时编译选项加上 +neg_tchk -negdelay -sdfretain
注意VCS编译指令中最大延时用max表示,在$sdf_annotate函数中最大延时用MAXIMUM表示。
Notes:关于后仿的延时文件fast.sdf以及slow.sdf,前者表示快的,后者表示慢的。fast.sdf检查hold时间,slow.sdf检查setup时间,越慢setup越不容易满足,越快hold越不容易满足。
其中,sdf反标注有延迟类型的选择,分最坏,最好,最常用三种情况,最坏情况:slow对应max,fast对应min。
Tips:如果需要对多个例化的模块进行延迟反标注,可以在testbench里面,用多个$sdf_annotate,分别用来标注需要反标的模块。