项目启动的时候,我直接把手里的文档扔在桌上说“别看了”,直接从推箱子版的 FPGA 启动。

这行代码本来写得挺规整,全是教科书味儿,但换了我这脑子就把变量改成了即时内存,连调试器都按错了顺序,结局直接让编译器崩溃。 FPGA 项目压根儿不是按部就班跑通流水线的。最启动我尝试用 VHDL 写个计数器,结局参数一多,编译工夫直接撑到凌晨三点,那时候我质疑是编译器忒蠢,还是我的编译器配置有难题。

后来换了 Systemverilog,难题没消亡,反而出于少了约束而报错,报错信息跟吵架似的,气得我在 IDE 里敲了一夜。

最终,我被迫在脑海里给存器加满了约束,把时钟域转换写成了内联逻辑,这才勉强让项目跑起来。 硬件设计阶段,最头疼的不是逻辑,是跟物理实现的差距。我设计过一个 4 位加法器,逻辑上挺好办,但一放到工具链里, AUTORANGE 就疯狂提升,根本摆不进去。

那时候我还在想是不是模型忒烂,结局一查模型,发现真值表乱飞,根本没法预测延迟。

后来我把模型从真值表换成了行为级描述,配合 DRC 和 UDB 强行限制,反而反而绕了个弯子,结局工具链把模型里的寄存器插满了,害得整个项目跑不动,只能重新仿真。 真值表是 FPGA 设计的噩梦,特别是多变量时候。

比如我要做个 3 变量解码,变量有 8 个,真值表就是 256 行,这时候要是加任何略微复杂的逻辑,行数瞬间爆炸,仿真速度都降不下来。

那会儿我习惯用系统级仿真跑几天,但那个慢得像秒针,每次跑完都要等几个小时,根本没法迭代。

后来干脆拉倒真值表,改用行为级描述直接推仿真,省去了无数行数据,起码能跑得快,别看代码长了点,但好歹能干活。 时序约束搞不好还能管住,但博根约束(Boson Constraints)就是个无解的难题。

明明结构图看着完美,一跑工具就报错,说不通哪儿。我试过用 lpm 工具搭建一个假的模型,结局还是不中,出于工具根本不知道具体的时序逻辑。最终只能硬着头皮在约束文件里塞一堆死数据,祈祷工具能看懂,结局每次都是“毛病:参数超出范围”这种废话。 数字电路的复杂度一旦上去,仿真难度就不堪一击。某些复杂的逻辑门,要是模型忒复杂,仿真根本跑不完,就连卡死在某个中间状态。

这时候我只能把模型简化,要么干脆写代码直接跑模拟,别看慢,但好歹能看看波形。

后来干脆拉倒了仿真,直接走综合,利用工具生成的约束把模型拉下来,省去了无数次模型重构的折腾。 性价比这东西在 FPGA 项目里简直是矛盾的。设计阶段越复杂,后期验证的工夫就越长。

有时候为了省点工夫,做忒好办的仿真,结局上线一用就卡锅了。

有时候为了省空间,模型做得忒精简,实际运行性能反而不如带着复杂波形跑得快。最终发现,最赚钱的不是省下的仿真工夫,而是那些因性能不足害得的售后返工和升级费用。 硬件描述语言的版本更新也是个折磨。从 SV 到 VHDL,再到 SystemVerilog,每次更新工具链,之前写好的代码都得重写,出于约束集更新了。

那时候我还在纠结要不要升级,结局刚改完 Bug,版本又变了,连编译的命令都记不清了。最终拍板干脆把所有代码都迁移到 SystemVerilog,别看折腾了半个月,但起码不再受限于旧版约束了。 调试过程压根儿不是线性的,更像是一场没有地图的丛林探险。工具报错的信息有时候根本看不懂,像是一堆英文乱码,就连有时候根本报错。

有时候是模型定义错了,有时候是约束参数设错了,有时候只是编译器版本不兼容。

每次报错都恨不得把整个项目重做一遍,但又能省大量精力。

后来索性不纠结毛病堆栈,直接用脚本自动重跑,哪怕模型重新生成、约束重新定义,只要重新编译就行,省去了花大量工夫去分析报错的功夫。 性能优化方面,发现 FPGA 的吞吐量跟时钟频率关系不大,主要是跟算子优化相关。

那会儿为了写快点,我疯狂堆变量,结局变量一多,模拟工夫直接翻倍,根本跑不动。

后来干脆把变量拆分成多个寄存器,分批处理,别看代码变复杂了,但总算速度反而提升了一半。

有时候为了省空间,干脆去掉冗余的数据流,直接让模型自转,别看性能损失点,但确实能省下一局部硬件资源。 项目交付的时候,最揪心的是功能测试。别看模型跑通了,但功能测试能不能过还是个谜。

有时候明明代码没难题,一跑工具就报错;有时候代码写了挺久,测试结局还是黄了。

这时候就得依赖经验,有时候故意造个坑,有时候干脆就把测试用例写死,不管结局如何。

后来干脆把测试脚本也写成脚本,自动化跑,哪怕结局黄了也不影响自动化流程,起码能保证每次测试的工夫固定。 总而言之,FPGA 项目里没有标准答案,每一步都得自己摸索。工具、模型、约束、仿真、硬件,这些东西越复杂,做的东西就越难。

有时候为了省点工夫,做忒好办的东西,结局上线一用就卡锅了。

有时候为了省空间,模型做得忒精简,实际运行性能反而不如带着复杂波形跑得快。最终发现,最赚钱的不是省下的仿真工夫,而是那些因性能不足害得的售后返工和升级费用。