1.原则:
a.对每个同步设计的子模块的输出使用寄存器(registering)。也即用寄存器分割同步时序模块的原则。) @( F3 f+ D" j
使用寄存器的好处有:综合工具在编译综合时会将所分割的子模块中的组合电路和同步时序电路整体考虑。而且这种模块结构符合时序约束的习惯,便于使用时序约束熟悉进行约束。) q9 t/ |# a \7 p0 C
b.将相关的逻辑或者可以复用的逻辑划分在同一模块内。
这样做的好处有,一方面将相关的逻辑和可以复用的逻辑划分在同一模块,可以最大程度的复用资源,减少设计消耗的面积。同时也更利于综合工具优化一个具体功能(操作)在时序上的关键路径。其原因是,综合工具只能同时考虑一部分逻辑,而所同时优化的逻辑单元就是模块,所以将相关功能划分在同一模块更有利于综合器的优化。; l/ w" k5 r9 G4 X4 x
c.将不同优化目标的逻辑分开。
好的设计,在规划阶段,设计者就已经思考了设计的大概规模和关键路径,并对设计的优化目标有一个整体上的把握。对于时序紧张的部分,应该独立划分为一个模块,其优化目标为“speed”,这种划分方法便于设计者进行时序约束,也便于综合和实现工具进行优化。比如时序优化的利器Amplify,使用模块进行区域优化更方便一些。另一类矛盾集中在面积的设计,也应该划分成独立的模块,这类模块的优化目标是“Area”,同样将他们规划到一起,更有利于区域布局与约束。这种根据优化目标进行优化的方法的最大好处是,对于某个模块综合器仅仅需要考虑一种优化目标和策略,从而比较容易达到较好的优化效果。相反的如果同时考虑两种优化目标,会使综合器陷入互相制约的困境。
d.将松约束的逻辑归到同一模块。
有些逻辑的时序非常宽松,不需要较高的时序约束,可以将这类逻辑归入同一模块,如多周期路径“multi-cycle”等。将这些模块归类,并指定松约束,则可以让综合器尽量的节省面积资源。
e.将RAM/ROM/FIFO等逻辑独立划分成模块。
这样做的好处是便于综合器将这类资源类推为器件的硬件原语,同时仿真时消耗的内存也会少些,便于提高仿真速度。(大多数仿真器对大面积的RAM都有独特的内存管理方式)0 o4 B! p5 Q- D) O) Y7 M/ ]
f.合适的模块规模。
规模大,利于“Resource Sharing”。但是对综合器同时处理的逻辑量太大,不利于多模块和增量编译模式。
2.具体实现:
参照jason0214.lofter.com/post/30cbe4_12a8f72/
3.初始化
一般是用在程序模块最开始初始化数据用,对寄存器、输出等变量进行清零等工作。特别是在testbench中应用非常普遍,也是做初始化用的。
感谢男盆友的demo做参考,感恩。
网友评论