|
100资产
Memory Compiler产生的lib中,看到有两种类型的 D->Q的delay参数:
1. cell rise/full;
2. retaining rise/full;
对应lib的部分描述如下:
timing() {
related_pin : CLK;
timing_type : rising_edge;
timing_sense : non_unate;
when : "!CEN&RET1N&GWEN&!EMA[2]&EMA[1]&EMA[0]";
sdf_cond : "CEN == 1'b0 && RET1N == 1'b1 && GWEN == 1'b1 && EMA[2] == 1'b0 && \
EMA[1] == 1'b1 && EMA[0] == 1'b1";
cell_rise(sram_sp_144_14_clockslew_outputload_delay_template) {
index_1 ("0.001000, 0.008000, 0.031000, 0.075000, 0.144000, 0.242000, 0.369000");
index_2 ("0.004000, 0.009000, 0.018000, 0.035000, 0.075000, 0.150000, 0.300000");
values (\
"1.590206, 1.600698, 1.614879, 1.640112, 1.689349, 1.778304, 1.952139", \
"1.591644, 1.602135, 1.616317, 1.641550, 1.690787, 1.779741, 1.953577", \
"1.603905, 1.614398, 1.628579, 1.653811, 1.703049, 1.792002, 1.965840", \
"1.624444, 1.634935, 1.649117, 1.674350, 1.723586, 1.812540, 1.986378", \
"1.654888, 1.665380, 1.679561, 1.704795, 1.754033, 1.842986, 2.016823", \
"1.688549, 1.699042, 1.713223, 1.738456, 1.787695, 1.876648, 2.050484", \
"1.716075, 1.726567, 1.740748, 1.765980, 1.815219, 1.904172, 2.078010" \
);
}
retaining_rise(sram_sp_144_14_clockslew_outputload_retain_template) {
index_1 ("0.001000, 0.008000, 0.031000, 0.075000, 0.144000, 0.242000, 0.369000");
index_2 ("0.004000, 0.009000, 0.018000, 0.035000, 0.075000, 0.150000, 0.300000");
values (\
"0.470076, 0.478470, 0.490384, 0.511301, 0.552343, 0.625640, 0.769816", \
"0.471345, 0.479739, 0.491653, 0.512570, 0.553613, 0.626909, 0.771086", \
"0.481654, 0.490048, 0.501962, 0.522879, 0.563921, 0.637217, 0.781395", \
"0.500874, 0.509267, 0.521182, 0.542098, 0.583140, 0.656436, 0.800613", \
"0.528794, 0.537187, 0.549102, 0.570018, 0.611061, 0.684357, 0.828534", \
"0.558269, 0.566663, 0.578578, 0.599494, 0.640537, 0.713833, 0.858011", \
"0.583185, 0.591579, 0.603493, 0.624409, 0.665453, 0.738748, 0.882927" \
);
不知道retaining delay是在什么流程中使用的?
通常我们在做后端APR的时候(之前用的Memory Compiler),选用ss corner的cell delay参数进行setup timing check,选用ff corner的cell delay参数进行hold timing check;
现在,ss corner有两个delay参数,cell delay 1.64ns;retaining delay 0.12ns;
ff corner 有两个delay 参数,cell delay 0.90ns;retaining delay 0.25ns;
将lib文件读入工具,
工具会选择最差的做setup timing check(1.64ns),选择最好的做hold timing check(250ps);
cell delay gap相差太大,timing很难收敛。
因此,该选哪个delay参数,作为hold timing check的参数?
对retaining的理解,也有问题。从Liberty User Guides中看到:
retaining_rise and retaining_fall Groups
The retaining delay is the time during which an output port retains its current logical value
after a voltage rise or fall at a related input port.
The retaining delay is part of the arc delay (I/O path delay); therefore, its time cannot exceed
the arc delay time. Because retaining delay is part of the arc delay, the retaining delay tables
are placed within the timing arc.
The value you enter for the retaining_rise attribute determines how long the output pin
retains its current value, 0, after the value at the related input port has changed.
The value you enter for the retaining_fall attribute determines how long the output
retains its current value, 1, after the value at the related input port has changed.
这个仿佛是一种跟sram端口电压有关的设定,用于sram的电压恢复时候的时序检查,不知理解对不对。
补充内容 (2023-12-29 10:13):
参数有误,改为:ss corner有两个delay参数,cell delay 1.64ns;retaining delay 0.51ns; |
最佳答案
查看完整内容
哦,那感觉你的主贴说的不是很贴切。应该是无论在哪个corner,都要做setup 、 hold check。但是最终的timing signoff是要在fast corner的hold和slow corner的setup;
另外,我看你的主贴里写ss corner的retaining delay 比 ff corner的更小?所以不是仅仅看fast corner? 应该看最小的min delay?
如果是compiler产生的memory,确实有时候cell delay和retaining delay 会差很多,compiler产生的lib大部分时候会把 out pin bus ...
|