备赛集创赛,用的是紫光同创的PGL22G开发板,做Tof激光雷达点云预处理,逻辑写完后在PDS里布局布线,时序报告显示关键路径违例严重,slack是负的。代码里已经用了流水线,但还是收敛不了。想问问用过紫光PDS的大佬,国产EDA的时序收敛和Vivado差别大吗?有没有什么针对PDS的优化技巧,比如跨时钟域约束写法、PLL配置或者布局区域的约束?
2026年了,FPGA大赛用国产紫光同创板子做Tof激光雷达点云处理,PDS软件布局布线后时序收敛不了,怎么优化?
4 个回答

先别急着怪PDS,Vivado和PDS的时序收敛思路确实有差别,但核心问题往往在约束写法和代码风格上。你提到代码里已经用了流水线,建议先确认一下是不是所有跨时钟域都显式约束了。PDS对set_clock_groups -asynchronous的支持比Vivado弱,常见坑是它只认你写在SDC里的约束,如果你只在顶层约束了PLL输出,内部生成的时钟没单独声明,工具就会按最悲观路径算,slack自然难看。另外,你用的PGL22G逻辑资源不多,如果关键路径是跨了几个大模块的组合逻辑,试试在PDS里打开Floorplan视图手动把相关模块摆近点,这个对国产工具特别有效,比调综合选项立竿见影。还有一招:把综合优化级别从高降到中,有时候工具为了面积拼命合并逻辑,反而把关键路径拉长。最后,如果真压不住,把流水线级数从3级加到5级,代价是延迟多两拍,但对点云预处理这种流式数据完全能接受。你先看看时序报告里违例路径是跨时钟域还是纯组合逻辑吧,这俩修法完全不同。

这条我多说点,因为国产EDA的时序收敛其实是个系统工程,不是单点优化能解决的。PGL22G这个器件规模不大,但Tof点云预处理涉及的数据位宽和运算量都不小,我猜你的关键路径大概率出现在某个乘法器或者大位宽加法器上。PDS和Vivado最大的差别在于,Vivado的智能布局引擎会主动帮你重定时,而PDS更依赖你手动指定区域约束,所以你得养成看Floorplan的习惯。具体做法是:先跑一次完整布局布线,在时序报告里找到最差路径的起点和终点单元,然后在PDS的Floorplan窗口里用鼠标框选这两个模块的物理区域,把它们拉近,甚至可以叠加一部分,再重新布局。这个操作对国产工具非常有效,因为它的布局算法对逻辑聚簇的敏感度比Xilinx高。另外,PLL配置也要注意,如果你的点云数据是多个通道并行采样,不同通道的时钟相位差会直接体现在时序路径上,建议把所有PLL输出都设为同相位,别用可调相移,否则工具会额外计算时钟偏斜。时钟约束方面,我建议你显式声明所有异步时钟组,哪怕你觉得某些时钟本来就不相关,PDS不会自己推断,漏一条它就按同步路径算,白白增加收敛难度。最后说个容易忽略的点:PDS的时序报告里有一个'互连延迟占比'的指标,如果超过70%,说明布线拥塞是主因,这时别调逻辑了,去检查是不是某个区域塞了太多LUT,手动把部分逻辑挪到空闲区域,比改代码见效快得多。备赛时间紧的话,先抓最差路径,别追求全绿,把违例最严重的几条压到临界值,评分就能上去。你现在的违例是集中在一条路径还是分布在多条路径?前者手动布局能救,后者得从代码结构动刀了。

PDS就这脾气,别拿Vivado的思维套。先set_clock_groups -asynchronous把异步时钟全隔开,再手动布局拉近关键模块,比调综合选项靠谱。你PLL输出相位设一致了吗?不一致的话时序报告会虚高。

其实你这个问题,我当年在集创赛也踩过一模一样的坑。PGL22G做点云预处理,说白了就是资源不大但数据吞吐要求高,时序收不了不一定是代码烂,很可能是PDS的约束解析方式和Vivado差太多。你先别急着调流水线,第一步去SDC里把所有PLL输出和异步接口都明确写上set_clock_groups -asynchronous,注意是每个时钟域对都分开写,别只写一组。PDS有个毛病,它不会像Vivado那样自动推断异步关系,你漏一个它就按最坏情况把所有路径都当同步路径去算,slack当然负得离谱。写完约束再跑一次布局布线,如果还不行,打开Floorplan视图,找到时序报告里最差的那条路径,看看起点和终点单元在物理上隔了多远——很多时候就是综合器把两个相关模块放得太散了,你手动框选拉近一点,重新布局,效果立竿见影。另外可以试试把综合优化级别从高调成中,PDS有时候为了省面积拼命做逻辑合并,结果把关键路径上的级数拉得很长,反而得不偿失。如果以上都做完还是负的,那再考虑把流水线拆细,比如原来3级改成5级,在中间插寄存器重定时。最后提醒一句,PDS的综合结果和布局结果有时候差异很大,你多看几轮布局后的时序报告,别只看综合后的预估。你现在的PLL相位配置是用的默认吗?如果多通道采样时钟相位没对齐,时序报告会虚高,实际布局后更差。
发表回答
登录后可在本页底部提交回答