FPGA设计的用户约束
文章目录
FPGA设计的用户约束
至此,HDL到门级网表的转化已经完成,对于编译器来说,下一步的任务就是要将门级网表转换并映射到具体的FPGA硬件资源中去。不过在编译器开始这一项任务之前,我们必须得提出一些我们对FPGA设计的要求,因为毕竟编译器跟我们是没有什么心灵感应的,所以有些事你不说编译器怎么知道呢?
简单地说,我们将我们的想法写入到一个文件当中,然后把这个文件交给编译器,这样编译器就可以参考我们的需求来实现最终的FPGA设计了,而这个文件就叫用户约束文件。注意,编译器仅仅是参考我们的需求,并不会保证最终的结果一定达到我们的预期,这主要有两方面原因:
- 编译器向来是量力而行的;
- 我们的需求有些时候可能不太现实。
因此,如果最终的结果并不能让人满意,通常的做法是返回到FPGA设计方案的制定或FPGA功能代码的编写环节进行修改,而不是去加大编译器在布局布线时的努力程度。
综合约束
其实这一工作应该是在FPGA功能代码编写与FPGA顶层模块的门级仿真环节之间完成的,放在这里讲是为了避免章节过于分散。综合约束的作用顾名思义是用来指导编译器如何将HDL代码转换为门级网表的,它有三种主要表现形式:
- 编译器的综合工具配置选项;
- 嵌入代码中的约束语句;
- 专门的综合约束文件。
通常来说,编译器已经预先设置好了一套默认的综合工具配置选项,几乎能够应对绝大多数综合任务。当然了,如果有特殊需要,可以进行一些调整。而嵌入代码中的约束语句使用起来更加灵活、方便,对于综合的约束性更加得细节和具体,例如可以针对代码中某一个变量进行约束,不像综合选项的作用域是整个FPGA设计。如果觉得嵌入代码中的约束语句过于凌乱,不好管理和维护,那么也可以将这些语句集中写在一个约束文件中,只不过此时需要指明被约束对象的层次化绝对路径。
管脚约束
不和外界交互的FPGA设计是没有任何存在意义的,因此,我们必须要为FPGA设计指定好具体的管脚约束信息。管脚约束主要完成两件事情:
- 将FPGA设计中的输入、输出以及双向端口和FPGA芯片的物理I/O管脚之间建立好一一对应的连接关系。通常情况下,FPGA设计中的端口数不能大于FPGA芯片所提供的物理I/O管脚数,否则无法分配成功。
- 为每一个已分配的物理I/O管脚指定特定的接口电平,从而使得设计能够正确地跟外围电路进行电信号交互通信,例如LVTTL、LVCMOS、LVDS等接口电平形式。
位置约束
位置约束主要影响的是编译器如何将转换后的资源网表布局到实际的FPGA芯片中。由于FPGA中有非常多的逻辑资源块、BLOCK RAM、DSP核等等,并且这些资源是均匀分布在整个FPGA芯片当中的,如果我们对这些资源的使用有特殊的要求,例如某个逻辑必须使用FPGA芯片中最左上角的逻辑资源块来实现,那么就需要编写相应的位置约束。当然,位置约束的功能并不仅限于此。
时序约束
时序约束是我们对FPGA设计在时间性能指标上的期望,例如时钟频率要求、时间差要求以及各类时间参数指标要求等。当编译器将资源网表布局到FPGA芯片当中并完成连线操作的时候,如果我们为其制定了时序约束,那么编译器就会考虑到我们的需求来进行布局布线,这是因为布局布线会影响到线延迟的时间参数。因此,时序约束虽然不直接指明对布局布线的要求,但是它却间接地对布局布线产生重大的影响。
以上四类约束中,除了综合约束外,其余三个统称为布局布线约束,因为它们都直接或间接地影响到同一个FPGA设计在FPGA芯片中的布局布线形式。也正是因为如此,布局布线约束方面的工作都是在门级网表生成后且后续转换尚未开始前完成的。
小总结
- 用户约束文件是将设计要求传达给编译器的重要工具,但编译器仅会参考这些要求,最终结果可能因编译器能力和需求合理性而有所不同。
- 综合约束、管脚约束、位置约束和时序约束是FPGA设计中常见的约束类型,其中综合约束主要影响HDL代码到门级网表的转换,而其他三种约束则属于布局布线约束,直接影响FPGA芯片的布局布线。
- 布局布线约束的工作通常在门级网表生成后进行,以确保设计能够在FPGA硬件上正确实现。