在sdf2.1版本中,只能用$setup,$hold和$recovery,$hold。在sdf3.0版本中,增加了$setuphold,$recrem,$removal。分开描述的$setup、$hold、$recovery、$removal不支持negative value。如果要标注负值只能用合起来的$setuphold和$recrem。
$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))
)
$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))
)
可以看出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,但也就不能反标注负值了。
提示:
write_sdf -version 3.0 \
-context verilog \
-include {SETUPHOLD RECREM} \
max.sdf
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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。