ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

紫光同创FPGA开发实战:PDS约束文件与引脚配置全流程详解

紫光同创FPGA开发实战:PDS约束文件与引脚配置全流程详解 国产FPGA圈子里提到紫光同创很多从Xilinx或Intel切换过来的工程师第一反应是“软件会不会很难用”。我最初也抱着这个顾虑直到完整跑了一遍紫光同创PDSPango Design Suite从建工程、写约束、配引脚到下载验证的流程才确认这套工具链的完成度已经相当在线。这篇内容不打算做功能介绍式罗列而是围绕约束文件和引脚配置这条最容易被忽略、也最容易返工的主线把我在实际项目中踩过的坑和验证过的操作顺序完整梳理一遍。如果你正准备上手紫光同创的FPGA开发板或者已经在用但对时序约束、引脚分配还处于“能跑就万事大吉”的状态这篇文章应该能帮你少走不少弯路。整个开发流程中很多人仿真一过就直接点“综合”和“布局布线”等到板子上的灯不亮、信号乱跳才回头找约束问题。这种打法不仅浪费时间还会让你误判是逻辑写错了还是约束没配好。实际上约束文件在紫光同创工具链里扮演的角色比很多人想象中更重要——它既是逻辑设计和物理实现的桥梁也是保证时序收敛和引脚正确性的唯一依据。1. 为什么紫光同创的PDS值得单独学一遍紫光同创目前的FPGA产品线覆盖了Titan系列、Logos系列和部分车规/SOC型号PDS软件就是围绕这些器件开发的集成设计环境。很多刚从Intel或Xilinx生态转过来的工程师习惯性拿着原来的思路套用结果在License激活、约束语法、IP生成方式这些环节上撞了一鼻子灰。1.1 软件安装与License激活的隐藏细节PDS安装本身不复杂但License激活是第一个容易卡住的点。和很多商业EDA工具类似紫光同创的License是和计算机硬件信息绑定的通常绑定MAC地址。你需要先安装软件然后在本机生成一个机器码文件发回官方或代理商换取正式的License文件再导入到软件里。这里有个容易踩的坑有些人为了方便先在虚拟机或者远程服务器上安装再拿License去激活结果发现机器码对不上。因为License绑定的是网卡的物理地址虚拟机的MAC和物理机不一致激活就会失败。实际项目里建议直接在开发用的物理机上完成激活流程并且在更换网卡或主板之后也要记得重新申请License。激活成功后建议顺手确认一下软件版本和器件库是否同步。紫光同创FPGA的型号后缀比如速度和温度等级不同对应的封装和资源也有差异PDS的器件列表里如果选错了具体型号后面生成引脚约束时会发现封装引脚全部对不上这种错误越早发现越好。1.2 熟悉PDS的工程组织方式PDS的工程管理逻辑和主流FPGA工具类似一个工程由三类核心文件组成逻辑源代码文件、约束文件、以及IP核相关文件。源代码文件就是常见的Verilog/VHDL约束文件则分成时序约束和物理引脚约束两大类。很多初学者搞不清“约束文件”到底指什么其实PDS里有一套统一的约束体系时序约束用SDCSynopsys Design Constraints语法风格引脚约束则可以通过图形界面操作自动生成也可以手写约束文件。理解这个区分很重要时序约束管的是“信号在什么时候到达”引脚约束管的是“信号从哪个物理引脚进出”。两者互相关联但职责不同后面章节我会分别展开。从工程流程来看PDS支持从RTL设计直接走到综合、布局布线、生成bit流、下载调试的完整流程。它内部集成的逻辑综合器、布局布线器、时序分析引擎都针对紫光同创的FPGA架构做了适配所以用起来不需要在多个第三方工具之间来回倒腾文件。这一点对团队协作和版本管理来说很友好一个工程文件包就能完整复现整个设计。2. 工程创建与RTL设计阶段约束的思想需要提前介入很多人以为约束文件是等到综合前才开始写的这是一个典型的认识误区。在实际项目中约束设计应该在RTL编码阶段就同步进行尤其是引脚约束必须在原理图设计阶段就确定下来否则后端一旦需要改动引脚PCB改版成本极高。2.1 新建工程与器件选型在PDS里新建工程核心动作是选择具体的目标器件型号。你真的不要只选到“Titan系列”或“Logos系列”这种粒度一定要精确到完整型号因为不同封装的可用IO数量、Bank分布、GTP/SerDes资源位置都不一样。选错型号之后哪怕代码不用改布局布线阶段也会报出一堆引脚或时钟资源不匹配的错误。器件选型的同时PDS会要求设定工程的顶层模块名称这个顶层名最好和你的顶层Verilog模块名保持一致不然综合后做网表检查时容易出一些莫名其妙的警告。2.2 在设计文件里预先整理信号清单在写Verilog之前我习惯先做一张信号表格列出所有顶层端口信号的方向、位宽、电平标准、所属Bank、希望的物理引脚编号。这张表看起来是文档工作但它的价值在后续做引脚约束时才会真正体现出来尤其是当一个设计有上百个IO时没有这张表你在PDS的引脚规划界面里会瞬间迷失。整理信号清单时需要关注的几个要素包括信号名、方向、电平标准如LVCMOS33、LVCMOS18、LVDS、是否差分对、是否全局时钟输入、是否高速SerDes信号、是否需要上下拉。这些要素直接决定后续引脚约束的具体写法。其中最容易忽略的是全局时钟输入。FPGA内部有专用的全局时钟网络用来降低时钟偏斜、提高时序性能普通的普通IO不具备这个能力。时钟信号如果随便分配到一个普通IO时序收敛时会非常痛苦甚至直接导致约束无法满足。所以在整理信号清单时就要提前查清楚目标FPGA的全局时钟引脚位置把时钟信号预先锁定到这些专用引脚上。2.3 从代码规范角度为约束铺路如果你在RTL代码里用了大量的genvar循环和复杂组合逻辑后端的时序收敛难度会明显增加。这些和约束文件看起来无关但实际上关系到时钟约束能否满足。PDS的时序引擎要求设计里每个时钟域都要有明确的时钟源你最好在代码阶段就保证每个时钟信号来自时钟引脚或PLL输出而不是用组合逻辑做出来的门控时钟。组合逻辑门控时钟容易产生毛刺时序约束时也不好约束综合器处理起来会有更多不确定性。我在写紫光同创相关项目时会尽可能把时钟信号单独声明成wire不走数据通路的复用电线这样后续创建约束时逻辑更清晰。另外对于跨时钟域的模块建议在RTL阶段就明确打拍同步的位置这也能让约束阶段排除这些路径时更有针对性。3. 时序约束文件不是写给软件看的是写给“真实时序”看的时序约束在很多人看来是工具链最枯燥的部分但恰恰是决定设计能否稳定跑起来的关键。紫光同创PDS使用SDC风格的约束语法大部分主流的时序约束命令都支持。如果你用过其他FPGA工具会发现这里的语法风格很亲切。3.1 时钟约束一切时序分析的基准时钟约束是整套时序约束的核心。FPGA综合和布局布线后的时序分析本质上是去检查所有触发器的建立时间和保持时间是否满足要求。而要判断是否满足软件必须知道时钟的周期是多少、占空比是多少、从哪个端口进来。最基本的时钟约束长这样create_clock -name sys_clk -period 20.0 -waveform {0 10} [get_ports clk]这条命令的意思是在名为clk的顶层端口上定义一个周期20ns也就是50MHz、占空比50%的时钟信号sys_clk。-waveform {0 10}表示上升沿在0ns时刻下降沿在10ns时刻。如果你用的是PLL或DCM产生的内部时钟就不需要对内部网表手动创建时钟PDS通常会自动从PLL约束中推导出输出时钟。但在某些场景下PLL输出没有自动传递到时序分析器你就需要在PLL输出引脚上手动创建约束。这里有个查看方式在约束编辑器里跑一下时钟报告如果发现内部时钟缺失再手动补上。3.2 输入输出延迟约束很多人把时钟约束做完就觉得万事大吉其实输入输出延时约束才是真正决定数据能否被正确采样的关键。那些定位“约束了但不收敛”的设计十有八九是IO延时没有给准。输入延时约束描述的是外部芯片输出数据相对于FPGA时钟边沿的延时输出延时约束描述的是FPGA输出数据相对于时钟边沿传到下游芯片满足建立保持时间所需要的时间。在实际项目里这些值通常根据数据手册或者总线协议来计算。set_input_delay -clock sys_clk -max 5.0 [get_ports data_in] set_input_delay -clock sys_clk -min 2.0 [get_ports data_in] set_output_delay -clock sys_clk -max 4.0 [get_ports data_out] set_output_delay -clock sys_clk -min 1.0 [get_ports data_out]如果拿不准输入延时是多少最稳妥的办法是查看上游芯片的数据手册中关于数据建立、保持时间和时钟偏移的参数用公式算一遍。不要拍脑袋填一个值因为约束给得比实际偏松板子刚跑没问题温度变化或换一颗芯片后就可能偶发数据错误。3.3 跨时钟域约束该排除的路径要大胆排除实际设计中存在多个时钟域时不同的时钟域之间通信的信号通常不需要做严格的时序收敛因为异步跨时钟域本身就不保证时序。这个时候如果在SDC里不做任何处理工具会把跨时钟域的路径当作同名或相关时钟域的同步路径来分析导致大量时序违例而这些违例你根本无法通过优化逻辑来解决。正确的做法是把异步路径明确排除掉set_clock_groups -asynchronous -group {clk_a} -group {clk_b}这条命令告诉时序引擎clk_a和clk_b是异步关系它们之间的路径不需要做跨时钟域的时序收敛。前提是你的RTL代码里确实已经做了异步处理比如两级触发器同步或者FIFO同步否则单纯在约束里排除路径就是掩耳盗铃。类似的还有set_false_path用于屏蔽那些不关心时序的路径比如测试模式下的一些信号。但使用set_false_path要克制用得过多会掩盖真实问题。3.4 时序报告怎么看约束写完后一定要在布局布线完成之后打开时序报告确认每个时钟域的最高工作频率是否满足要求。PDS里会给出建立时间、保持时间以及WNS最差负裕量、TNS总负裕量这些指标。WNS为负数说明至少有一条路径的建立时间不满足这时可以双击路径查看是哪一级组合逻辑延迟过大再去优化代码或调整约束。这里有一个常见的误判有些人看到WNS是正数就觉得设计完全没问题忽略了保持时间违例。保持时间违例在低速设计中不易暴露但在高低温或电压波动时很容易出现需要特别注意。4. 引脚配置实操从原理图到约束文件引脚配置是整个环节中最直观也最容易出错的部分。紫光同创的PDS提供了引脚规划的图形界面但理解背后的逻辑比学会点击更关键。4.1 I/O Bank和电平标准的选择逻辑FPGA的引脚是按照Bank组来划分的每个Bank内部共用一套参考电压VCCO也支持一组IO电平标准。你在分配引脚时必须保证同一Bank里的信号电平标准和Bank的VCCO一致。比如某个Bank的VCCO接的是3.3V那这个Bank里的IO只能分配LVCMOS33这种3.3V电平标准的信号强行分配一个LVCMOS18的信号板子上的电平就会出错。这个约束是硬约束不是软件建议。引脚约束阶段报出的Bank电压冲突往往意味着你的PCB原理图设计时没有规划好Bank的电源分配。所以我一直强调FPGA的引脚分配一定要在硬件原理图设计阶段就会同软件工程师确认而不是等PCB做完了再手工调整约束。4.2 差分引脚和普通GPIO的处理如果是LVDS、LVDS25这类差分信号标准PDS会自动要求你分配P端和N端两个引脚。在引脚规划界面通常只需要指定P端或者指定一对引脚中的一个软件会自动关联出对应的N端。不过手动写约束时要确保P和N的引脚号与你选用的器件封装一致特别是器件引脚密集的BGA封装很容易把P/N搞反。普通GPIO则需要注意驱动能力、上拉下拉、摆率等参数。PDS中这些参数可以在IO配置里调节。驱动能力过小会导致信号边沿变缓过大会引起过冲和EMI问题。一般的板级设计习惯是板内低速控制信号用默认的驱动强度外界高速并行总线再仔细调整。4.3 在PDS GUI里完成引脚分配的完整流程把工程切换到综合后的视图具体界面叫“引脚规划”或“I/O Planning”这类布局你可以看到封装视图列出所有可用的引脚也可以从设计层次结构里看到所有顶层端口信号。手动逐个绑定信号和引脚效率很低我的做法是直接导入一个写好的引脚约束文件或者粘贴引脚分配表格。手动分配引脚时要特别留意几个关键位置全局时钟引脚、复位引脚、配置相关引脚如JTAG、以及高速收发器引脚。这些引脚通常有不同的命名前缀或专用位置不能随意占用。如果你的设计没有外部复位输入可以把复位信号直接分配到一个普通按键对应的引脚如果你用的是内部复位那顶层端口列表里就不会出现复位脚。4.4 引脚约束文件的文本写法除了GUI引脚约束文件也可以直接文本编辑。在PDS工程里约束文件的语法体系允许你在一个文件里同时写引脚位置和IO属性。下面是一个简化示例用来展示常用语法具体命令风格以PDS对应版本手册为准set_pin_assignment {led[0]} {LOC R16, IO_STANDARD LVCMOS33, DRIVE 12} set_pin_assignment {clk} {LOC K17, IO_STANDARD LVCMOS33, PULL_MODE NONE}这段写法的大意是把名为led[0]的信号分配到R16引脚电平标准LVCMOS33驱动电流12mA把clk信号分配到K17引脚电平标准LVCMOS33不接上下拉。文本方式对批量修改和版本评审很友好。在多人协作时把引脚约束文件提交到版本管理里每次变更都有迹可循比在图形界面里手动点更加可靠。4.5 一句话说透“约束文件”的本质到这里你应该能理解约束文件到底是什么了。它并不是某个神秘的工具专有格式而是一套用文本描述设计物理实现意图的语言。时序约束描述的是信号在时间维度上的要求引脚约束描述的是信号在物理空间维度的位置和电气属性。二者合在一起再加上工程里的逻辑代码才构成一个可以完整变成bit流的FPGA设计。5. 综合和布局布线之后我发现的问题前面几步做扎实了综合和布局布线其实只是等待过程。真正考验人的是跑完后面对报告和警告的处理。5.1 未分配引脚的“连锁反应”一次我给一块紫光同创Logos系列的板卡写LED流水灯Demo心想这种简单设计总不会出问题于是一开始就没写引脚约束直接让综合器自动分配引脚。结果综合过了布局布线也过了但下载到板子上LED没有任何反应。后来连接逻辑分析仪才发现信号根本没有出现在我预期的那些引脚上而是被工具随机分配到了其他地方。这个教训很直接FPGA工具不能替你决定物理引脚它只会“随便”给一个不冲突的位置。除非你的设计完全不需要连接外部硬件否则每个顶层IO都必须显式约束。自动分配只适合做逻辑仿真验证不适合上板测试。5.2 约束文件语法检查的重要性PDS对约束文件语法错误会直接报错并停止布局布线但有些错误不会很直接比如引脚名写错、信号名和顶层端口不匹配。这些错误通过软件自带的约束检查功能可以发现跑一遍“Check Design”或约束报告通常会定位到具体行号。我建议在约束文件比较大的时候每修改几个引脚就立刻运行一次约束检查不要等到最后集中导入。集中导入时一旦报错几十个错误堆在一起很难判断哪些是连带影响。5.3 布局布线后时序违例的排查流程布局布线完成后如果出现时序违例不要急着改代码先看违例发生在哪个时钟域、哪条路径。双击违例路径可以看到从起点触发器到终点触发器的完整逻辑路径和每段延迟。高延迟通常来自组合逻辑链过长、扇出过大或者布局距离过远。这时有几个手段可以尝试一是优化代码拆分组合逻辑插入寄存器流水二是调整PLL输出时钟频率看看是不是某个中间时钟频率过高三是给相关模块添加布局约束缩短关键路径的物理距离。多数情况下RTL层面的流水线拆分是最有效的办法。6. 下载到板卡并验证从bit流到逻辑分析仪所有约束和布局布线都通过后最后一步是生成bit流文件并下载到FPGA里。紫光同创PDS支持通过JTAG方式连接下载器在软件界面里打开器件管理器选择目标FPGA点击下载即可。6.1 下载失败的常见原因下载失败最常见的原因是JTAG链路问题。检查下载器驱动是否正确安装确认JTAG链路上是否有多个器件导致地址选择错误再确认FPGA的配置引脚模式跳线是否正确。PDS在检测不到器件时通常会给出提示根据提示逐步排查即可。另一个容易被忽略的原因是bit流文件和器件型号不匹配。你综合时选的器件型号如果和板卡上的实际型号不一致下载器虽然能识别FPGA但写入后可能完全没有功能。因此下载之前最好在工程信息里核对一下当前器件型号和实际板卡型号。6.2 用在线逻辑分析仪查信号PDS集成了一套在线逻辑分析仪不需要额外外接仪器就能观察FPGA内部节点信号。使用时在工程里例化一个调试核选择要观察的信号和触发条件重新生成bit流并下载。之后通过JTAG把数据采样回来在上位机界面里看波形。这一步对验证引脚配置是否正确非常有用。比如你通过UART发送一个数据如果在线逻辑分析仪能看到内部发送状态机的跳转但示波器在输出引脚上测不到波形那问题多半出在引脚约束或电平标准上而不是逻辑本身。6.3 硬件实测时需要盯的几个点上电实测时我会按顺序观察几个指标首先是电源轨是否正常其次是配置完成引脚DONE是否变高再是全局复位是否能正常复位所有状态最后才是通信数据是否正确。如果配置完成后FPGA没有运行起来检查时钟引脚有没有波形如果时钟正常但功能异常检查复位时序和异步信号同步电路。约束阶段常犯的一个问题是我在文章开头提到的复位信号处理。如果外部复位信号没有经过异步复位、同步释放处理直接异步复位到FPGA逻辑里很容易在释放时产生亚稳态导致某些触发器复位成功、某些没有复位成功。这个问题在仿真阶段很难暴露但在上电实测时不定期出现排查起来极其消耗时间。7. 多DIE器件和复杂工程需要注意的约束差异近年FPGA容量越做越大紫光同创的部分高端器件也引入了多DIE架构。多DIE的FPGA内部不同DIE之间通过专用互联通道通信在约束上比单DIE多了很多要考虑的因素。如果你使用的是这类大容量器件引脚约束上需要特别注意不同DIE对应的Bank范围和高速互联资源位置。PDS会在器件资源报告里注明各DIE的时钟区域和引脚归属。设计跨DIE时跨DIE路径的时序分析和普通路径不同约束时要给足余量。建议在项目早期就通过资源规划视图确认逻辑放置是否合理尽量避免关键路径跨DIE摆放。对于普通入门用户单DIE器件仍然是学习和实践的主流选择但提前了解多DIE约束差异至少在选型时不会被数据手册里的术语吓到。等到真需要做大规模并行处理或大容量存储接口设计时你已经知道约束重点在哪里。8. 我对紫光同创FPGA入门路径的实际体会从最初接触紫光同创的工具链到现在我的建议是不要拿它和用了十几年的老牌工具链做简单对比而是沉下心来走一遍标准流程重点吃透两件事——时序约束怎么写、引脚约束怎么和原理图对应。这两件事通了整个FPGA开发流程可以说已经掌握了七成。如果你现在刚拿到开发板我建议你按这个顺序练习先写一个简单的点亮LED的工程不复用任何别人的工程模板从新建工程、芯片选型、写约束、配引脚到生成bit流全部自己走一遍。然后再做一个按键控制LED翻转的小实验把输入输出延时约束也加进去看看时序报告里发生了什么变化。最后试着用在线逻辑分析仪抓按键的抖动信号体验一下从软仿真到硬件调试的转换过程。这一套完整走下来之后紫光同创FPGA对你来说就不再是一个陌生的工具而是一块可以放手折腾的开发阵地。后续无论是做图像采集、接口转换还是电机控制都有了最基本的自主排查和设计能力。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进