单元或宏(macro)的库文件可以将时序弧指定为非时序(non-sequential)检查,例如两个数据引脚之间的时序弧。非时序检查是指两个引脚之间的检查,两者都不是时钟。一个引脚是约束引脚,其作用类似于数据,而第二个引脚是相关引脚,其作用类似于时钟。该检查指定了在相关引脚上的数据改变前后,约束引脚上的数据必须保持稳定多长时间。数据到数据建立时间检查很重要的一点是,约束引脚和相关引脚的发起时钟沿都来自同一时钟周期。
非时序检查被指定为单元库规范的一部分,以下是这种时序弧在单元库中的表示形式:
pin (CDN) {
timing () {
related_pin : "SDN";
sdf_cond :CP_D_SE_SI_SDFCHK";
timing_type : non_seq_hold_rising;
when : "CP&D&SE&SI";
rise_constraint (constraint_template_5x5) {
index_1 ("0.0031, 0.0429, 0.1225, 0.2817, 0.6");
index_2 ("0.0031, 0.0429, 0.1225, 0.2817, 0.6");
values(
"-0.0537967,-0.0744717,-0.106705,-0.159996,-0.241199",
"-0.0586925,-0.0795155,-0.110903,-0.163558,-0.244908",
"-0.0745354,-0.0943225,-0.127875,-0.182254,-0.263457",
"-0.102063,-0.123939,-0.158541,-0.214474,-0.29701",
"-0.145043,-0.168566,-0.206536,-0.265257,-0.351465"
);
}
}
...
timing () {
related_pin : "SDN";
sdf_cond :CP_D_SE_SI_SDFCHK";
timing_type : non_seq_setup_rising;
when : "CP&D&SE&SI";
rise_constraint (constraint_template_5x5) {
index_1 ("0.0031, 0.0429, 0.1225, 0.2817, 0.6");
index_2 ("0.0031, 0.0429, 0.1225, 0.2817, 0.6");
values(
"0.0815198,0.103798,0.14116,0.206797,0.316252",
"0.092339,0.114617,0.151082,0.215619,0.325073",
"0.115258,0.136995,0.174141,0.237997,0.34626",
"0.168424,0.188704,0.223172,0.285711,0.391171",
"0.283643,0.299926,0.329206,0.384944,0.480411"
);
}
}
}
setup_rising、hold_rising指相关引脚的上升沿,lib中也定义了setup_falling和hold_falling的时序弧。
在非时序检查中,建立时间和保持时间的值是从标准单元库中获得的。
非时序建立时间检查指定了约束信号必须相对于相关引脚多早到达,如下图所示。单元库中包含了建立时间弧SDN->CDN,它被指定为了非时序弧。如果在建立时间窗口内出现CDN信号,则非时序建立时间检查将失败。
非时序保持时间检查指定了约束信号必须相对于相关引脚多晚到达,如下图所示。如果CDN在保持时间窗口中改变了,则非时序保持时间检查将失败。
非时序建立时间检查报告如下所示。