特权和你一起学NIOS2 第五章 实战演练之时序收敛 part4
0赞IO接口约束之virtual clock生成与约束
我们先要区分一下IO接口的约束类型。如果从信号传输方向来看,IO接口无非有三种,即所谓的input/output/inout三种。在可以明确定义 virtual clock(虚拟时钟)的情况下,约束这三类端口只有两种方式,即set_input_delay/set_output_delay,当然每种约束最好 能够分别指定max_delay值和min_delay值。这里所说的virtual clock,是有别于FPGA内部钟控寄存器所使用到的时钟,它是FPGA外部接口芯片的时钟。就拿FPGA的input port来说,源寄存器在外部芯片中,目的寄存器在FPGA内部,而源寄存器和目的寄存器时钟往往不一致。因为对于时序分析工具TimeQuest而言, 我们已经对FPGA内部所有的系统时钟进行了约束,因此它可以确定的时钟是目的寄存器上的(即FPGA内部的),源寄存器上的(芯片内部的)时钟既然不是 FPGA内部的,那么TimeQuest也就不知道它到底“长什么样”了。所以,作为设计者,我们就有义务让TimeQuest知道,我们所做的就是建模 来定义一个virtual clock,它的特性就是尽可能的和源寄存器的时钟属性一致(也许不能够完全一致)。做完这一步,其实还不够,虽然有源寄存器时钟和目的寄存器时钟了,但 是我们必须清醒的意识到TimeQuest只是Altera的工具而已,它熟悉的只是Altera自己的FPGA器件而已,若要让它清楚市面上千百万种芯 片的内部时序关系和参数,那基本上很难,或者说这是一个非常有创意的想法,目前确实没有哪家厂商可以做到这一步。因此,这一步通常需要我们手动完成,而如 果我们只是定义了系统内部时钟和virtual clock,“傻瓜”工具TimeQuest还是不知道到底我们定义的这个virtual clock是要和哪些IO脚相关。所以,我们还需要把IO脚和virtual clock关联上,并且指定这些IO脚从进入FPGA器件内部的那一刻开始直到传输到目的寄存器的输入端为止,这个路径的传输延时不可以太大也不可以太 小,它需要有一个范围界定,因此时序分析的过程要充分考虑好这个范围大小。在时序约束中就可以把这个范围告诉TimeQuest。
其实TimeQuest支持两种约束IO端口的方法,其一就是前面刚提到的和virtual clock相关的约束方法。另一种方法来得更直接,即使用set_min_delay/set_max_delay约束IO脚从进入FPGA器件内部的那 一刻开始直到传输到目的寄存器的输入端为止的时间范围,它和前一种方式的不同在于它的路径分析中不包含目的寄存器的相关参数,并且这种方式更适合于异步路 径的约束,它可以对任意两个端点到端点间的路径进行约束。
但无论是哪一种约束方式,只要我们把基本原理弄明白了就OK。下面我们就第一种更适合源同步接口约束的方式来学习,当然其中也用到了后一种方式来约束FPGA产生的输出时钟。
先定义前面提到的virtual clock,这个virtual clock是FPGA内部PLL模块的c2产生并提供给SDRAM的。如图5.17所示,用ConstrainàCreate Generated Clock…定义virtual clock。Clock name可以任意取名,Source为PLL输出的时钟c2,Targets为FPGA连接SDRAM的管脚sdram_clk。其他选项不用填。最后点 击“Run”完成定义。
图5.17
约束前一步中定义的Source时钟到Targets时钟的路径。因为前面的Targets时钟即sdram_clk也是FPGA的输出管脚,它的约束没 有virtual clock可用,单独来说(虽然它本身就是一个时钟信号)应该算是一个异步信号。所以我们对它的约束就用set_max_delay和 set_min_delay。如图5.18和图5.19所示,分别约束PLL输出时钟c2到FPGA的输出管脚sdram_clk的最大和最小路径延时 (set_max_delay和set_min_delay)。From选择PLL输出时钟端口c2;To选择FPGA连接SDRAM的管脚 sdram_clk;Delay value通常可以取值set_max_delay为3ns,set_min_delay为0ns(因为这个是FPGA内部走全局时钟网络的管脚,它的时 钟网络延时会比较小,通常时序要求紧一些)。
图5.18
图5.19