后仿中$setup,$hold与$setuphold

hegangben
2025-12-30 / 0 评论 / 44 阅读 / 正在检测是否收录...

在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

评论 (0)

取消