很多年前我经常在想:做FPGA设计,为啥加班这么多,不停地调bug和维护bug,心力交瘁。直到做了IC设计,我才彻底懂了:看完FPGA设计和IC设计上的差别,你也会懂。
1. 设计上的差别(设计前有无最终硬件)
FPGA设计和IC设计虽然都属于硬件设计,但他们设计却有很大的差别。FPGA是可编程门逻辑阵列,那FPGA设计就是用软件去编程FPGA芯片内部的逻辑来实现不同的应用开发,而IC是集成电路(芯片),IC设计就是造一个芯片,故本质的区别是:
FPGA设计是FPGA芯片上的应用程序开发,即在最终硬件(FPGA芯片)上开发;
IC设计是造一个芯片,即还没有最终硬件(被设计的芯片)。
2. 验证上的差别(能否用最终硬件来验证)
上面设计上的差别已经提到,FPGA设计前已有最终硬件(FPGA芯片),因此验证:
可以直接用FPGA来验证,即下载到FPGA芯片,跑一跑,看一看,再改一改,下载,再跑一跑,再改一改......
在FPGA产品上通过客户使用来验证,客户发现bug,我们定位解决bug,客户再发现了bug,我们再定位解决bug......
因为有最终硬件(FPGA芯片)可以验证,所以我们一般只需这几次跑通,不充分。
而IC设计前还没有最终硬件(被设计的芯片),如果验证不到位,就会导致一次流片的失败,而一次流片就是数亿的损失,因此验证需要:
使用验证方法学UVM来尽可能充分验证各个模块的功能,前仿真、后仿真;
使用FPGA、硬件模拟加速器等,尽可能接近最终芯片来验证各个功能;
因为没有最终的硬件(被设计的芯片)可以来验证,所以我们验证的会非常充分。
3. 规范流程上的差别(需不需要规范流程)
上面验证上的差别,可以看出FPGA设计时,可以在最终硬件(FPGA芯片)上多次试错,甚至到客户那里还能再多次试错,因此规范流程上:
不规范也可以:多试几次又不是不行,问题又不是不能被解决,花20%设计,花80%调bug,还需要加班来维护,又不是不行,多加班能解决的都不是问题,为什么解决也不那么重要,只要最终硬件(FPGA芯片)上跑的没问题就OK;
规范更好:代码写的规范,有详细的设计文档,关注EDA工具综合布局布线的报告等,上板前做一些仿真,这样让你花80%设计,花20%调bug,少加班,就能够不断的升级迭代设计,少bug不怎么需要维护,有bug也能快速解决。
但是,IC设计时,没有最终硬件(FPGA芯片)可以多次试错,就一定要严格规范设计的流程,尽可能去模拟最终硬件验证,保证流片回来的芯片不出问题,因此规范流程上:
要严格规范,充分验证,出现bug需要定位到设计根源上并解决,解决后还需要再遍历验证一遍。
所以,做FPGA,为啥加这么多班?我觉得就是因为不够重视规范和验证,至于FPGA设计重视规范和验证,又是怎么理解和落地了?