910 likes | 1.36k Views
FPGA 和 SOPC 应用 —— 时 序分析与逻辑优化. 华中科技大学启明学院电工电子科技创新中心 王 贞炎. 内容. 时序分析基础 TimeQuest 时序分析器 FPGA 资源优化 FPGA 时序优化. 时序分析:时序分析是做什么的?. 帮助分析和验证一个设计中的时序是否符合要求 所有 的数据路径都会按照对应的约束被分析 整个设计必须符合时序要求或例外 指导 fitter (布局布线器)布局布线出符合要求的结果. 时序分析:一些基本概念. 启动和锁存沿( launch & latch edge )
E N D
FPGA和SOPC应用——时序分析与逻辑优化 华中科技大学启明学院电工电子科技创新中心 王贞炎
内容 • 时序分析基础 • TimeQuest时序分析器 • FPGA资源优化 • FPGA时序优化
时序分析:时序分析是做什么的? • 帮助分析和验证一个设计中的时序是否符合要求 • 所有的数据路径都会按照对应的约束被分析 • 整个设计必须符合时序要求或例外 • 指导fitter(布局布线器)布局布线出符合要求的结果
时序分析:一些基本概念 • 启动和锁存沿(launch & latch edge) • 建立和保持时间(setup & hold times) • 数据和时钟到达时间(data &clock arrival time) • 数据需求时间(data required time) • 建立和保持时间裕量(setup & hold slack) • 恢复和移除时间(recovery & removal time)
时序分析:路径和分析 • 三种路径: • 时钟路径(Clock Paths) • 数据路径(Data Paths) • 异步路径(Asynchronous Paths) • 两类分析: • 同步分析(Synchronous):分析时钟与数据路径 • 异步分析(Asynchronous):分析时钟与异步路径
时序分析:启动沿和锁存沿 • 启动沿:使数据从源寄存器“发射”出去的时钟沿 • 锁存沿:使数据被目的寄存器锁存的时钟沿(一般来说,锁存沿在启动沿的后一个周期) 锁存沿 启动沿
时序分析:建立和保持时间 • 建立时间(TSU):在时钟有效沿之前数据必须保持稳定的最小时间 • 保持时间(TH):在时钟有效沿之后数据必须保持稳定的最小时间 • 建立时间和保持时间形成一个时间窗,在此窗之内,数据必须保持稳定。
时序分析:数据到达时间 • 数据到达目的寄存器数据输入端的时间 • 数据到达时间(DAT)= 启动沿 +Tclk1 + Tco + Tdata
时序分析:时钟到达时间 • 时钟到达目的寄存器时钟输入端的时间 • 时钟到达时间(CAT)=锁存沿 +Tclk2
时序分析:数据建立时间要求 • 数据到达目的寄存器输入端的最迟时间 • 数据建立时间要求(DRTSU)=CAT -TSU
时序分析:数据保持时间要求 • 数据在目的寄存器输入端消失的最早时间 • 数据保持时间要求(DRTH)=CAT +TH
时序分析:建立时间裕量 • 数据到达时间与数据建立时间要求之间的裕量 • 数据建立时间裕量(Setup Slack)=DRTSU - DAT
时序分析:保持时间裕量 • 数据保持时间要求与数据保持时间之间的裕量 • 数据保持时间裕量(Hold Slack)= DAT -DRTH
时序分析:I/O分析 • I/O分析采用与前面同步分析中同样的方法 • 必须指定外部器件和PCB上的时序信息
时序分析:恢复和移除时间 • 恢复时间:在时钟有效沿之前异步信号必须保持稳定的最小时间 • 移除时间:在时钟有效验之后异步信号必须保持稳定的最小时间 • 异步=同步? • 异步信号的确不需要时钟,但不是完全与时钟无关 • 不能在时钟的有效沿附近跳变,因为会引起寄存器内部出现亚稳态。
时序分析:QuartusII 中的时序模型 • Quartus II 中为每个器件建立了两个模型: • Slow Corner 模型(慢速模型) • 为每条路径上可能出现的最慢性能的情况建模 • 在高温低电压下出现最慢性能 • Fast Corner 模型(快速模型) • 为每条路径上可能出现的最快性能的情况建模 • 在低温高电压下出现最快性能 • 为什么两个模型: • 慢速模型是满足建立时间的最坏情况 • 快速模型是满足保持时间的最坏情况 • 对于65nm器件,由于低温情况下的“逆温效应”,Quartus II 中还有低温慢速模型。
TimeQuest TA • 与传统时序分析器(Classic Time Analyzer)相比,TimeQuest Time Analyzer : • 采用工业标准的约束方法(Synopsis Design Constraints File) • 采用工业标准的报告方法 • 可采用GUI或命令行设置约束、运行分析和查看报告 • 可报告任意路径的逐节点的时序信息,并图形化的表示 • 更好地支持65nm及以下制程的FPGA • 从Quartus II 10 开始Altera将不再支持Classic Time Analyzer
TimeQuest TA:SDC文件编辑器 • 可使用GUI中的对话框添加约束语句(Edit – Insert Constraint) • 语法高亮 • 语法提示
TimeQuest TA:使用TQ的基本步骤 • 生成时序网表 • 输入SDC约束 • 创建SDC文件并读入 或 读入已有的SDC文件 • 直接在控制台窗口输入约束 • 更新时序网表 • 生成时序报告 • 保存约束
TimeQuestTA:使用TQ的流程 综合(Synthesize) 在TimeQuest TA里添加时序要求(约束) 在工程中使能TimeQuest TA 布局布线(Fitter) 采用TimeQuest TA 察看报告、验证时序
TimeQuest TA:约束的重要性 • 时序分析告诉我们电路的实际表现会是怎样 • 提供约束告诉分析工具我们希望电路的表现应该是怎样 • 约束描述了一个电路的时序应该是怎样 • 约束告诉布局布线器(Fitter)布线的目标 • 约束提供了与时序分析结果对比的参照 • 在没有提供约束的时候,TimeQuest TA只能提供有限的分析
TimeQuest TA:如何输入约束 • 所有下面将提到的约束都可以通过GUI输入 • TimeQuest的Constraints菜单 • SDC文件编辑器的Edit – Insert Constraint 菜单
TimeQuest TA:SDC中的集合 • 在工程网表中满足查找条件的一系列名字(Net、Port等) • 在SDC中用于对多个类似路径或网络做约束 • 可用的查找语句: • get_ports • get_pins • get_clocks • all_clocks • all_registers • all_inputs • all_outpus • 等等 具体语法参考QuartusII 手册第三卷
TimeQuest TA:Clock • 加在电路中任何节点的周期性重复电平信号都可以称为时钟 • 内部时钟:加在电路中的作为Cell时钟输入的信号 • “虚拟”时钟:并没有实际输入,或并不与电路直接有关的时钟信号。比如由FPGA输出给外部电路的时钟 • 采用节点名字或一些有实际意义的名字命名时钟 • 两种时钟: • 基本时钟 • 绝对的或基础的时钟,一般是外部输入 • 衍生时钟 • 由某个源时钟衍生出来的时钟,必须指定与源时钟的关系 • 由某些功能模块输出的时钟,如锁相环输出 • 所有时钟都是由联系的
TimeQuest TA:Clock约束 • Create clock • Create generated clock • PLL clocks • Automatic clock detection &creation • Default constraints • Clock latency • Clock uncertainty • Automatically Derive Uncertainty • Common Clock Path Pessimism Removal
TimeQuestTA:Create Clock • create_clock[-name <clock_name>] –period <time> [-waveform {<rise_time> <fall_time>}] [<targets>] [-add] create_clock –period 20.0 –name clk_50 [get_portsclk_in] create_clock –period 10.0 –waveform {2.0 8.0} [get_portssysclk]
TimeQuestTA:Generated Clock • create_generated_clock [-name <clock_name>] -source <master_pin> [-master_clock <clock_name>] [-divide_by <factor>] [-multiply_by <factor>] [-duty_cycle <percent>] [-invert] [-phase <degrees>] [-edges <edge_list>] [-edge_shift <shift_list>] [<targets>] [-add]
TimeQuestTA:衍生时钟例1 create_clock –period 10 [get_portsclk_in] create_generated_clock –name clk_div \ –source [get_pinsinst|clk] \ -divide_by 2 \ [get_pinsinst|regout]
TimeQuestTA:衍生时钟例2 create_clock –period 10 [get_portsclk_in] create_generated_clock –name pulse_clk_out –source clk_in \ –edges {1 4 5} [get_pinspulse_logic|out]
TimeQuestTA:衍生时钟例3 create_clock –period 10 [get_portsclk_in] create_generated_clock –name pulse_clk_out -source clk_in \ –edges {1 4 5} -edge_shift {2.5 2.5 0} [get_pinspulse_logic|out]
TimeQuestTA:Derive PLLClocks derive_pll_clocks [-use_tan_name] [-create_base_clocks] • 用于自动地根据PLL的设置产生由PLL输出的衍生时钟 • 必须已经定义了PLL的输入时钟(除非指定了create_base_clocks选项) • 在PLL的输出设置改变时,会自动更新衍生时钟 • 可以采用write_sdc –expand命令将其扩展为标准的create_clock和create_generated_clock语句 • 必须在SDC文件或控制台窗口中键入(GUI中没有)
TimeQuestTA:Derive PLLClocks例子 create_clock –period 10.0 [get_portsin_clk] create_generated_clock –name c100 \ –source [get_pins {inst|altpll_component|pll|inclk[0]}] \ -divide_by 1 \ [get_pins {inst|altpll_component|pll|clk[0]}] create_generated_clock –name c200 \ –source [get_pins {inst|altpll_component|pll|inclk[0]}] \ -multiply_by 2 \ [get_pins {inst|altpll_component|pll|clk[1]}] create_generated_clock –name c200_shift \ -source [get_pins {inst|altpll_component|pll|inclk[0]}] \ -multiply_by2 -phase 90 \ [get_pins {inst|altpll_component|pll|clk[2]}] create_clock –period 10.0 \ [get_portsin_clk] derive_pll_clocks # or simply: derive_pll_clocks \ –create_base_clocks
TimeQuestTA:默认的时钟约束 • 所有的时钟都必须被约束 • 如果有时钟没有被约束,默认的约束将会是: derive_clocks -period 1.0 derive_pll_clocks
TimeQuest TA:Clock其它 • 到目前为止,时钟都很理想: • 都是完美的方波 • 都没有考虑在FPGA外部的延迟 • 还需要其他约束来定义实际的,非理想的时钟 • set_clock_latency • Set_clock_uncertainty • Derive_clock_uncertinty
TimeQuestTA:时钟延迟(latency) • 时钟延迟包括: • Source 延迟:从时钟源到输入引脚的延迟(板级延迟) • Network 延迟:从输入引脚到目的寄存器的延迟 • 时序分析会自动处理Network延迟 • 必须自行处理source延迟 • create_clock命令创建的时钟默认的latency为0
TimeQuestTA:Clock Latency set_clock_latency –source [-clock <clock_list>] [-early | -late] [-fall | -rise] <delay> <targets>
TimeQuestTA:Clock Uncertainty set_clock_uncertainty [-setup | -hold] [-fall_from <fall_from_clock>] [-fall_to <fall_to_clock>] [-from <from_clock>] [-rise_from <rise_from_clock>] [-rise_to <rise_to_clock>] [-to <to_clock>] -<value> • 建立时间的不确定,提前了DRTSU • 保持时间的不确定,推迟了DRTH
TimeQuestTA:CCPPRemoval • 移除共有时钟路径上的时钟延迟(在Cyclone III, Stratix III及以后的器件上支持) • 在TimeQuest TA Setting里设置或使用 enable_ccpp_removal命令
TimeQuestTA:未约束的时钟 • 用 Unconstrained Paths Report(未约束路径报告)可找出未被约束的时钟 • Quartus II Compilation Report中的summary • TimeQuest TA中使用report_ucp命令 • TimeQuest TA中用Report Unconstrained Paths • 用 Clock Report 检查时钟约束的正确
TimeQuestTA:Report Clocks • 列出已约束的时钟的细节
TimeQuest TA:I/O约束 • 组合逻辑I/O接口 • 同步逻辑I/O接口 • 源同步接口
TimeQuestTA:组合逻辑 • 所有从输入到输出的路径都应该被约束 • 采用set_max_delay和 set_min_delay命令 • 参数:[-from <names>][-to <names>][-fall_from <clocks>][-rise_from <clocks>][-fall_to <clocks>][-rise_to <clocks>][-through]<delay>
TimeQuestTA:组合逻辑例子 set_max_delay –from [get_ports in1] –to [get_ports out*] 5.0 set_max_delay –from [get_ports in2] –to [get_ports out*] 7.5 set_max_delay –from [get_ports in3] –to [get_ports out*] 9.0 set_min_delay –from [get_ports in1] –to [get_ports out*] 1.0 set_min_delay –from [get_ports in2] –to [get_ports out*] 2.0 set_min_delay –from [get_ports in3] –to [get_ports out*] 3.0