在sdf2.1版本中,只能用$setup,$hold和$recovery,$hold。在sdf3.0版本中,增加了$setuphold,$recrem,$removal。分开描述的$setup、$hold、$recovery、$removal不支持negative value。如果要标注负值只能用合起来的$setuphold和$recrem。
某工艺的verilog仿真库
$hold(posedge T &&& (shcheckTDlh=== 1'b1),
posedge D &&& (shcheckTDlh=== 1'b1),1.0);
$hold(posedge T &&& (shcheckTDlh=== 1'b1),
negedge D &&& (shcheckTDlh=== 1'b1),1.0);
$setup(posedge D &&&(shcheckTDlh === 1'b1),
posedge T &&& (shcheckTDlh=== 1'b1),1.0);
$setup(negedge D &&&(shcheckTDlh === 1'b1),
posedge T &&& (shcheckTDlh=== 1'b1),1.0);
$recovery(posedge S,posedge T,1.0);
$removal(posedge S,posedge T,1.0);对应3.0版本的SDF
TIMINGCHECK
(WIDTH (negedge S) (0.103::0.103))
(REMOVAL (posedge S) (posedge T)(0.140::0.140))
(RECOVERY (posedge S) (posedge T)(0.000::0.000))
(WIDTH (negedge T) (0.078::0.078))
(WIDTH (posedge T) (0.094::0.094))
(SETUP (posedge D) (COND shcheckTDlh===1'b1(posedge T)) (0.000::0.000))
(SETUP (negedge D) (COND shcheckTDlh===1'b1(posedge T)) (0.016::0.028))
(HOLD (posedge D) (COND shcheckTDlh===1'b1 (posedgeT)) (0.043::0.049))
(HOLD (negedge D) (COND shcheckTDlh===1'b1 (posedgeT)) (0.009::0.010))
)另一个工艺的verilog仿真库
$setuphold (posedge CP, posedge D, 0, 0,notifier,,, delayed_CP, delayed_D);
$setuphold (posedge CP, negedge D, 0, 0,notifier,,, delayed_CP, delayed_D);
$recovery (posedge SDN, posedge CP, 0,notifier);
$hold (posedge CP, posedge SDN, 0,notifier);对应的2.1版本的SDF:
(TIMINGCHECK
(WIDTH (negedge SDN) (1.404::1.404))
(HOLD (posedge SDN) (posedge CP)(-0.198::-0.198))
(RECOVERY (posedge SDN) (posedge CP)(0.267::0.267))
(WIDTH (negedge CP) (0.425::0.425))
(WIDTH (posedge CP) (0.440::0.440))
(SETUP (posedge D) (posedge CP)(0.057::0.057))
(SETUP (negedge D) (posedge CP)(0.082::0.082))
(HOLD (posedge D) (posedge CP)(-0.048::-0.048))
(HOLD (negedge D) (posedge CP)(-0.013::-0.013))
)对比两个版本的SDF
可以看出3.0的SDF用$removal代替了$hold。第一个verilog仿真库,采用了分开的$setup和$hold,$recovery和$removal。第二个库采用了合起来的$setuphold,但$recovery和$hold还是分开的。
所以,第一个库不支持负值的标注;第二个库$setup和$hold支持负值,而$recovery和$hold不支持负值。
在SDF版本选择上,第一个库只能用3.0,因为库里用到了$removal。第二个库只能用2.1,因为使用了$hold,如果用3.0的话,Incisive后仿时,会报错,说找不到$removal。
结论
工厂提供的verilog仿真库总是不那么规范。要么修改库(让工厂修改或自己修改),要么根据库产生符合条件的SDF,但也就不能反标注负值了。
提示:
pt产生SDF时加参数-version 2.1|3.0,用include来灵活控制,可产生不同需求的SDF。具体可查pt的write_sdf命令的参数。下面是一个例子:
write_sdf -version 3.0 \
-context verilog \
-include {SETUPHOLD RECREM} \
max.sdf
后仿时看反标注的成功率,如果反标成功率太低,要仔细检查。Incisive的反标率如下:
SDF statistics: No. of Pathdelays =37802 Annotated = 100.00% -- No. ofTchecks = 25964 Annotated = 99.60%
Total Annotated Percentage
Path Delays 37802 37802 100.00
$hold 2306 2306 100.00
$width 12632 12632 100.00
$recovery 2306 2306 100.00
$setuphold 8720 8616 98.81然而VCS并没有这样的百分比报告。
评论 (0)