reset的处理

原文: bbs.ednchina.com
对于reset的处理:
1. 设计:
1.1 对于从芯片pad进来的reset信号,与clock相位无关,所以一定是异步的。在设计时要现将pad引进来的reset同步化,然后更给内部flip-flop使用。synchronizer结构如下:


1.2 内部逻辑使用异步reset或同步reset设计都可以。但是最好不要混用。

1.3 内部逻辑使用多个时钟域时,reset进入每个时钟后都要用同步器同步。如果是从快速时钟域进入慢速时钟域,reset要增加其assertion宽度,保证对慢速时钟域有效。

1.4 有些人建议在reset之后再启动clock(gating clock),这样做的好处:
  1)meta-stable问题不存在了。
  2)利于STA分析,recovery/removal分析不用做了。
  3)后端工具也不用做所谓的reset tree,省面积,省功耗。
不好之处:
  1)对于同步reset设计无效果。

2. DC综合(DC synthesis)
2.1 对于从pad引进的reset,应该将其设成false_path:
    set_false_path [get_ports reset]

2.2 对于同步后的reset,DC综合室时应将其设置成:
    set_ideal_network [get_pins rst]
  这样DC不会对reset信号进行优化,不会进行DRC检查。
    set_dont_touch_network [get_pins rst]
  这样DC不会对reset信号进行优化。

2.3 如果内部设计是同步reset设计,在读入hdl之前还要设定:
   hdlin_ff_sync_set_reset
  这样DC会将同步reset在combinational逻辑之后在和在一起,输入给flip-flop的D端。

2.4 reset tree的生成,skew balance等工作交给后端处理。

3. STA
3.1 布局布线后做静态仿真,根据reset和clock的关系决定是否检查recovery/removal violation。对于reset时关掉clock的设计,reset动作前后保证没有clock,可以set_false_path。其它就要检查recovery/removal。

3.2 对于同步reset设计,不需要关心recovery/removal,因为reset是连到flip-flop的D端,和其它逻辑一样,做setup/hold检查。

4. P&R
4.1 encounter中处理(参考:http://www.edacn.net/bbs/viewthread.php?tid=52252&page=1)
  1)去掉dont_touch
 
2)设置max_transition/fanout/cap
 
3)优化
 
3)或者用bufferTreeSynthesis为reset信号作buffer tree
 
4)布线
 
5)再做power analysis就没问题了

5. DFT综合
5.1 有内部控制的异步reset时(如子模块的reset由其他模块的寄存器输出控制),由其异步reset的flip-flop不做scan chain插入。