完成本模块后,您应该能够控制在compile_fusion期间设计的几个方面:
• 端口打孔、连接单元、备用单元
• 数据路径架构选择
• 自动解组与边界优化
• 以拥塞为中心的技术
• 以时序为中心的技术
• 层感知优化/RDE(Resistance-Distance Estimator,电阻-距离估计算法)
高扇出综合端口打孔
• 高扇出综合/缓冲发生在initial_drc阶段。
• 默认情况下,为了进行高扇出(HF)综合,端口打孔可能会在层次边界上添加或移除端口。
• 要禁止在指定单元上进行端口打孔,可以使用以下命令:set_freeze_ports -data|-clock|-all [get_cells cellA]
其中,-data
指定数据端口,-clock
指定时钟端口,-all
指定同时作用于数据和时钟端口,cellA
是您想要冻结端口的单元实例名称。
要解除端口的冻结状态,可以使用:
set_freeze_ports -data|-clock|-all [get_cells cellA] false
要查询当前状态,可以使用:
1get_attribute [get_cells I_SDRAM_TOP] freeze_data_ports
2get_attribute [get_cells I_SDRAM_TOP] freeze_clock_ports
对分层单元施加dont_touch
约束会保留沿块边界处的引脚,但也会阻止优化修改内部块逻辑。
启用绑定高/低(tie high/low)电平单元的使用
• 如需将绑高(tie high)/绑低(tie low)输入连接到绑高/绑低单元,应如这里所示启用该功能。
• 绑高/绑低单元将在编译过程中(initial_opto阶段)被插入。
1set_dont_touch [get_libcells */TIE ] false
2set_lib_cell_purpose -include optimization [get_libcells */TIE*]
上述命令首先解除对所有库中名为"TIE"的tie单元的dont_touch约束,然后指定这些单元可用于优化目的。这样,工具在综合过程中就可以插入这些绑高或绑低单元了。
参考库的名称由去掉.ndm
后缀的库文件名确定。
例如:std_cell.ndm
被命名为 std_cell
:get_lib_cells std_cell/AND3*
如果库文件从例如 Hstd_cell.ndm
重命名为 std_cell_two.ndm
,Fusion Compiler 内部的库名称也会相应地变为 std_cell_two
。
此规则仅适用于特定扩展名 .ndm
、.nlib
和 .ndb
的库。
对于具有其他扩展名的clib,其库名称将与其文件名相同,例如:文件名为 hello.mylib
的clib,其库名称也将是 "hello.mylib"
!
您也可以使用db库名称:get_lib_cells std_cell_pi_v0p8/AND3*
这里使用的是db库名称(非文件名!)来在CLIB中查找单元。
示例:
1fc_shell> get_lib_cells saed32rvt_pg_ff0p95vl25c/*
2(saed32_rvt|saed32_rvt_pg/FOOT2X16_RVT saed32_rvt|saed32_rvt_pg/FOOT2X2_RVT
3saed32_rvt | saed32_rvt_pg/FOOT2X32_RVT ...)
4
此命令展示了如何使用db库名称获取特定clib中所有单元的列表。
备用单元(Spare Cells)
备用单元可以在RTL代码中被包含:
既可以在顶层模块中包含,也可以在子设计模块中。
Fusion Compiler能够自动识别这些备用单元。
备用单元将与常规标准单元一起放置,并且会自动均匀分布。
此功能受place.coarse.enable_spare_cell_placement控制,默认值为true。
当设置为false时,备用单元仍会被放置,但不会均匀分布。
放置过程是考虑层次结构的,因此备用单元会与其所属的层次结构一起被放置。
备用单元是指包含在网络表中但在初始设计阶段未功能连接和使用的额外门电路(如与门、或非门、异或门、反相器等)。如果在设计周期后期需要进行小的功能更改,称为“功能ECO”(Engineering Change Order,工程变更订单),则可以通过增量修改布局(仅路由或金属掩模更改)来利用这些备用单元。
默认情况下,网络表中的所有单元都有属性
sparce_cell_mode
设置为auto
-> 自动识别为备用单元的单元将把is_spare_cell
设置为true
。spare_cell_mode
是唯一应由用户操作的属性 – 请勿直接/手动修改is_spare_cell
属性。is_spare_cell
属性会根据spare_cell_mode
的设置自动调整。单元被识别为备用单元需满足以下条件:
所有输入浮空或接高/低电平
寄存器的时钟、置位/复位和扫描引脚可以连接
所有输出浮空
单元不是仅物理单元(Physical-only)
如果单元未被识别为备用单元,可为此单元设置属性
sparce_cell_mode
为true
:set_attribute [get_flat_cells *SPARE_REG] spare_cell_mode true
如果不希望某个单元作为备用单元,可为此单元设置属性
sparce_cell_mode
为false
。要查询设计中的所有备用单元,可以使用:
get_cells -hier -filter is_spare_cell
。仅含PG引脚或无引脚,例如:tap、end-cap、filler单元
在标准单元布局期间,所有属性is_spare_cell = true
的单元将自动与标准单元一起放置。布局是考虑层次结构的,这意味着:位于设计网络表顶层(顶层模块)的备用单元将在整个设计中物理放置;例如,子模块A中的备用单元将受限于由模块A中标准单元布局定义的矩形区域内。
添加网络表中尚不存在的备用单元
• 如果您的设计中尚未包含备用单元,或者需要添加更多备用单元,您可以在运行compile_fusion之前或之后添加备用单元。
使用add_spare_cells添加的备用单元需要设置set_dont_touch,否则优化过程会将其移除。在compile_fusion之后通过add_spare_cells添加的单元会进行粗略布局,因此之后需要对单元布局进行合法化处理。
默认情况下,备用单元的位置不是固定的——CTS(时钟树合成)和布线优化可以移动它们。如果固定单元数量很多,将单元设置为“固定”可能会阻碍上述优化。
作为替代,在备用单元分布完成后,可以将单元的布局状态设置为"legalize_only":
防止布局和优化移动备用单元;
如果需要,单元只能在CTS和布线优化后由legalizer移动。
set_placement_status legalize_only [get_flat_cells -filter is_spare_cell]
在任何时候,您也可以使用以下命令来分散备用单元:
spread_spare_cells -cells [get_cells -hierarchical -filter is_spare_cell] -boundary {{10 10} {490 490}}
此外,您还可以使用add_spare_cells添加备用电源管理单元,如隔离单元和电平转换器。通常,使用可编程备用单元(PSC)创建这些单元是不可能的或非常困难的。
单例(Singleton)算术优化
• DesignWare库支持使用数据通路生成器来构建多种不同的算术运算符实现。
■ + , -, * , < , > , <=, >=
■ DesignWare库会自动链接。
多种实现方式使得compile_fusion(-to initial_opto阶段)能够为每个单例运算符选择最佳实现。
一旦选定,每个实现都会针对目标工艺库进行优化。
DesignWare库是Fusion Compiler基础上的一个授权选项。
minPower组件是DesignWare库的一部分。请注意,只有在场景中开启动态功耗并且启用了全功耗优化时,才会使用minPower组件。
报告数据通路优化情况
• 要在编译前分析数据通路提取情况:
analyze_datapath_extraction
■ 参见注释中的示例
• 要在编译后生成数据通路报告:
report_resources -summary
当一个DesignWare操作符未被提取时,analyze_datapath_extraction会分析其未被提取的原因。如果原因是RTL编码问题,该工具将发出有关干扰数据通路提取的RTL编码风格的消息。分析之后,会生成一份报告展示设计中包含的资源情况。