当前位置:首页 > 公众号精选 > 全栈芯片工程师
[导读]我们可以在做布局之前通过读入scandef或者其他方式来告诉工具扫描链的起止信息,然后在Place的时候启动scanreorder,让工具对扫描链进行重排序以节省绕线资源。 关于scanreorder的设置/命令:Innovus:在布局之前设置:setPlaceMode-plac...


我们可以在做布局之前通过读入scandef或者其他方式来告诉工具扫描链的起止信息,然后在Place的时候启动scan reorder,让工具对扫描链进行重排序以节省绕线资源。

 

关于scan reorder的设置/命令:

Innovus:

在布局之前设置:

setPlaceMode -place_global_reorder_scan true|false

默认该选项就处于true状态,也就是工具会自动做reorder。

 

ICC:

place_opt -optimize_dft

 

下面两幅图为同一条扫描链在做scan reorder和不做reorder的局部放大图的对比,能清楚的看到差异:

从图中能看出做了reorder之后,扫描链的连接效果挺好的,没有出现扫描链多次交叉的情况,因此节省了很多绕线资源,否则的话扫描链随意交叉将浪费大量的绕线资源。

 

按照上述在DFT Compiler中做完Scan chain导入ICC中做PR,然后在做形式验证的时候发现形式验证是失败的,如下图所示:

做形式验证和DFT设计的流程也完全没用问题。

正如上面显示的Port Failing一样,经过Debug发现问题发生在输出端口处: 

 

在做PR之前的网表中,IO fsk_out_block的输入Pin I上接的是…_count_reg_2的Q Pin,可是在做完布局布线后的网表中,它接的却是…_count_reg_1的Q Pin,这显然是不对的。

大家可以思考下这个问题的原因以及解决方案。

 

 

下面公布答案:

原因:这是一个带有IO的full chip design,scan def中通过制定scan chain的起止IO来定义scan chain的order。导入ICC中后,工具对中间的部分做了reorder,因此将…_count_reg_1接到了输出IO也是scan output的IO上因此产生了这个问题。

Scan def before scan reorder:

Scan def after scan reorder:

 

有看过Place阶段scan reorder推文以及里面里面的scan def语法的话你应该就知道这个问题的解决方案了(推文和scan def的介绍在 自己的网易云课堂课程:《Innovus Flow系列教程(图文教程)》中)。我们只需要对DFT Compiler导出的scan def文件进行小的修改即可,将…_count_reg_2到fsk_out_block的那部分设置成ORDER即可,工具便不会对该部分进行重组。

其实如果你做了Innovus的Lab的话可以看到在scan def中做了类似的处理。

修改后的scan def文件:

VERSION 5.5 ;

NAMESCASESENSITIVE ON ;

DIVIDERCHAR "/" ;

BUSBITCHARS "[]" ;

DESIGN top_pad ;

 

SCANCHAINS 1 ;

 

- C1

START data_in_block C

FLOATING fsk_modulator_count_reg_0_ ( IN SI ) ( OUT QN )

           fsk_modulator_count_reg_1_ ( IN SI ) ( OUT Q )

ORDERED

           fsk_modulator_count_reg_2_ ( IN SI ) ( OUT Q )

           fsk_out_block ( IN I ) ( OUT PAD )

STOP fsk_out_block I ;

 

END SCANCHAINS

 

END DESIGN

 做完PR以及scan reorder之后,ICC吐出的scan def:

可以看到工具并未修改输出IO上的连接关系,后边做形式验证的结果:

是通过的。

 


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭