对边沿对齐源同步输入端口的约束
0赞相对于FPGA来说,边沿对齐源同步输入端口,指的是FPGA同时接收外部器件传过来的数据和时钟信号,并且用接收到的时钟信号去锁存传过来的数据。模型如下图所示:
对此模型进行约束,分下面几个步骤:
1.对时钟的约束。
建立virtual,base和generated clocks。
virtual clock为驱动外部器件产生传递数据到FPGA的时钟。这个时钟不存在于FPGA内部,由外部产生,所以定义为虚拟时钟,不需要定义时钟源。
base clock 为输入到FPGA端口的时钟信号。如上图中的clk_in管脚。
generated clock 对应边沿对齐的源同步输入口,需要用FPGA内部PLL进行相移。所以用generated clock约束PLL生成的时钟。
2.对输入延时的约束
对于源同步时钟系统,数据和时钟信号时同步传输的,所以对于输入延时来说只需要考虑skew就可以了。最大的输入延时为skew,最小的输入延时为负的skew。
3.对false path的约束
设系统的数据传输发生在rise-rise和fall-fall下,那么对rise-fall和fall-rise要进行false path 的约束。
实例如下:
#建立虚拟时钟,由于此时钟并不存在FPGA里,所以不需要指定源
create_clock -name virt_clk -period 10
#建立输入时钟
create_clock -name input_clock -period 10 [get_ports clk_in]
#PLL时钟,为保证建立时间和保持时间,相移90度
create_generated_clock -name data_clock -source [get_pins pll|inclk[0]] \
-phase 90 [get_pins pll|clk[0]]
#假设skew为250ps,需要对时钟的上升沿和下降沿都进行约束。
#而且是相对于virt_clk进行约束。
set_input_delay -max -clock virt_clk 0.250 [get_ports data_in*]
set_input_delay -min -clock virt_clk -0.250 [get_ports data_in*]
set_input_delay -max -clock virt_clk -clock_fall \
0.250 [get_ports data_in*] -add
set_input_delay -min -clock virt_clk -clock_fall \
-0.250 [get_ports data_in*] -add
#对false path的约束。
#对于源同步接口,virt_clk为Launch Clock
#data_clock为Latch Clock
set_false_path -setup -end -rise_from [get_clocks virt_clk] \
-fall_to [get_clocks data_clock]
set_false_path -setup -end -fall_from [get_clocks virt_clk] \
-rise_to [get_clocks data_clock]
set_false_path -hold -end -rise_from [get_clocks virt_clk] \
-rise_to [get_clocks data_clock]
set_false_path -hold -end -fall_from [get_clocks virt_clk] \
-fall_to [get_clocks data_clock]