设计(也就是设计描述)存放在设计文件中。所有的设计文件名字不能重复,如果设计是层次化的,也就是每一个子设计都会引用个设计文件,那么这个设计文件的名字也必须是唯一的。注意,不同的设计文件可以包含相同名字的子设计。
本章包含以下部分:
管理设计数据
为综合建立分区
适合综合的HDL代码编写
管理设计数据
使用系统的组织方法来管理设计数据。设计数据控制和数据组织是管理设计数据的两条个基本组成部分。
控制设计数据
当你的设计版本更新时,你必须维护一些存档和存续的记录方法,这种记录方法提供了设计更新的历史记录并且可在数据丢失的时候可以让你重启设计过程。建立数据的创建,维护,重写和删除的控制是设计管理的基本问题。建立文件名的约定是数据创建的最重要规则之一。表3-1列出了建议每种设计数据的文件拓展名。
表3-1 文件拓展名
管理设计数据
建立和坚持一种组织数据的方法比你对方法的选择更重要。在你将必要的设计数据按照一致的控制规则存放后,你就可以制定一套有意义的数据管理方式。为了简化数据交换和数据搜索,设计者应该坚持一种数据组织的方法。
你可以用一套层次化的目录结构来解决数据组织问题。你的编译策略会影响你的目录结构。图3-1展示了基于自顶向下的编译策略的目录结构,图3-2展示了由下而上的编译策略的目录结构。更多关于编译策略的细节,请参考“选择和使用编译策略”一节的内容。
图3-1 自顶向下的编译策略目录结构
图3-1 由下而上的编译策略目录结构
分块综合
对设计进行有效的分块可以增强综合结果,减少编译时间,并且可以简化约束和脚本文件。
分块会影响块尺寸,虽然Design Compiler没有固定的块尺寸但是你应该小心控制块的尺寸。如果你的块太小,可能会阻碍对边界的优化。如果你的块尺寸太大,那么编译时间可能会增加。
使用以下的的策略来对你的设计进行分块并且改善优化结果和运行时间:
以设计复用为目标的分块
将相关的组合逻辑放在一个块中
寄存块的输出
按照设计目标分块
按照编译技巧分块
将共享资源放置在一起
保持用户自定义的资源和它们所驱动的逻辑不变
将特殊功能隔离,譬如pad,时钟,边界扫描和异步逻辑
下面的章节描述了上面的每种策略
以设计复用为目标的分块
设计复用通过减少设计,集成和测试工作来缩短芯片的上市时间。
当设计中有复用时。对设计进行分块这样可以通过例化设计来实现复用。
为了使设计能够最大程度复用,请遵守以下的分块和块设计准则:
仔细定义并记录设计接口
尽可能对接口标准化
HDL代码参数化
将相关组合逻辑放置在一起
在默认情况下,Design Compiler无法跨越层次边界移动逻辑。将相关的组合逻辑划分到不同的块中会引入人为的障碍从而阻碍逻辑的优化。
为了获得最好的结果,请采用以下策略:
将相关的组合逻辑和其目标寄存器放置在一起
当处理完整的组合逻辑时,Design Compiler可以合并逻辑,这样可以获得更小,更快的设计。将组合逻辑和其目标寄存器放在一起也可以简化时序约束也可以启用时序逻辑优化。
消除胶合逻辑
胶合逻辑是连接块之间的组合逻辑。将这些逻辑移动到一个块中会优化综合结果,因为这样会为Design Compiler提供更多的灵活性。消除胶合逻辑也会减少编译时间,因为Design需要优化的逻辑层数会减少。
举个例子,假设你的设计包含了在关键路径上或者很靠近关键路径的三个组合逻辑云。图3-3显示了较差的设计分块。每一朵组合逻辑云都在不同的块中,所以Design Compiler无法尽全力的使用它的组合逻辑优化技巧。
图3-3 较差的相关逻辑分区
图3-4 显示了同样的设计,但是没有了人为的边界。在这个设计中,Design Compiler有很大的灵活性来将组合逻辑云中相关的功能合在一起。
图3-4 相关逻辑在一个块中
块输出寄存
确保寄存器驱动块输出(如3-5所示),可以简化约束。
图3-5 寄存所有输出
这种方法可以让你对每个块的约束更加容易,因为
一个块输入端口的驱动强度一般等于平均输入的驱动强度
来自上一个模块的input delay一般等于通过寄存器的路径延时
因为所有输出都寄存时,是没有纯组合路径的,所以时序预算和使用set_output_delay命令会更容易。假设每个模块的时钟相同,这种约束就比较简单而且每个模块的约束都是一样的。这种分块