Q1. 为啥要手工布局?
A1. 首先人比机器更聪明,更了解自己设计的需求和结构。其次在关键路径上的手工布局能提高时序性能,使不满足要求变成满足要求。
Q2. 有没有可能整个设计都用手工布局?
A2. 从原理上来说是没有不可能的,但这是没有必要的。我们只要保证最关键的路径能满足时序要求即可。
Q3. 手工布局牵涉哪些技术?
A3. RPM - Rela TI vely Placed Macros (其实就是使用RLOC约束限制布局的相对关系)
DIRT - Directed Rou TI ng (不仅限制位置,还限制走线)
HardMacro - 硬核,记录所有信息
Q4. Hard Macro 和 RPM + DIRT 的功能有什么区别吗?
A4. RPM位置基于Slice,Slice-based RPM可以在Slice所有范围内任意布局,不以CLB的位置作为分界。Grid-based RPM只是加入了BRAM乘法器之类的支持,原则上也跟CLB边界无关。而Hard Macro只有在完全相同的结构内在可以移动,所以他的边界至少是CLB,某些时候还需要考虑BRAM和乘法器的位置。
Q5. 什么是Slice-based RPM 和 Grid-based RPM?
A5. Slice-based 方法为整个器件内的slice设定坐标。看上去两个相邻的坐标位置实际上可能中间隔着一个BRAM。Grid-based则将整个器件统一编址,坐标系统看上去可能在某些地方会有缺少,但是不会造成上面提到的那种现象。
Q6. 什么时候用Slice-based RPM,什么时候又用Grid-based RPM呢?
A6. 如果RPM中包含既有Slice又有乘法器、DSP48、BRAM等器件的时候,就用Grid。如果RPM中只含有Slice,那么两种都可以使用,但是用Slice-based更简单一点,因为他的X和Y坐标都是逐个增加的。
Q7. 有什么工具可以用来做RPM?
A7. FloorPlanner和PlanAhead都可以生成包含RPM的UCF。我们也可以自己将一些约束添加到VHDL/Verilog中去。RPM规模较小时,后者更方便。用FPGA Editor生成DIRT约束时,也会同时产生相关路径RPM的约束。
Q8. 通常RPM都是多大规模?
A8. 通常RPM只是规定关键路径的位置,因此不会很大。比如3-5个寄存器之间的位置关系、BRAM和输出数据的第一级寄存器的位置关系等等,这些都不涉及到很多的元件。当然FloorPlanner可以把整个已布局的设计都导出成RPM,但个人以为没多大用处。
Q9. 用FloorPlanner建RPM的流程是什么?
A9. 参见Xapp422
Q10. 用PlanAhead建RPM的流程是什么?
A10. 导出Pblock就行。详细文档可以查阅PlanAhead User Guide。
Q11. 手动写RPM的约束会很难吗?
A11. 其实更简单更方便。一个例子:
(* RLOC = "X1Y2" *)
reg e_reg;
另一个例子:
(* RLOC = "X0Y1" *)
FDCPE #(
.INIT(1'b0) // Ini TI al value of register (1'b0 or 1'b1)
) FDCPE_a (
.Q(a_reg), // Data output
.C(clk), // Clock input
.CE(1'b1), // Clock enable input
.CLR(reset), // Asynchronous clear input
.D(a), // Data input
.PRE(1'b0) // Asynchronous set input
);
Q12. RPM的语法是什么?
A12. 最基本的就是RLOC约束的用法。参考Constraint Guide.
Q13. RPM有没有什么辅助约束?
A13. RLOC_ORIGIN和RLOC_RANGE可以规定把某个RPM放在设计中的某个位置。 RPM可以建组(H_SET, U_SET, HU_SET)。几个寄存器放在一个Slice里的时候,可以用BEL规定某个寄存器的位置,甚至还可以用LOCK_PINS约束规定某个寄存器IO的位置。这些约束的定义都在Constraint Guide中。
Q14. 怎么做DIRT呢?
A14. 打开FPGA Editor,打开布局布线好的ncd文件,选择Tools --> Directed Rou TI ng Constraints..., 选中关心的网线,生成UCF或将约束显示在FPGA Editor Console中,然后复制到HDL代码或UCF中。更详细的流程参考Constraint Guide -->DIRT.
Q15. 怎么做Hard Macro呢?
A15. 还是用FPGA Editor。将NCD存成NMC, 删除不关心的逻辑,包括所有IO。与外部逻辑交互的端口通过Edit --> Add Hardmacro External Pin 添加Hard Macro Pin. 更详细的流程参考AR10901.
Q16. 怎么用Hard Macro呢?
A16. 在设计源代码中要使用Hard Macro的地方,就用一个Black Box就可以了。NMC文件放在工程目录下。