《每日一题》NO.27:谈谈Spare Cell 在芯片设计中的作用

Spare Cell在芯片设计中扮演重要角色,它们是预留的逻辑单元,如DFF、NAND等,用于在流片后修复设计错误,节省高昂的改版成本,加速产品上市。芯司机每日一题探讨这一主题,帮助求职者提升专业知识。

芯司机《 每日一题》会每天更新一道IC面试笔试题(其中有些题目已经被很多企业参考采用了哦),聪明的你快来挑战一下吧!

今天是第27题

Spare Cell为何物,它在芯片设计中有何作用呢?老司机带你一探究竟。

今天的题就是这样啦

欢迎大家在评论区留言,写下你的答案或者理解~

公布答案!

如解说中所说:

<think>我们正在讨论的是在Innovus中进行place操作之前加入spare cell的方法。根据引用[1],对于老工艺,我们会在place阶段通过`placeSpareModule`命令来添加spare cell,这些spare cell的名字通常会带有`spr_gate`关键词。 但是,用户询问的是在place操作之前加入spare cell的方法。在Innovus流程中,通常我们会在placement阶段或之前添加spare cell。具体方法如下: 1. **在placement之前添加spare cell**:可以通过在网表中预先生成spare cell实例,或者在读入网表后、placement之前使用命令添加spare cell。 2. **使用`addSpareCells`或`placeSpareModule`命令**:在Innovus中,可以使用`addSpareCells`命令在指定的区域或整个设计中添加spare cell,也可以在placement阶段使用`placeSpareModule`命令放置spare module(即一组spare cell)。 然而,需要注意的是,引用[1]提到的是在place阶段通过`placeSpareModule`来添加。如果我们想在place操作之前就加入,那么可以在读入设计后,执行placement之前,使用`createInst`命令手动创建spare cell的实例,但是这样不会自动放置,需要后续placement工具去放置。或者,我们可以使用`addSpareCells`命令,这个命令可以在pre-place阶段使用。 具体步骤: - 首先,确保你的库中有定义spare cell。通常,spare cell是标准单元库中的一部分,它们可能是简单的门(如NAND、NOR、INV等)或者更复杂的单元(如触发器、缓冲器等)。 - 然后,在Innovus的Tcl脚本中,在placement之前(即执行`placeDesign`之前)使用`addSpareCells`命令。 示例命令: ```tcl # 添加指定类型的spare cell,并指定数量或比例 addSpareCells -cell {INVX1 AND2X1 OR2X1} \ -num_instances 100 \ -prefix SPARE_ ;# 指定实例名前缀 # 或者按比例添加 addSpareCells -cell {INVX1 AND2X1 OR2X1} \ -percent 1 ;# 占设计总单元数的1% ``` 此外,引用[2]提到,为了后续FIB(聚焦离子束)修改的方便,spare cell的输入输出端需要特殊处理,通常接VSS,但为了FIB方便,应该将连接引到顶层金属。这个处理通常在布线阶段,但我们添加spare cell时也需要考虑。在添加spare cell时,我们可以通过设置属性使得spare cell的输入输出连接到VSS,但注意连接方式要方便FIB修改。 另外,我们也可以使用`placeSpareModule`命令在placement阶段放置spare module,这个命令可以放在`placeDesign`之前,但它实际上是在placement过程中放置的。所以严格来说,它是在place操作中进行的,而不是之前。 因此,如果用户希望在place操作之前就加入spare cell(即作为设计的一部分进入placement),我们可以采用以下两种方法: **方法一:在网表中预先实例化spare cell** 在RTL设计或综合后的网表中,直接实例化spare cell,这样在Innovus读入网表后,这些spare cell就已经存在,然后在placement阶段,工具会将这些spare cell当作普通单元进行放置。 **方法二:在Innovus中读入设计后,placement之前使用`createInst`或`addSpareCells`命令** 使用`createInst`命令手动创建实例,然后设置其位置为未放置状态,等待placement工具放置。或者使用`addSpareCells`命令,该命令可以批量添加spare cell实例,并可以选择是否立即放置(默认不放置,等待后续placement)。 注意:`addSpareCells`命令在Innovus中可以在placement之前使用,添加的spare cell实例在后续placement阶段会被放置。而`placeSpareModule`通常用于放置一个spare module(包含多个spare cell的一个模块),它需要在placement阶段执行。 根据引用[1]和用户需求,我们更倾向于在placement之前添加,所以使用`addSpareCells`命令是一个合适的方法。 步骤示例: 1. 读入设计(通过`read_db`或读入Verilog网表等)。 2. 初始化布局(例如,添加floorplan等)。 3. 使用`addSpareCells`命令添加spare cell。 4. 运行`placeDesign`进行布局。 同时,为了满足引用[2]中关于FIB修改的要求,我们需要在布线阶段对spare cell的连线进行特殊处理。这可以通过在布线前设置spare cell的引脚连接规则来实现,例如使用`setPinConnectRule`命令,但详细做法不在本问题范围内。 总结:在Innovus中,在place操作之前加入spare cell的方法是使用`addSpareCells`命令,该命令可以在执行placement之前添加spare cell实例,这些实例将在后续的placement过程中被放置。 注意:在添加spare cell时,为了避免这些spare cell被优化掉,可能需要设置适当的属性(如`setDontTouch`)。 示例脚本: ```tcl # 读入设计 read_db design.db # 设置布局 initialize_floorplan ... # 添加spare cell,添加100个,由INVX1、AND2X1、OR2X1组成 addSpareCells -cell {INVX1 AND2X1 OR2X1} -num_instances 100 -prefix SPARE_ # 设置spare cell为dont touch set_db [get_cells SPARE_*] .dontTouch true # 进行布局 placeDesign ``` 这样,spare cell就被添加并在布局阶段放置。 关于引用[3]中提到的dbGet,如果用户需要查询spare cell是否添加成功,可以使用dbGet命令,例如: ```tcl set spare_cells [dbGet [dbGet top.insts.cell.name INVX1 -p].name] ``` 但初学者可能觉得复杂,这里不展开。 最后,生成相关问题: §§相关问题§§ 1. 如何验证添加的spare cell设计中正确放置? 2. 在Innovus中,如何为spare cell设置特殊的布线规则以满足FIB修改需求? 3. 添加spare cell后如何避免它们在后续优化中被移除? 4. 如何确定需要添加的spare cell的数量和类型? </think>### Innovus 在 Placement 前添加 Spare Cell 的方法 在 Innovus 流程中,要在 **placement 操作之前** 添加 spare cell,可通过以下两种方法实现: --- #### 方法 1:通过网表预插入(推荐) 在进入 Innovus 前,直接在综合网表中实例化 spare cell: ```tcl # 示例:在 Verilog 网表中手动实例化 spare cell module top (...); // 主设计代码... // 预插入 20 个备用反相器 INVX1 spr_gate_spare_inv_0 (.A(1'b0), .Y()); // 输入接地[^2] INVX1 spr_gate_spare_inv_1 (.A(1'b0), .Y()); ... INVX1 spr_gate_spare_inv_19 (.A(1'b0), .Y()); endmodule ``` **关键点**: - 命名规范:使用统一前缀如 `spr_gate_` 便于识别[^1] - 输入处理:所有输入端口连接 `1'b0`(逻辑接地) - 输出处理:输出端口悬空(不连接) --- #### 方法 2:使用 Innovus Tcl 命令预创建 在 Innovus 的 `init_design` 阶段后立即添加: ```tcl # 创建 50 个备用 NAND2 单元 create_inst -cell NAND2X1 -inst spr_gate_spare_nand_0 -physical_status fixed create_inst -cell NAND2X1 -inst spr_gate_spare_nand_1 -physical_status fixed ... create_inst -cell NAND2X1 -inst spr_gate_spare_nand_49 -physical_status fixed # 设置输入接地属性 set_pin_constant -pin spr_gate_spare_nand_*/A -value 0 set_pin_constant -pin spr_gate_spare_nand_*/B -value 0 # 防止被优化 set_dont_touch [get_cells spr_gate_spare_*] true ``` --- ### 连接方式的最佳实践 为后续 FIB 修改做准备: 1. **电源连接**:自动连接 VDD/VSS 2. **信号线处理**: - 输入端口:通过 Metal1 连接到最近的电源轨 (VSS)[^2] - 输出端口:保留金属线连接到高层金属(如 Metal6+)便于 FIB 修改[^2] 3. **物理约束**: ```tcl set_db [get_cells spr_gate_*] .placeStatus FIXED ;# 防止移动 set_db [get_cells spr_gate_*] .isSpareCell true ;# 标记为 spare cell ``` --- ### 验证方法 Placement 后检查 spare cell: ```tcl # 检查 spare cell 是否保留 report_spare_cells # 使用 dbGet 查询(引用[3]) set spare_cells [dbGet [dbGet top.insts.cell.name *spare* -p].name] puts "Spare cells: [llength $spare_cells] instances" ``` --- ### 注意事项 1. **命名规范**:统一前缀(如 `spr_gate_`)便于 ECO 阶段识别[^1] 2. **单元选择**:优先选择常用门(INV, NAND, NOR, DFF) 3. **布局规划**: - 在 floorplan 阶段预留 spare cell 区域 - 均匀分布在芯片各区域 4. **数量计算**:通常占标准单元总数的 1-3% $$N_{spare} = k \times N_{std\_cells} \quad (k=0.01 \sim 0.03)$$ ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值