ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

fpga系列 硬件(时序收敛):set_input_delay +最大输入延时最小输入延时+建立时间保持时间

fpga系列 硬件(时序收敛):set_input_delay +最大输入延时最小输入延时+建立时间保持时间 Layer 1建立时间保持时间最大输入延时对于最大输入延时需确保数据在时钟的有效边沿之前已经稳定并且满足寄存器的建立时间要求T s e t u p T_{setup}Tsetup​。 可以表示为最大输入延时 T c l k − q T s e t u p ≤ 时钟周期 \text{最大输入延时} T_{clk-q} T_{setup} \leq \text{时钟周期}最大输入延时Tclk−q​Tsetup​≤时钟周期T c l k − q T_{clk-q}Tclk−q​时钟上升沿(下降沿)到达FPGA至FPGA内部触发器Q更新的时间。T s e t u p T_{setup}Tsetup​:FPGA内部触发器的建立时间如果这个条件不满足则会产生建立时间违例Setup Violation表明数据可能无法在下一个时钟边沿前被正确采样。最小输入延时对于最小输入延时确保数据在时钟的有效边沿之后仍然保持稳定并且满足寄存器的保持时间要求T h o l d T_{hold}Thold​。 公式可以表示为最小输入延时 ≥ T c l k − q T h o l d \text{最小输入延时} \geq T_{clk-q} T_{hold}最小输入延时≥Tclk−q​Thold​如果这个条件不满足则会产生保持时间违例Hold Violation表明数据可能在时钟边沿后过早变化导致采样错误。set_input_delay语法set_input_delay用于指定输入数据引脚相对于其时钟沿的延时用于数据路径中的pin2reg(外部数据到达端口所需时间):set_input_delay delay_value [-clock clock_name] [-reference_pin pin_name] [-max] [-min] [-rise] [-fall] [-add_delay] [-clock_fall] [-level_sensitive] port_list参数说明delay_value: 输入延迟的时间值通常以纳秒ns为单位。-clock clock_name: 指定与输入延迟相关的时钟信号。如果不指定默认使用设计的主时钟。-reference_pin pin_name: 指定参考引脚延迟是相对于该引脚的。-max: 设置最大延迟值。-min: 设置最小延迟值。-rise: 仅针对上升沿设置延迟。-fall: 仅针对下降沿设置延迟。-add_delay: 添加延迟值到现有的延迟上而不是替换。-clock_fall: 指定延迟相对于时钟的下降沿。-level_sensitive: 指定延迟是电平敏感的。port_list: 需要设置延迟的输入端口列表。set_input_delay-clock{clock}-clock_fall-fall-max20foo//https://www.intel.cn/content/www/cn/zh/docs/programmable/683243/20-1/input-constraints-set-input-delay.htmlFPGA工具将执行的操作计算路径延时设置set_input_delay后FPGA工具主要进行的是时序分析计算从外部输入端口到内部寄存器的数据路径是否满足建立时间和保持时间的要求。生成时序报告然后工具会生成一个详细的时序报告显示所有路径的延时情况并指出是否满足建立时间和保持时间的要求。set_input_delay示例假设时钟为100 MHz的即周期为10 nsFPGA内部寄存器的建立时间为0.5 ns。FPGA内部寄存器的保持时间为0.4 ns。外部设备到FPGA的数据传输延迟范围为2ns至6ns:# 定义主时钟信号及其周期 create_clock -name clk_main -period 10.0 [get_ports clk] # 100MHz时钟 # 建立时间的偏移 set_clock_uncertainty -setup 0.5 [get_clocks clk_main] # https://www.intel.com/content/www/us/en/docs/programmable/683068/18-1/clock-uncertainty.html #保持时间的偏移 set_clock_uncertainty -hold 0.4 [get_clocks clk_main] # 设置输入延迟 set_input_delay -max 6 -clock clk_main [get_ports data_in*] # 最大输入延时 set_input_delay -min 2 -clock clk_main [get_ports data_in*] # 最小输入延时说明只要设计有 IO 端口并且这些端口要和某个时钟做建立/保持时间检查就需要set_input_delay/set_output_delay。如果时钟频率很低外部器件和板级走线带来的延迟远小于时钟周期即使没有显式约束布局布线也可能“大致”满足。像 DDR3/DDR4 这类接口控制器通常有 write leveling、read training、DLL/PLL 等机制会在初始化阶段自动对齐数据和时钟相位。所以很多工程里不会像普通并行总线那样手动写死 input/output delay。其他常用的约束基础命令作用create_clock定义主时钟所有时序分析的起点create_generated_clock定义 PLL/MMCM 输出、分频/倍频时钟set_clock_groups -asynchronous标记异步时钟域让工具不分析跨域路径set_clock_groups -asynchronous告诉 STA这两个时钟之间没有固定相位关系不要按同步路径去算 setup/hold。它不会阻止数据跨域也不会替代 CDC 电路。FPGA 里有一个 100MHz 系统时钟域还有一个来自外部晶振的 UART 串口采样时钟域实际流程通常是这样的UART 接收模块在 clk_uart 域采样串行数据拼成字节写入一个异步 FIFO 或双口 RAM系统时钟域 clk_sys 从 FIFO 读侧把数据取走跨 FIFO 的读写指针用格雷码同步保证空满判断安全set_clock_groups -asynchronous 关掉 clk_uart ↔ clk_sys 之间的普通时序检查避免工具报虚假违例。接口相关的有外部同步接口命令作用set_input_delay定义外部数据到达 FPGA 引脚的延迟set_output_delay定义 FPGA 输出到外部器件的时序要求时序例外特定路径命令作用set_false_path忽略不需要时序检查的路径如异步复位、测试模式set_multicycle_path允许数据在多个周期内传输如低速控制路径set_max_delay/set_min_delay给特定路径设绝对延迟上限/下限如 CDC 同步器前路径物理/调试类按需set_property LOC— 引脚位置set_property MARK_DEBUG— 保留调试信号set_property DONT_TOUCH— 防止综合优化掉某些逻辑两级同步器在目的时钟域打拍如果clk1和clk2不是同一个PLL生成的倍频关心第一级可能亚稳态但经过一个clk2周期后亚稳态大概率已经收敛到 0 或 1第二级再采样就能输出稳定值reg ff1, sync_ff1, sync_ff2, ff3; always (posedge clk1) begin ff1 d1; end always (posedge clk2) begin sync_ff1 ff1; sync_ff2 sync_ff1; ff3 sync_ff2 sync_ff2; // 或者用 sync_ff2 替代 ff1 end打两拍解决的是单 bit 亚稳态不能解决bit 之间到达时间。set_max_delay可以让ff1到sync_ff1的布线距离近一些set_max_delay-datapath_only\-from[get_cells ff1]\-to[get_cells sync_ff1]\[expr min($src_period,$dst_period)]set_max_delay -datapath_onlyset_bus_skew解决 bit skewset_max_delay -datapath_only \ -from [get_cells src_gray[*]] \ -to [get_cells dst_gray_s1[*]] \ [expr min($src_period, $dst_period)]命令的作用是约束格雷码指针从源时钟域寄存器到目的时钟域第一级同步寄存器的最大数据路径延迟。各部分含义片段含义set_max_delay设置路径最大允许延迟-datapath_only只约束数据路径延迟忽略源时钟和目的时钟之间的 clock skew/uncertainty-from [get_cells src_gray[*]]起点源时钟域格雷码寄存器-to [get_cells dst_gray_s1[*]]终点目的时钟域第一级同步寄存器[expr min($src_period, $dst_period)]约束值取两个时钟周期中较小的那个RTL 示例4 bit 格雷码指针同步module gray_cdc_4bit ( input wire src_clk, input wire src_rst_n, input wire [3:0] src_bin_ptr, input wire dst_clk, input wire dst_rst_n, output wire [3:0] dst_bin_ptr ); // ---------- 源时钟域二进制转格雷码 ---------- reg [3:0] src_bin; reg [3:0] src_gray; always (posedge src_clk or negedge src_rst_n) begin if (!src_rst_n) begin src_bin 4d0; src_gray 4d0; end else begin src_bin src_bin_ptr; src_gray src_bin ^ (src_bin 1); end end // ---------- 目的时钟域两级同步器 ---------- (* ASYNC_REG TRUE *) reg [3:0] dst_gray_s1; (* ASYNC_REG TRUE *) reg [3:0] dst_gray_s2; always (posedge dst_clk or negedge dst_rst_n) begin if (!dst_rst_n) begin dst_gray_s1 4d0; dst_gray_s2 4d0; end else begin dst_gray_s1 src_gray; dst_gray_s2 dst_gray_s1; end end // ---------- 格雷码转二进制 ---------- wire [3:0] dst_bin; assign dst_bin[3] dst_gray_s2[3]; assign dst_bin[2] dst_bin[3] ^ dst_gray_s2[2]; assign dst_bin[1] dst_bin[2] ^ dst_gray_s2[1]; assign dst_bin[0] dst_bin[1] ^ dst_gray_s2[0]; assign dst_bin_ptr dst_bin; endmodule这里的关键点src_gray是源时钟域寄存器输出dst_gray_s1是目的时钟域第一级同步寄存器dst_gray_s2是第二级用于隔离亚稳态多 bit 格雷码总线必须保证每次只有 1 bit 变化所以源端要先转格雷码再跨域。XDC 约束示例假设src_clk100 MHz周期 10 nsdst_clk125 MHz周期 8 ns。create_clock -period 10.000 -name src_clk [get_ports src_clk] create_clock -period 8.000 -name dst_clk [get_ports dst_clk] # 声明异步时钟关系 set_clock_groups -asynchronous \ -group [get_clocks src_clk] \ -group [get_clocks dst_clk] # 动态读取时钟周期 约束格雷码指针跨域路径源寄存器 - 目的域第一级同步器 set src_period [get_property PERIOD [get_clocks src_clk]] set dst_period [get_property PERIOD [get_clocks dst_clk]] set_max_delay -datapath_only \ -from [get_cells src_gray[*]] \ -to [get_cells dst_gray_s1[*]] \ [expr min($src_period, $dst_period)] # 限制相对差异最快和最慢的 bit 之间差不能超过 * ns # 让 src_gray[*] 到 dst_gray_s1[*] 这条总线里最快到达的 bit 和最慢到达的 bit时间差不超过 * ns set_bus_skew \ -from [get_cells src_gray[*]] \ -to [get_cells dst_gray_s1[*]] \ [expr min($src_period, $dst_period)]这里set_max_delay -datapath_only限制格雷码各 bit 从src_gray到dst_gray_s1的绝对路径延迟set_bus_skew进一步限制 bit 之间的 skew避免采样到非法中间值。注意不要约束到dst_gray_s2只约束到第一级格雷码路径不要直接打set_false_path否则工具会放弃优化bit skew 可能失控。加上MINsetsrc_period[get_property PERIOD[get_clocks src_clk]]setdst_period[get_property PERIOD[get_clocks dst_clk]]set_max_delay-datapath_only\-from[get_cells src_gray[*]]\-to[get_cells dst_gray_s1[*]]\[expr min($src_period,$dst_period)]set_bus_skew\-from[get_cells src_gray[*]]\-to[get_cells dst_gray_s1[*]]\[expr min($src_period,$dst_period)]set_min_delay-datapath_only\-from[get_cells src_gray[*]]\-to[get_cells dst_gray_s1[*]]\0.0单 bit 例子的区别单 bit 同步只需要解决亚稳态传播多 bit 总线除了亚稳态还要解决bit skew。所以多 bit 格雷码同步要同时满足源端先转格雷码每 bit 在目的域打两拍第一级同步器标记ASYNC_REG对src_gray → dst_gray_s1加set_max_delay -datapath_only配合set_bus_skew控制 bit 间延迟差。如果把这个例子里的src_bin_ptr换成异步 FIFO 的写指针或读指针结构基本就是标准异步 FIFO 指针同步路径。CGfpga系列 硬件(时序收敛)触发器建立时间(setuptime)保持时间
返回列表