第三节 隔离单元(Isolation Cell)设计:AND/OR类型隔离逻辑、钳位值选择、中芯国际库的ISO cell使用规范

好,咱们接着聊跨电压域设计。前面讲了电平转换器,今天重点说说隔离单元——ISO cell。

说实话,隔离单元这玩意儿,看着简单,但坑特别多。我早期有个项目,就因为隔离逻辑选错了类型,导致芯片在低功耗模式下数据全乱套。那次教训挺深刻的。

一、为什么需要隔离单元?

你想想看,一个模块断电了,它的输出信号会变成什么?

嗯,大概率是浮空状态,或者是不确定的X态。如果这个信号直接连到另一个还在工作的模块,那后果就是——逻辑混乱、漏电剧增、甚至整个芯片死机。

隔离单元的作用,说白了就是:在源域断电时,把输出钳制到一个确定的、安全的值

核心原则:隔离单元必须放在接收端(always-on域),而不是发送端(可关断域)。这个顺序千万别搞反了。

二、AND类型 vs OR类型隔离逻辑

中芯国际的库提供了两种基本隔离类型:AND型和OR型。怎么选?看你的需求。

1. AND型隔离

AND型隔离,输出端默认被钳位到逻辑0。它的控制信号是低电平有效——当ISO_EN=0时,输出被强制拉低;当ISO_EN=1时,正常透传数据。

我个人的习惯是:如果接收端模块在休眠时希望看到低电平,就用AND型。比如复位信号、使能信号,这些通常都是低有效,用AND型很自然。

// AND型隔离单元的真值表
// ISO_EN = 0: 输出 = 0 (钳位)
// ISO_EN = 1: 输出 = 输入数据

module iso_and (
    input  data_in,
    input  iso_en,
    output data_out
);
    assign data_out = data_in & iso_en;
endmodule

2. OR型隔离

OR型隔离正好相反,输出端默认被钳位到逻辑1。控制信号是高电平有效——当ISO_EN=1时,输出被强制拉高;当ISO_EN=0时,正常透传。

OR型适合什么场景?我遇到过这样一个案例:某个时钟门控信号,在休眠时必须保持高电平,否则时钟会意外关闭。这时候用OR型隔离就对了。

// OR型隔离单元的真值表
// ISO_EN = 1: 输出 = 1 (钳位)
// ISO_EN = 0: 输出 = 输入数据

module iso_or (
    input  data_in,
    input  iso_en,
    output data_out
);
    assign data_out = data_in | iso_en;
endmodule

小技巧:如果你不确定该用哪种,我建议优先考虑AND型。因为大多数控制信号在休眠时希望保持低电平,这样更安全。但具体还是要看你的设计需求。

三、钳位值选择——0还是1?

这个问题其实没有标准答案。但有几个原则可以参考:

  • 看接收端的需求:接收模块在休眠时希望看到什么值?这个值就是你的钳位值。
  • 考虑漏电:钳位到0通常比钳位到1更省电,因为NMOS管在关断时漏电更小。
  • 避免总线冲突:如果信号是双向总线,钳位值必须确保不会与其他驱动源冲突。

我记得有一次,一个同事把隔离钳位值设成了1,结果总线上的上拉电阻和隔离单元打架,电流直接飙到几十毫安。嗯,这种低级错误,犯一次就记住了。

信号类型 推荐钳位值 说明
复位信号 0 (AND型) 低电平复位,休眠时保持复位态
使能信号 0 (AND型) 休眠时关闭功能
时钟门控 1 (OR型) 休眠时保持时钟开启或关闭
数据总线 视情况而定 避免总线冲突
中断信号 0 (AND型) 休眠时屏蔽中断

四、中芯国际库的ISO cell使用规范

中芯国际的库,ISO cell的命名通常有规律可循。比如:

  • ISO_AND_X1:AND型隔离,驱动能力X1
  • ISO_OR_X2:OR型隔离,驱动能力X2
  • ISO_AND_LP_X1:低功耗版本

使用时有几个规范必须遵守:

  1. 控制信号必须来自always-on域:ISO_EN信号必须由永不掉电的模块产生,否则隔离单元本身会失效。
  2. 隔离单元不能串联:两个ISO cell串在一起,逻辑上没问题,但时序和功耗都会变差。我见过有人这么干,结果时序收敛不了。
  3. 注意驱动能力:ISO cell的驱动能力要匹配负载。驱动能力太小,信号上升沿变缓;太大,功耗浪费。
  4. 布局位置:ISO cell尽量靠近接收端,减少长走线带来的干扰。

警告:千万不要把ISO cell放在可关断域!我曾经见过一个设计,ISO cell和源模块一起断电了,结果隔离功能完全失效,数据乱飞。这种错误在综合阶段就应该被检查出来。

五、实战中的避坑指南

最后分享几个我踩过的坑:

  • 坑1:忘记加隔离——跨电压域的信号,如果没加隔离,仿真时可能看不出问题,但流片回来就等着哭吧。
  • 坑2:隔离控制信号时序不对——ISO_EN必须在源域断电之前生效,否则会有短暂的不确定态。这个时序约束一定要做。
  • 坑3:隔离单元太多——每个信号都加隔离,面积和功耗会爆炸。合理的做法是:只对跨域的关键信号加隔离,非关键信号可以复用。

嗯,关于隔离单元,今天就聊这么多。下一节咱们讲讲如何用UPF描述这些隔离策略,那个才是真正体现功力的地方。