fpga手工布局的原因、方法、工具和差异-九游会j9

fpga/dsp > 可编程逻辑 > 详情

fpga手工布局的原因、方法、工具和差异

发布时间:2025-02-08 发布时间:
|

q1. 为啥要手工布局?
a1. 首先人比机器更聪明,更了解自己设计的需求和结构。其次在关键路径上的手工布局能提高时序性能,使不满足要求变成满足要求。

q2. 有没有可能整个设计都用手工布局?
a2. 从原理上来说是没有不可能的,但这是没有必要的。我们只要保证最关键的路径能满足时序要求即可。

q3. 手工布局牵涉哪些技术?
a3. rpm - relatively placed macros (其实就是使用rloc约束限制布局的相对关系)
dirt - directed routing (不仅限制位置,还限制走线)
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) // initial 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 routing 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文件放在工程目录下。


『本文转载自网络,九游会j9的版权归原作者所有,如有侵权请联系删除』

热门文章 更多
学好fpga应该要具备的知识
网站地图