quartus24.1版本子模块因时钟问题无法综合通过,FPGA过OOC问题复盘
因为只负责一个子模块,所以需要单独对该子模块进行综合和过OOC,这时候已经有一些加虚拟pin文件,敲命令让子模块能过OOC的方法。但这个方法的前提是先过综合,然后再敲命令让虚拟管脚命令成功,最终可以过OOC。
今天负责的这个模块的一个输入时钟是某个IP核的输入,所以这个IP核对这个输入时钟有要求限制。要求必须是PLL IP的输出时钟才可以。所以这个项目总工程能综合通过,但子模块却卡在了综合这里,一直过不了。我呢,太懒,不想改代码。琢磨了一天也没想出来咋办。
最后领导建议了。
方法一:自己在这个子模块基础上加个top,然后加上PLL IP,然后把这个时钟输出在作为输入接入子模块。这方案当然不是我想要的,哈哈。就不想写代码。
方法二:直接把整个工程跑综合,过了就算通过了。等于不再单独对这个子模块进行OOC检查了。
OOC:概念,out of context 的缩写
上下文无关综合。
这种概念我是来这家公司才知道的,因为之前公司整个项目都是自己做,不涉及子模块问题,但现在公司很系统很细节很螺丝钉,只负责子模块,就有OOC的环节,之前我一直以为就是整个项目跑实现implementation的意思。原来这个OOC是模拟这个过程,在不分配管脚的情况下。
官方解释:FPGA设计通常由多个模块组成,传统综合是将整个设计作为一个整体进行处理。而OOC综合允许独立地对设计中的各个模块进行综合,每个模块的综合过程不依赖于整个设计的上下文信息。
我可是够懒的了,做了好几年了,才理解这个词啥意思……
作用:
提高综合速度:当FPGA设计规模庞大,结构复杂时,整体综合会消耗大量的时间和系统资源。采用OOC综合,不同模块可以并行处理,(也就是不同模块负责人各干各的不用互相等),大大缩短了综合的总时间。例如,一个包含多个复杂IP核和自定义逻辑模块的大型FPGA设计,对各个模块分别进行OOC综合能显著提高效率。很显然小项目可能用不上,大项目甚至是芯片设计的那种可能会用上这种精细的工作。
优化模块性能:在独立综合每个模块时,可以针对该模块的特点进行更精细的优化设置。比如对于一个对时序要求极高的模块,可以单独为其设置更严格的时序约束和优化策略,而不受其他模块的影响,从而提升该模块的性能。
便于模块复用:通过OOC综合得到的模块具有更好的独立性和可移植性。在不同的设计项目中,如果需要复用某个模块,只需将该模块及其相关的OOC综合结果导入即可,无需重新对整个设计进行综合。
使用方式:
模块标记:在设计代码中,需要明确标记哪些模块要进行OOC综合。不同的FPGA开发工具标记方式可能有所不同。例如,在vivado中,可以通过设置属性来指定某个模块为OOC模块。
就我的经验而言,vivado开发这个过程比较容易,在设置中综合设置里面加上命令-mode out_of_context
具体是tools-settings-synthesis more options中输入
-mode out_of_context,然后implementation通过就等于过了OOC单独模块的无上下文综合。
而intel的quartus需要一些脚本操作来完成,相对复杂了一点。需要linux人来配合写个脚本啥的
2025.02.07
好啦!这次经验写到这里。说点题外话,这几年我一直没来写,原因是我进了一家外企,安全管理过于严格,电脑随时被监控,我不敢登录这里。最近打算离职了,突然试了一下,电脑上登录了,结果给我发邮件说我在韩国登录了该博客,吓死我。赶紧退出。所以现在是用手机登录来写的,比较麻烦。
这几年也学到了很多,其实如果电脑不被监控,我也会留下很多经验给大家分享,我是个记忆力极差的人,做完就忘。导致我一直有记录的习惯,下次再遇到就来翻一翻。可是这两年多的经验就失传了,遇到很多问题,但无法写下来,也带不出去公司,电脑u盘都不让带,我又记不住,面试的时候把我问的一愣一愣的,好像我是个骗子,都是编的经历一样,其实真的是做过但忘记了,所以人记性差真的吃亏啊。
面试也是给我说我技术深度不够……目前自卑的很。
简单的看到大家给我的评价,很高兴能帮助到大家,大家问我的问题可能也是很久了有些细节我自己也忘了,就不回复了。如果新工作保密要求不高我会再来分享经验的