1 / 90

FPGA 和 SOPC 应用 —— 时 序分析与逻辑优化

FPGA 和 SOPC 应用 —— 时 序分析与逻辑优化. 华中科技大学启明学院电工电子科技创新中心 王 贞炎. 内容. 时序分析基础 TimeQuest 时序分析器 FPGA 资源优化 FPGA 时序优化. 时序分析:时序分析是做什么的?. 帮助分析和验证一个设计中的时序是否符合要求 所有 的数据路径都会按照对应的约束被分析 整个设计必须符合时序要求或例外 指导 fitter (布局布线器)布局布线出符合要求的结果. 时序分析:一些基本概念. 启动和锁存沿( launch & latch edge )

damisi
Download Presentation

FPGA 和 SOPC 应用 —— 时 序分析与逻辑优化

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. FPGA和SOPC应用——时序分析与逻辑优化 华中科技大学启明学院电工电子科技创新中心 王贞炎

  2. 内容 • 时序分析基础 • TimeQuest时序分析器 • FPGA资源优化 • FPGA时序优化

  3. 时序分析:时序分析是做什么的? • 帮助分析和验证一个设计中的时序是否符合要求 • 所有的数据路径都会按照对应的约束被分析 • 整个设计必须符合时序要求或例外 • 指导fitter(布局布线器)布局布线出符合要求的结果

  4. 时序分析:一些基本概念 • 启动和锁存沿(launch & latch edge) • 建立和保持时间(setup & hold times) • 数据和时钟到达时间(data &clock arrival time) • 数据需求时间(data required time) • 建立和保持时间裕量(setup & hold slack) • 恢复和移除时间(recovery & removal time)

  5. 时序分析:路径和分析 • 三种路径: • 时钟路径(Clock Paths) • 数据路径(Data Paths) • 异步路径(Asynchronous Paths) • 两类分析: • 同步分析(Synchronous):分析时钟与数据路径 • 异步分析(Asynchronous):分析时钟与异步路径

  6. 时序分析:启动沿和锁存沿 • 启动沿:使数据从源寄存器“发射”出去的时钟沿 • 锁存沿:使数据被目的寄存器锁存的时钟沿(一般来说,锁存沿在启动沿的后一个周期) 锁存沿 启动沿

  7. 时序分析:建立和保持时间 • 建立时间(TSU):在时钟有效沿之前数据必须保持稳定的最小时间 • 保持时间(TH):在时钟有效沿之后数据必须保持稳定的最小时间 • 建立时间和保持时间形成一个时间窗,在此窗之内,数据必须保持稳定。

  8. 时序分析:数据到达时间 • 数据到达目的寄存器数据输入端的时间 • 数据到达时间(DAT)= 启动沿 +Tclk1 + Tco + Tdata

  9. 时序分析:时钟到达时间 • 时钟到达目的寄存器时钟输入端的时间 • 时钟到达时间(CAT)=锁存沿 +Tclk2

  10. 时序分析:数据建立时间要求 • 数据到达目的寄存器输入端的最迟时间 • 数据建立时间要求(DRTSU)=CAT -TSU

  11. 时序分析:数据保持时间要求 • 数据在目的寄存器输入端消失的最早时间 • 数据保持时间要求(DRTH)=CAT +TH

  12. 时序分析:建立时间裕量 • 数据到达时间与数据建立时间要求之间的裕量 • 数据建立时间裕量(Setup Slack)=DRTSU - DAT

  13. 时序分析:保持时间裕量 • 数据保持时间要求与数据保持时间之间的裕量 • 数据保持时间裕量(Hold Slack)= DAT -DRTH

  14. 时序分析:I/O分析 • I/O分析采用与前面同步分析中同样的方法 • 必须指定外部器件和PCB上的时序信息

  15. 时序分析:恢复和移除时间 • 恢复时间:在时钟有效沿之前异步信号必须保持稳定的最小时间 • 移除时间:在时钟有效验之后异步信号必须保持稳定的最小时间 • 异步=同步? • 异步信号的确不需要时钟,但不是完全与时钟无关 • 不能在时钟的有效沿附近跳变,因为会引起寄存器内部出现亚稳态。

  16. 时序分析:QuartusII 中的时序模型 • Quartus II 中为每个器件建立了两个模型: • Slow Corner 模型(慢速模型) • 为每条路径上可能出现的最慢性能的情况建模 • 在高温低电压下出现最慢性能 • Fast Corner 模型(快速模型) • 为每条路径上可能出现的最快性能的情况建模 • 在低温高电压下出现最快性能 • 为什么两个模型: • 慢速模型是满足建立时间的最坏情况 • 快速模型是满足保持时间的最坏情况 • 对于65nm器件,由于低温情况下的“逆温效应”,Quartus II 中还有低温慢速模型。

  17. TimeQuest TA • 与传统时序分析器(Classic Time Analyzer)相比,TimeQuest Time Analyzer : • 采用工业标准的约束方法(Synopsis Design Constraints File) • 采用工业标准的报告方法 • 可采用GUI或命令行设置约束、运行分析和查看报告 • 可报告任意路径的逐节点的时序信息,并图形化的表示 • 更好地支持65nm及以下制程的FPGA • 从Quartus II 10 开始Altera将不再支持Classic Time Analyzer

  18. TimeQuest TA:TimeQuest GUI

  19. TimeQuest TA:SDC文件编辑器 • 可使用GUI中的对话框添加约束语句(Edit – Insert Constraint) • 语法高亮 • 语法提示

  20. TimeQuest TA:图形化的SDC编辑

  21. TimeQuest TA:使用TQ的基本步骤 • 生成时序网表 • 输入SDC约束 • 创建SDC文件并读入 或 读入已有的SDC文件 • 直接在控制台窗口输入约束 • 更新时序网表 • 生成时序报告 • 保存约束

  22. TimeQuestTA:使用TQ的流程 综合(Synthesize) 在TimeQuest TA里添加时序要求(约束) 在工程中使能TimeQuest TA 布局布线(Fitter) 采用TimeQuest TA 察看报告、验证时序

  23. TimeQuest TA:约束的重要性 • 时序分析告诉我们电路的实际表现会是怎样 • 提供约束告诉分析工具我们希望电路的表现应该是怎样 • 约束描述了一个电路的时序应该是怎样 • 约束告诉布局布线器(Fitter)布线的目标 • 约束提供了与时序分析结果对比的参照 • 在没有提供约束的时候,TimeQuest TA只能提供有限的分析

  24. TimeQuest TA:如何输入约束 • 所有下面将提到的约束都可以通过GUI输入 • TimeQuest的Constraints菜单 • SDC文件编辑器的Edit – Insert Constraint 菜单

  25. TimeQuest TA:SDC中的一些术语

  26. TimeQuest TA:SDC中的集合 • 在工程网表中满足查找条件的一系列名字(Net、Port等) • 在SDC中用于对多个类似路径或网络做约束 • 可用的查找语句: • get_ports • get_pins • get_clocks • all_clocks • all_registers • all_inputs • all_outpus • 等等 具体语法参考QuartusII 手册第三卷

  27. TimeQuest TA:Clock • 加在电路中任何节点的周期性重复电平信号都可以称为时钟 • 内部时钟:加在电路中的作为Cell时钟输入的信号 • “虚拟”时钟:并没有实际输入,或并不与电路直接有关的时钟信号。比如由FPGA输出给外部电路的时钟 • 采用节点名字或一些有实际意义的名字命名时钟 • 两种时钟: • 基本时钟 • 绝对的或基础的时钟,一般是外部输入 • 衍生时钟 • 由某个源时钟衍生出来的时钟,必须指定与源时钟的关系 • 由某些功能模块输出的时钟,如锁相环输出 • 所有时钟都是由联系的

  28. 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

  29. 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]

  30. TimeQuestTA:采用GUI创建时钟

  31. TimeQuest TA:NameFinder

  32. 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]

  33. TimeQuestTA:用GUI创建衍生时钟

  34. 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]

  35. 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]

  36. 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]

  37. 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中没有)

  38. 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

  39. TimeQuestTA:默认的时钟约束 • 所有的时钟都必须被约束 • 如果有时钟没有被约束,默认的约束将会是: derive_clocks -period 1.0 derive_pll_clocks

  40. TimeQuest TA:Clock其它 • 到目前为止,时钟都很理想: • 都是完美的方波 • 都没有考虑在FPGA外部的延迟 • 还需要其他约束来定义实际的,非理想的时钟 • set_clock_latency • Set_clock_uncertainty • Derive_clock_uncertinty

  41. TimeQuestTA:时钟延迟(latency) • 时钟延迟包括: • Source 延迟:从时钟源到输入引脚的延迟(板级延迟) • Network 延迟:从输入引脚到目的寄存器的延迟 • 时序分析会自动处理Network延迟 • 必须自行处理source延迟 • create_clock命令创建的时钟默认的latency为0

  42. TimeQuestTA:Clock Latency set_clock_latency –source [-clock <clock_list>] [-early | -late] [-fall | -rise] <delay> <targets>

  43. 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

  44. TimeQuestTA:CCPPRemoval • 移除共有时钟路径上的时钟延迟(在Cyclone III, Stratix III及以后的器件上支持) • 在TimeQuest TA Setting里设置或使用 enable_ccpp_removal命令

  45. TimeQuestTA:未约束的时钟 • 用 Unconstrained Paths Report(未约束路径报告)可找出未被约束的时钟 • Quartus II Compilation Report中的summary • TimeQuest TA中使用report_ucp命令 • TimeQuest TA中用Report Unconstrained Paths • 用 Clock Report 检查时钟约束的正确

  46. TimeQuestTA:未约束路径报告

  47. TimeQuestTA:Report Clocks • 列出已约束的时钟的细节

  48. TimeQuest TA:I/O约束 • 组合逻辑I/O接口 • 同步逻辑I/O接口 • 源同步接口

  49. 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>

  50. 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

More Related