湘攸客

【无线】CycloneII之EDA及学术开发功能描述

0
阅读(3557)

1.概述

         同Stratix/Cyclone。

2.逻辑单元(Logic Cell)描述

在以前的架构中(比如Cyclone),单个LE包括一个组合逻辑和寄存器。对于Cyclone II来说,组合逻辑和寄存器被单独分开到两个部分,原语创建的时候也不象Cyclone和Stratix那样,而是通过lcell_comb(组合逻辑部分)和lcell_ff(flip-flop/register)分别创建。这和Stratix II的情形有点类似。注意这里的flip-flop和register的意思可以互换。

         可以在《Cyclone II架构中LE的详细描述》一文中查到lcell_comb和lcell_ff的完整功能框图,这里就不重复了。

3.坐标系统和位置约束

4628.jpg

图1:Cyclone II坐标系统

         图1大概显示了Cyclone II器件底层坐标系统,这个也许不是最终的底层坐标系统,但是大致差别不大。坐标标注和Stratix/Cyclone类似,这里不赘述。只是从Cyclone II开始,根据上述LE的结构分析,可以直接单独给lcell_comb或者lcell_ff约束位置了。这在FPGA TDC设计中延时链锁定有一定好处,同时增加了具体的工作量,因为你必须分别约束组合逻辑阵列和寄存器阵列。

4.布线延迟与布线距离以及布线规则的关系

         CycloneII内走线延迟策略和Stratix/Cyclone大致一样。所以布线延迟会随着“曼哈顿”距离而线性地增加,走线速度由快到慢的顺序排列如下:

l  走线起始和终点位于同一个LAB

n  走线连接位于同一LAB是最快的,那是因为i)lcell_comb和lcell_ff直接相连;ii)lcell_ff通过qfbk连接lcell_comb;iii)lcell_ff通过寄存器级联线连接lcell_ff或者iv)本地互连线连接。

l  走线终点位于起点紧挨的右侧或者左侧的LAB中。因为lcell_comb和lcll_ff可以直接驱动这些紧邻LAB中的一些LAB线。

l  延迟会随着曼哈顿(Manhattan)距离的增加而增加。对于曼哈顿距离一样的布线,布线的起点和终点位于同一行或者同一列那么会得到更小的布线延迟,因为这种走线没有从垂直到水平或相反的走线切换。

5.Netlist Recommendations

多数WYSIWYG原语的输入端口硬件上都有可编程取反(Programmable inversion)结构。(笔者注:此特性在笔者研究FPGA TDC设计时使用ECO修改设计中得到验证)。为了利用这种取反特性,如果电路设计需要可以直接在网表中将信号的补码链接到输入端口。例如,如果电路需要在下降沿触发寄存输入到一个lcell_ff,那么网表可以连接!clock到cycloneii_lcell原语的.clk端口。这种情况下,LE中的可编程取反硬件将会将时钟取反。如果不这么做,那么一个新的信号,nclock,将会产生,fitter会将这个新产生的时钟信号连接到LE的时钟端口.clk,来使用负沿触发寄存器。这种网表会导致额外lcell_comb被消耗,从而导致资源的大量浪费,并带来更差的时钟偏斜(Skew)。下面三个cycloneii_lcell_ff使用实例,从好到差进行展示。

cycloneii_lcell_ff good_cell {

.clk(!clock),  // good way to make an inverted clock

...

 

cycloneii_lcell_comb unneeded_inverter {

.dataa(clock),

.combout(nclock)  // half of bad way to make an inverted clock

}

 

cycloneii_lcell_ff bad_cell {

.clk(nclock),  // bad way to make an inverted clock

...

         当然也有一些WYSISYG原语输入端口没有可编程取反硬件(可参考Cyclone II LE所见即所得描述文档中的详细列表),所以这些端口无法直接使用输入信号补码连接到端口,所以必须额外使用一个lcell_comb来产生信号的取反逻辑。

         大部分WYSISYG原语输入端口可以直接接GND或VCC。对于这样的端口,这样是最好的接法,而不是另外创建一个LE,使其输出为0或者1后再接到这些端口。当然有些端口不能直接接VCC和/或者GND,所以必须为这些端口额外创建一个LE来产生逻辑0或1输出到这些端口。

cycloneii_lcell_ff aload_using_preset {

 .sload(sloadsig),

.sdata(VCC), // OK, but can’t connect to GND directly

表1:

 

4628.jpg

 

*The LUT mask will be modified to account for constant signal inputs.

笔者注:这里的qfbk是什么意思?

6.综合概览和优化

6.1 LE和LAB的相关描述

         第二节描述了Cyclone II器件使用的基本逻辑单元,Quartus II开发软件将这些逻辑单元打包进两种结构,即LE和LAB。这两种结构除了单独逻辑单元自己的限制外还有一些额外的限制。后面我们将讨论这些限制规则。

         一个LE(Logic Element)包括最多一个lcell_comb模块和一个lcell_ff模块,如图2所示。Note that not all positions in a LE need necessarily be populated with a logic cell for the LE to be valid.

4628.jpg

图2:一个LE中的逻辑单元(Logic Cell)

         Cyclone II的一个LAB中有16个LE,所以一个LAB中有32个逻辑单元(Logic cell)(16个lcell_comb和16个lcell_ff)。如图3所示,32个单元组成了一个LAB,灰色的为lcell_comb,白色的为lcell_ff,每个虚线框表示一个LE,如前所述位置信息显示是LE的可能位置信息,用户逻辑电路并不一定在fit后会使用到。

         注意图3中灰色所示的所有lcell_comb位置标号都是偶数,而白色所示的lcell_ff位置标号都是奇数,这些信息用户在ChipPlanner或者资源属性编辑器中看得到。如果我们要约束lcell_comb和lcell_ff位置,那么如图1所示找到这些逻辑单元所在的LAB坐标,然后确定该逻辑单元的位置,比如将一个lcell_comb进行位置约束如lcell_comb_X4_Y6_N0,就是将其约束位于图3所示LE#1中,将一个lcell_ff进行位置约束如lcell_ff_X4_Y6_N7,就是将其约束位于图3所示的LE#4中的寄存器。

4628.jpg

图3:Cyclone II器件中的LAB

6.2 测量综合面积质量

         因为逻辑单元可以以不同的方式组合起来,形成LE,所以测量综合面积不是单单象统计创建的逻辑单元那样简单。从面积角度来看,当fitter争取最大密度努力时,综合将创建最少的LE和LAB。

         在Altera提供的quartus.ini文件中,包含这样的信息“fit_pack_for_density=on”和“fit_report_lab_usage _stats=on”,这些都将允许精确的面积估算。当这些变量使用的时候,Quartus II软件将试图通过Packing逻辑单元(Logic Cell)进LE和LAB来达到最小化面积,特别是同时Fmax只是很小降低。Quartus II软件同时会给用户打印以下信息:

Info: Number of LABs at the end of packing: 100

Info: Number of LEs at the end of packing: 1600

来说明当它fit电路的时候,最小的LE和LAB使用量。当然当综合算法中的最大电路速度被执行,那么Quratus II软件运行的时候不带上述变量。

         最好的办法是在工程的qsf文件中添加以下的编译设置:

set_global_assignment –name INI_VARS "fit_pack_for_density=on;fit_report_lab_usage_ stats=on”

注意上述约束行中的引号中不能包含任何空格。

6.3获得好的Fitting结果建议

  1. 使用lcell_ff的.sclr应当慎重,Cyclone II架构中一个LAB最多只有一个.sclr 。不恰当地使用这个端口,会大幅降低逻辑资源利用率、fitting可能性以及电路速度。举个例子,过去常常在一个逻辑单元里使用.sclr 端口来产生一个5输入函数,如此在实现这个电路的时候可以减少逻辑单元的数量,因此从一个综合角度来看这也许是一个好主意。但是,一旦这个lcell_ff使用了.sclr,那么这个lcell_ff所在的LAB一般无法将其它寄存器逻辑单元打包(Pack)进来,除非这些寄存器逻辑单元都使用同样的.sclr值或者它们的synch_mode=off。这可能在最坏情况下导致逻辑密度大量减少,因为只有一个lcell_ff可以被放置在一个LAB中,而不是16个。所以无原则地使用.sclr会导致非常坏的fitter结果和电路速度,因为fitter在这种情况将lcell_ff组合进LAB的灵活性非常小。
  2. 应该只有在用户电路中实现同步清零的时候才被使用,因为在这种情况下同步清零信号一般产生非常大的扇出。因此,fitter一般不会过分约束同步清零信号。.sclr端口也可以审慎地用于实现其他中等扇出信号,用来减少逻辑单元的使用量。
  3. 上述原则同样适用于.sload 端口。同步加载应当会产生高扇出。
  4. 时钟使能(.ena)使用起来相对有点宽松,因为每个LAB允许有两个不同的.ena值,这比只有.ena值大大提高了fitter应对多.ena值情况的能力。不过,过多的时钟使能(.ena)使得逻辑利用率超过90%非常困难。我们发现电路如果使用成千上万的时钟使能,通常往往逻辑利用率只能达到90%。更谨慎地使用时钟使能,常常能达到99%的逻辑利用率。因此,注意限制不同.ena信号的数量(尤其是低扇出信号)还是值得的。
  5. 到LAB的总的布线信号是38个(不包括cin和LAB内逻辑单元生成的信号),所以为了更好的布通性,最好使用不超过36不同的信号布线到一个LAB(不包括clk和aclr,它们可以使用全局资源)。
  6. Fitter将会在需要的时候将lcell_comb单元和lcell_ff单元“打包”一起放入一个LE中。如此,综合阶段没有必要将二者放在一起。然而,需要注意的是单元创建的时候不要对fitter打包lcell_comb和lcell_ff进同一个LE产生不利影响。

 

7.逻辑单元(Logic Cell)规则

7.1 对单个寄存器逻辑单元(lcell_ff)进行约束

  1. 如果clk端口连接,那么regout端口必须连接
  2. 如果clk端口连接,那么sclr端口必须连接
  3. 如果clk端口连接,那么sload端口必须连接
  4. 如果sload端口连接,那么sdata端口必须连接
  5. 如果ena端口连接,那么clk端口必须连接

7.2 对单个组合逻辑单元(lcell_comb)进行约束

  1. Cin端口不连接,要连接必须或者连接到另一个lcell_comb的cout端口。如果一个lcell_comb的cin连接到另一个lcell_comb的cout端口,那么该lcell_comb必须使用参数“sum_lutc_input=cin”。
  2. Cout端口必须根据上一条连接,或者保持不连接
  3. 如果cout/cin连接,那么只有dataa,datab,datac(如果cin没有用到),输入端口可以使用。
  4. 在一个lcell_comb中,如果一个输入连接有信号,但是该信号依据LUT掩码没有影响至少一个输出,那么这是违法的,作为规则,Quartus II软件将Disconnect这个输入。
  5. LUT掩码依赖一个没有任何信号连接的输入端口也是不合法的。

8.LELAB规则

         本节讨论一下综合器应当遵守的规则,依据这些规则产生的逻辑单元才具有电气特性,逻辑单元组合进LE和LAB的时候才能形成合法的LAB可布通性。

8.1约束LABs的进位链

         进位链概念省略。如图3所示的连续相连的灰色(偶数)lcell_comb可以组成进位链。长进位链跨多个LAB的时候必须从上一个LAB直接跨入紧邻的下一个LAB,只能从上到下连接。

8.2约束LAB-wide信号

         好多连接到逻辑单元的信号叫做“LAB-wide”信号,这些信号单独为LAB产生并可以由LAB内的逻辑共享。因此,在一个LAB布置的逻辑单元如果需要过多的LAB-wide信号将是非法的。

         上一节讨论的进位链,虽然进位自己不会有错,当进位链中每个逻辑单元要驱动寄存器单元的时候,这些进位链结构常常会导致比较差的fit结果。我们最好来看这样一个例子,假如一个长度为6的进位链,进位链每个逻辑单元驱动一个寄存器,同时每个寄存器的使用不一样的时钟信号,那么进位链所在的这个LAB最多只能放入这些寄存器中的两个,因为每个LAB最多只支持两个不同的时钟信号。因此,这只会带来比较次优的布局结构,如图4所示。

         在Cyclone II器件中,连接到lcell_ff的clk,ena,aclr,sclr和sload端口的信号都属于LAB-wide信号。一个lcell_ff端口连接到一个正常信号都消耗一个LAB-wide信号,同一个信号被取反后在LAB中使用也额外消耗一个LAB-wide信号。所以如果LAB中的一个lcell_ff使用clock,而!clock被另一个lcell_ff使用,那么将消耗两个LAB-wide信号。逻辑单元上连接到VCC和GND的端口也需要LAB-wide线。还有一种情况是逻辑单元某些端口处于悬空状态,这种unconnect情况可能需要LAB-wide线,也可能不需要,这取决于端口以及LE的配置。表2显示了lecll_ff中悬空端口的处理情况。

 

4628.jpg

图4:过多LAB-wide被使用的时候地布局影响

表2:端口未连接时是否被认为“used”

 

4628.jpg

 

下列都是表2定义的重要的规则,用于统计被认为“used”但是却未连接信号的寄存器端口。

  1. 所有lecll_ff上的.clk和.ena信号都成对地组成LE时钟,如图5所示。在任何LAB中,可以有不超过2个不同的时钟对。

l  同一个.clk信号和2个不同的.ena信号可认为是两个不同的寄存器时钟对

l  同一个.ena信号和2个不同的.clk信号可认为是两个不同的寄存器时钟对

4628.jpg

图5:形成lcell_ff时钟的时钟和时钟使能组合

  1. 最多只有两个不同的时钟信号可以连接到clk端口

表3显示了一个时钟加时钟使能如何创建时钟对的例子。该例显示了两个的寄存器使用的两组时钟和两组时钟使能,clk(#1)和ena(#1)属于register Cell(#1),clk(#2)和ena(#2)属于register Cell(#2)。没有连接的.ena端口被配置为VCC,如表2指定那样。A,B,C和D对应信号网络。

表3:时钟和时钟使能如何组成lcell_ff时钟的例子(.regout未连接)

 

4628.jpg

 

  1. 最多连个不同的信号可能被连接到.aclr端口。(从表2,未连接的.aclr将会认为是连接到GND)
  2. 最多只有一个不同信号能被连接到.sload端口,最多只有一个不同信号能被连接到.sclr端口

l  一个lcell_ff使用sload和(或)sclr只能被放置在一个使用相同sload和(或)sclr或者不使用sload和(或)sclr的LAB中。

表4显示了sload和sclr组合是否被认为“used”的情况,表5则显示了sload和sclr组合被合法布局到一个LAB的例子。两个表中的A和B都是指非GND和非VCC的信号网络。

表4:当sload和sclr被认为“used”的例子

 

4628.jpg

 

表5:lcell_ff使用sload和sclr的合法和非法组合

 

4628.jpg

 

8.3LAB控制信号可布通性约束

这里有一些规则可以确保LAB内所有必需的控制信号能被布局进这个LAB。任何连接到逻辑单元端口的信号网络(非VCC和非GND),如果其未使用全局布线资源,那么它布进LAB,需要占用LAB-wide输入端口。一个信号如果在LAB内正和负都被用到,那么该信号必须被布线两次。如果一个逻辑单元的一个端口连接(或者说可以如表2那样认为连接)到VCC或者GND信号,那么它可能需要也可能不需要占用LAB-wide输入端口,这取决于这个端口是否存在LAB-wide tie-off。表6显示了哪些lcell_ff的端口连接到一个信号或者连接(或者说可以如表2那样认为连接)到VCC或者GND时需要LAB-wide输入端口的情况。

表6:VCC/GND需要布线进LAB的情况

 

4628.jpg

 

         以下是一些重要规则,依据表6定义VCC/GND需要布线资源。

  1. 下面这些不同信号最大只能4个

l  Clk(非全局)

l  Ena

l  Sload

l  Aclr(非全局)

l  Sclr

由于一个寄存器可能包含上述五个信号中全部,这样的寄存器将无法fit进一个空的LAB,试图这样做,只能带来一个fit错误。综合器应该避免产生带有上述全部五个信号的寄存器,且clk和aclr已知为非全局信号。Quaruts II软件将会为clk和aclr信号自动分配全局网络,直到所有全局网络被耗光(Cyclone II共有16个全局网络)。最好的做法是综合器假设clk和aclr中至少有一个使用了全局布线资源,这样一个寄存器使用全部5个控制信号是合法的。

  1. 下列信号最多只能有2个不同:This is due to the fact that sload steals a non-global clk line.

l  Clk(非全局)

l  Sload

  1. 下列信号不同组合最多不超过3,这是因为非时钟和非aclr全局信号必须通过普通LAB线布进LAB,同时连接全局走线和LAB线是有限制的。

l  Ena(global)

l  aload(global)

l  sload(global)

l  sclr(global)