2.8 设计的约束
设计者指定的设计约束、分配和逻辑选项会影响 Quartus Prime 软件编译器实现设计的方式。编译器尝试以高于满足设计约束的行为综合和布局逻辑。此外,设计约束还会影响时序分析器与功耗分析器影响综合、布局和布线。
设计者可以使用脚本在图形用户接口(Graphic User Interface,GUI)中指定设计约束,也可以在保存约束的文件中直接指定约束。Quartus Prime 软件在下面的文件中保留 GUI 中指定的约束。
1)Intel Quartus Prime设置文件(.qsf)
位置为“<工程目录>/<版本名字>.qsf”。包含工程当前版本的项目范围和实例级分配,采用Tcl语法。工程的每个版本都有一个单独的.qsf文件。
2)Synopsys设计约束文件(.sdc)
位置为“<工程目录>/<版本名字>.sdc”。时序分析器使用业界标准的 SDC(Synopsys Design Constraints,SDC)格式,并将这些约束保存在.sdc文件中。
使用Tcl,通过组合.qsf文件和.sdc文件的语法,设计者就可以自动执行多个不同设置的迭代、修改约束和重新编译。
2.8.1 通过GUI指定约束的方法
Quartus Prime软件提供的工具可以帮助设计者手动实现你的设计。这些工具支持设计可视化、预填充参数和窗口交叉探测,编译设计探索和调试。
在 Quartus Prime 软件中创建或更新约束时,“Message”窗口的“System”标签将显示等效的Tcl命令。利用这些命令作为未来脚本化设计定义和编译的参考。
1.全局约束和分配
全局约束和工程设置影响整个 Quartus 工程和设计中所有适用的逻辑。在工程的早期开发阶段,设计者经常定义全局约束。例如,运行New Project Wizard时,Quartus Prime软件在.qsf 文件中保存全局约束,每个工程的修订版本有一个。用于设置全局约束的 Quartus 工具如表2.10所示。
表2.10 用于设置全局约束的Quartus工具
2.节点、实体和实例级约束
节点、实体和实例级的约束应用于设计层次结构的子集,这些约束优先于影响设计层次结构相同部分的任何全局分配。Quartus设置节点、实体和实例级的约束如表2.11所示。
表2.11 Quartus设置节点、实体和实例级的约束
2.8.2 使用Tcl脚本约束设计的方法
设计者可以使用.sdc 和.qsf 设置文件执行所有的设计分配。通过使用 Tcl 脚本,将这些文件集成到编译和优化流程中。即使.sdc 和.qsf 文件是用 Tcl 语法编写的,但它们本身不能执行。
当使用 Quartus Tcl 包时,设计者的脚本就可以打开工程,进行分析和编译设计,并将编译结果与已知目标和基准进行比较。此外,这样的脚本可以通过修改约束和重新编译设计来自动迭代设计过程。
1.创建工程和应用约束
命令行可执行文件包括用于公共全局工程设置和命令的选项。设计者可以使用 Tcl 脚本应用约束,如引脚位置和时序分配。通过执行菜单命令Project->Generate Tcl File for Project来写一个Tcl约束文件或者为一个已经存在的工程生成一个文件。
该示例使用Tcl脚本创建项目,并使用<Intel Quartus Prime安装目录>/qdesigns/fir_filter目录中的教程设计文件应用工程约束,如代码清单2-4所示。
代码清单2-4 Tcl约束(1)
将脚本保存到一个名字为“setup_proj.tcl”的文件中,并在命令行提示符下面输入示例中说明的命令,以创建设计、应用约束、编译设计,以及执行快角(Fast-Corner)和慢角(Slow-Corner)定时分析。时序分析的结果保存在filtref_sta_1.rpt和filtref_sta_2.rpt文件中,如代码清单2-5所示。
代码清单2-5 Tcl约束(2)
输入如代码清单 2-6 所示的命令,创建设计、应用约束和编译设计,没有执行时序分析。
代码清单2-6 Tcl约束(3)
quartus_sh-flow 编译命令执行全编译,它等效于在工具栏中单击“Start Compilation”按钮。
2.分配一个引脚
使用下面的Tcl命令,将一个信号分配到一个引脚或器件位置,如代码清单2-7所示。代码清单2-7 Tcl约束(4)
有效的位置是所使用 FPGA 芯片的引脚名字。某些器件还支持边沿位置和 I/O 组位置。其中,边沿位置可以是 EDGE_BOTTOM、EDGE_LEFT、EDGE_TOP 和 EDGE_RIGHT;I/O组位置包括IOB ANK_1~IOBANK_n,其中n是设备中I/O组的数量。
3.产生Quartus设置文件
Quartus Prime软件允许设计者从当前版本产生.qsf文件。设计者可以在一个脚本编译流程中嵌入这些约束,甚至为设计优化创建.qsf文件集。
为了从 Quartus Prime 软件生成.qsf 文件,在 Quartus Prime 主界面主菜单下,选择Assignments->Export Assignments。
要以人们可读的形式组织.qsf文件,执行菜单命令Project->Organize Intel Quartus Prime Settings File,生成组织的.qsf文件,如代码清单2-8所示。
代码清单2-8 组织的.qsf文件
这个例子给出了.qsf 文件如何表征设计修订。set_global_assignment 命令实现所有全局约束和软件设置,set_location_assignment 将设计中的每个 I/O 节点约束到器件的一个物理引脚。
4..sdc文件
Quartus Prime软件将时序约束保存在.sdc文件中,该文件使用了Tcl脚本。设计者可以将这些约束嵌入到一个脚本编译流程中,甚至可以为时序优化创建.sdc 文件集。一个小型设计的时序约束文件如代码清单2-9所示。
代码清单2-9 一个小型设计的时序约束
5.Tcl脚本流程
作为对.sdc 文件和.qsf 文件的替代方法,设计者可以在 Tcl 脚本中执行所有设计分配和时序约束。在这种情况下,自动编译和定制结果报告的脚本也包含在设计约束中。
设计者可以将设计的内容导出到过程的可执行 Tcl(.tcl)文件,然后在尝试使用其他约束后使用生成的脚本来恢复设置。
执行菜单命令Project->Generate Tcl File for Project,将约束导出为可执行Tcl脚本,如代码清单2-10所示。
代码清单2-10 bliking_led_generated.tcl文件
2.8.3 在Assignment Editor中添加约束条件
在Assignment Editor中为clk添加全局约束条件的步骤主要包括:
(1)在Quartus Prime主界面主菜单中,选择Assignments->Assignment Editor。
(2)弹出“Assignment Editor”界面,如图2.70所示。在该界面中,双击“To”一栏下面的“《new》”,则变成如图2.71所示的界面。在“To”一栏下面单击按钮。
图2.70 “Assignment Editor”界面(1)
(3)弹出“Node Finder”对话框。在该对话框界面中,单击“Look in:”右侧的按钮。
图2.71 “Assignment Editor”界面(2)
(4)弹出“Select Hierarchy Level”对话框,如图2.72所示。在该对话框中,选中top。
(5)单击“OK”按钮,退出“Select Hierarchy Level”对话框。
(6)在“Node Finder”对话框中,在“Named”标题栏右侧的文本框中输入通配符*,然后单击“Search”按钮。
(7)如图 2.73 所示,在“Matching Nodes:”标题栏的下方列出了设计中的所有节点,选中clk选项,单击按钮,将clk添加到右侧的“Nodes Found:”标题栏的下方。
(8)单击“OK”按钮,退出“Node Finder”对话框。
(9)如图2.74所示,双击“Assignment Name”一栏中的“《new》”,出现浮动菜单。在浮动菜单内,选择Global Signal(Accepts wildcards),表示clk具有全局信号属性。
(10)如图 2.75 所示,双击“Value”一栏和“clk”一行交叉的空白处,弹出浮动菜单。在浮动菜单内,选择Global Clock,表示将clk指定为全局时钟。
图2.72 “Select Hierarchy Level”对话框
图2.73 “Node Finder”对话框
图2.74 选择Global Signal(Accepts wildcards)
图2.75 选择Global Clock
(11)如图 2.75 所示,双击“Enabled”一栏和“clk”一行交叉的空白处,弹出浮动菜单。在浮动菜单内,选择Yes。
(12)按“Ctrl+S”组合键,保存在Assignment Editor内的修改。
2.8.4 在Pin Planner中添加约束条件
在FPGA设计时,I/O 规划(I/O planning)包括创建与引脚相关的分配,并针对引脚布局指南来验证它们。这个过程可以确保目标器件内适配的成功。当设计者在工程的初始阶段规划和分配 I/O 引脚时,设计与目标器件和 PCB 特性的兼容性。因此,设计过程可以减少迭代次数,并且可以更快地开发出精确的PCB布局。
设计者甚至可以在定义设计文件之前规划 I/O 引脚。分配尚未在设计文件中定义的预期节点,包括接口 IP 核信号,并且产生顶层文件。顶层文件例化设计的下一层结构,包括存储器、高速I/O、设备配置等接口端口信息和调试工具。
通过名字或拖动到单元格,将设计元素、I/O 标准、接口 IP 和其他属性分配到器件的I/O引脚,然后产生顶层文件用于I/O验证。
使用I/O分配验证来完全分析I/O引脚与VCCIO、VREF、电迁移(电流密度)、同步切换输出(Simultaneous Switching Output,SSO)、驱动强度、I/O标准、PCI_IO钳位二极管和I/O引脚方向兼容性规则。Quartus Prime软件提供Pin Planner工具,用于查看、分配和验证器件I/O引脚的逻辑与属性。或者,设计者可以在Tcl脚本中或直接在HDL代码中输入I/O分配。
在Pin Planner中添加I/O约束条件的步骤主要包括:
(1)在Quartus Prime主界面主菜单下,选择Assignments->Pin Planner。
(2)弹出“Pin Planner”对话框,如图2.76所示。下面介绍一些术语。
图2.76 “Pin Planner”对话框
① 器件封装(以BGA为例)。
如图 2.77 所示,陶瓷或塑料散热器表面安装有 FPGA 芯片和 I/O 引脚或焊球。在引脚键合BGA示例中,铜线将检查焊盘连接到封装的焊球。
图2.77 BGA封装结构
在 Pin Planner 主界面主菜单下,选择 View->Show->Package Top 或 View->Show->Package Bottom,查看器件的顶视图(从上往下看)和底视图(从下往上看)。
② I/O组(I/O Bank)。
将 I/O 组中的 I/O 引脚分组,以分配 I/O 标准。每个编号的组有它自己的电源引脚,称为 VCCIO 引脚,用于高 I/O 性能。VCCIO 引脚指定的电压范围为 1.5~3.3V。每个组包含带有不同I/O标准的多个引脚。在一个组中的所有引脚必须使用相同的VCCIO信号。
在Pin Planner主界面主菜单下,选择View->Show->I/O Banks,查看不同的I/O组,如图2.78所示。
图2.78 Cyclone 10 GX器件内不同的I/O组(用不同的颜色和编号标识)
③ I/O引脚(I/O Pin)。
封装底部或者外围上的引线或小焊球。每个引脚都有一个字母行和列号,从不使用字母I、O、Q、S、X和Z。当超过时,重复字母,并且以字母A作为前缀。默认,显示所有I/O引脚。
④ 焊盘(Pad)。
I/O 引脚连接到位于硅片顶部金属层周边的焊盘。每个焊盘都用一个从 0 开始的 ID 编号,并在器件周围以逆时针方向递增。
在Pin Planner主界面主菜单下,选择View->Pad View,打开“Pad View”界面,如图2.79所示。
图2.79 “Pad View”界面(局部放大)
⑤ VREF引脚组(VREF Pin Group)。
一组引脚,包括电压参考I/O标准所需的一个专用VREF引脚。VREF组包含的引脚数少于 I/O 组。这样,可以保持 VREF 引脚的信号完整性。I/O 组中存在一个或多个VREF 组。VREF 组中的引脚存在于 I/O 组中。VREF 组中的引脚共享相同的 VCCIO 和VREF电压。
(3)在 Pin Planner 主界面底部的窗口中,以列表的形式给出了 Node Name(节点的名字),其中 Direction (方向)由综合后的网表得到,设计者不能在这里修改其方向,如图2.80所示。
(4)使用下列方式之一,确定“Node Name”一栏下每个逻辑端口在FPGA器件物理引脚的位置(使用C10-EDP-1硬件开发平台,参考附录给出的硬件原理图)。
图2.80 逻辑引脚与器件的物理引脚对应
① 双击“Node Name”一栏下每行节点所对应“Location”栏下的空白单元格,出现下拉框,设计者可以通过下拉框选择合适的引脚位置,也可以在单元格中直接输入引脚的位置。
② 选中“Node Name”一栏下的某一行节点,然后拖曳到图 2.78 内相应的引脚位置即可。
思考与练习2-8:在图2.78中查看每个逻辑端口在FPGA上具体物理引脚的位置,以及I/O组的编号。
(5)在“I/O Standard”一栏下为所有节点选择1.8V标准,这是因为该I/O组采用1.8V供电。
(6)在Pin Planner主界面主菜单下,选择File->Export…。
(7)弹出“Export”对话框。在该对话框中,将保存类型设置为“Tcl Script File (*.tcl)”,并将文件名命名为“Pin_constraint”,并用写字板打开该文件,可以看到其约束格式,如代码清单2-11所示。
代码清单2-11 Pin_contraint.tcl文件
(8)切换到Quartus Prime主界面中,在“Assignment Editor”界面中可以看到新添加的I/O约束条件,如图2.81所示。
图2.81 “Assignment Editor”界面
2.8.5 I/O分配分析
I/O 分配分析根据完整的 I/O 系统和电路板布线规则集来验证 I/O 分配的合理性。完整的 I/O 分配分析验证直接馈送到或由 PLL、LVDS 或千兆收发器块等资源馈送的块。此外,检查器验证VREF引脚使用的正确性、引脚位置和混合I/O标准。
在早期引脚规划期间运行 I/O 分配分析,在编译之前验证开始保留的引脚分配。一旦确定了设计文件,运行 I/O 分配分析以对综合网表执行更彻底的合法性检查。每当修改 I/O 分配时运行I/O分配检查。
适配器分配引脚以适应你的约束。例如,如果将边沿位置分配给一组LVDS引脚,则适配器会为指定边沿位置的每个LVDS引脚分配引脚位置,然后执行合法性检查。要显示适配器放置的引脚,在Pin Planner主界面主菜单下,选择View->Show->Show Fitter Placements。要接受这些建议的引脚位置,设计者必须对引脚分配进行逆向注解。
查看 I/O 分配警告报告,以查看和解决所有的分配警告。例如,警告某些设计引脚具有未定义的驱动强度或压摆率。适配器将未定义的单端输出和双向引脚识别未非校准 OCT。要解决警告,为报告的引脚分配电流强度和压摆率。或者,为引脚分配端接。当引脚有OCT分配时,设计者无法分配驱动强度或压摆率。
根据表2.12给出的I/O规则检查示例验证设计分配。
表2.12 I/O规则检查示例
信号切换噪声规则如表2.13所示。
表2.13 信号切换噪声规则
执行I/O分配分析的步骤主要包括:
(1)在Pin Planner主界面主菜单下,选择Processing->Start I/O Assignment Analysis,Quartus软件开始执行I/O分配分析。
(2)完成分析后,通过下面两种方法之一打开编译报告。
① 在“Tasks”窗口的“Compilation”标题栏下,单击“Compilation Report”选项。
② 在“Compilation Dashboard”界面中,单击“Plan”右侧的按钮。
(3)弹出“Compilation Report-top”界面,如图2.82所示。
图2.82 “Compilation Report-top”界面
① I/O Rule(I/O规则)部分包括I/O Rules Details(I/O规则细节)、I/O Rules Matrix (I/O 规则矩阵)、I/O Rules Summary(I/O 规则总结),它们列出了关于测试 I/O 规则的总结、细节和矩阵信息。
图 2.82 的右侧窗口中指示规则是否 Pass(通过)、Fail(失败)、或 Unchecked(没有检查)。严重等级表示规则对有效分析的重要性。“Inapplicabe(不适用)”规则不适用于目标器件系列。
② I/O Assignment Warnings(I/O分配警告)列出了每个引脚生成的警告信息。
③ Resource Section(资源部分),具体包括Input Pins、Output Pins、I/O Bank Usage等信息,用于定量显示各种引脚类型和I/O组的使用。
2.8.6 添加简单的时序约束条件
本节将介绍.sdc文件及优先级,以及添加简单的时序约束的方法。
1..sdc文件及优先级
设计者必须将自己创建的.sdc 文件添加到工程中,以便在适配和时序分析时读取它。适配器和时序分析器按.sdc 文件在.qsf 文件中出现的顺序来处理它。如果.qsf 文件中没有出现.sdc文件,则Quartus Primer软件会在工程目录中搜索名字为<current revision>.sdc的.sdc文件。
设计者可以在Quartus Prime软件主界面主菜单下,选择Settings->Timing Analyzer,以添加、删除或更改工程中.sdc文件的处理顺序。
如果使用Quartus Prime文本编辑器创建.sdc文件,则在保存文件时默认使能“Add file to the project”(添加文件到工程中)选项。如果使用其他编辑器创建.sdc文件,则必须将该文件添加到该工程中。
.sdc 文件仅包含时序约束命令,用于操作时序网表或控制编译的 Tcl 命令必须位于单独的Tcl脚本中。
本节将添加 create_clock 约束,该约束允许设计者定义设计中时钟的属性和要求。设计者必须定义时钟约束以确定设计的性能并限制进入FPGA的外部时钟。设计者可以在时序分析器图形用户接口(Graphic User Interface,GUI)中输入约束,或者直接在.sdc文件中输入约束条件。
注
如果在命令行中键入 read_sdc 命令而没有任何参数,则时序分析器会读取嵌入在HDL文件中的时序,然后遵循.sdc文件的优先级顺序。
2.添加简单时序约束
下面将为该设计添加简单的时序约束条件,主要步骤包括:
(1)在Quartus Prime主界面主菜单下,选择File->New…。
(2)弹出“New”对话框。在该对话框中,展开 Other Files。在展开项中,选择Synopsys Design Constraints File。
(3)单击“OK”按钮。
(4)按“Ctrl+S”组合键,将该文件保存为Timing_constaint.sdc,并关闭该文件。
(5)使用下面的方式之一启动时序分析器(Timing Analyzer)。
① 在 Quartus Prime 主界面的“Tasks”窗口的“Analysis”标题栏下,找到并用鼠标左键单击“Timing Analyzer”。
② 在 Quartus Prime 主界面主菜单下,选择Tools->Timing Analyzer。
(6)启动 Timing Analyzer(时序分析器)主界面。在该主界面主菜单下,选择 Netlist->Create Timing Netlist…。
(7)出现“Create Timing Netlist”对话框,如图2.83所示。在该对话框中,单击“OK”按钮。
图2.83 “Create Timing Netlist”对话框
(8)在Timing Analyzer主界面主菜单下,选择Constraints->Create Clock…。
(9)弹出“Create Clock”对话框,如图 2.84(a)所示。在该对话框中,设计者可以指定时钟名字(Clock name,-name)、时钟周期(Period,-period)、波形边沿(Waveform edges)上升(Rising)和下降(Falling)的值,以及应用于约束的目标信号(Targets)。
在该设计中,按如下设置参数。
① Clock name:clk1.
② Period:10.000ns.
③ 单击“Targets:”右侧的按钮,弹出“Name Finder”对话框。在该对话框中,单击“List”按钮。在左下方窗口中列出了 9 个信号,选中 clk,然后单击按钮,将该信号添加到右侧的窗口中,如图2.84(b)所示。
图2.84 “Create Clock”和“Name Finder”对话框
(10)单击“OK”按钮,退出“Name Finder”对话框。
(11)在“Create Clock”对话框的“SDC command:”右侧的文本框中给出了创建时钟的SDC命令格式为“create_clock-name clk1-period 10.000 [get_ports{clk}]”。
该约束将时钟的频率约束为最少100MHz(period为10.000ns)。
(12)单击“Create Clock”对话框中的“Run”按钮,退出该对话框。
(13)在 Timing Analyzer 主界面底部的窗口中,在“tcl>”提示符后,给出并运行了该条tcl命令,如图2.85所示。
图2.85 运行create_clock命令
注
在时序分析器中定义的约束直接应用于时序数据库,但不会自动转移到.sdc文件。因此,需要选择Write SDC File命令,以将GUI中的约束变化保留到.sdc文件中。
(14)通过下面方式之一,将tcl命令写到.sdc文件中。
① 在Timing Analyzer左下方的“Tasks”窗口中,找到并单击“Write SDC File…”,如图2.86所示。
② 在Timing Analyzer主界面主菜单下,选择Constraints->Write SDC File…。
(15)如图2.87所示,弹出“Write SDC File”对话框。在该对话框中,通过单击“SDC file name:”右侧的按钮,定位到前面创建的 Timing_constraint.sdc 文件。从该对话框中可知,写.sdc文件的Tcl命令为“write_sdc-expand"Timing_constaint.sdc"”。
图2.86 “Tasks”窗口
图2.87 “Write SDC File”对话框
(16)单击“OK”按钮,退出“Write SDC File”对话框。
(17)退出Timing Analyzer主界面。
读者可以打开 Timing_constraint.sdc 文件查看时钟约束的脚本命令(后面会详细介绍时序约束),如代码清单2-12所示。
代码清单2-12 Timing_constraint.sdc文件