#

返回新闻

给年薪700万的FPGA工程师的高薪建议

FPGA PCB

FPGA PCB–FPGA 工程师

对于希望获得高薪的 FPGA 工程师来说,有几个关键策略需要考虑。首先,磨练你的 FPGA 设计和开发技能至关重要。成为 Verilog 和 VHDL 等语言的专家,并掌握 FPGA 开发工具和平台,将使你成为该领域的宝贵人才。

大学时期接触FPGA,至今已有十余年。还记得第一次在EDA平台上完成数字秒表、问答蜂鸣器、密码锁等实验时的兴奋之情。那时我还没有接触过HDL硬件描述语言,所以设计都是在MAX+plus II原理图环境下,用74系列逻辑器件搭建的。后来,在研究生学习和后续工作中,我先后用过Quartus II、Foundation、ISE和Libero,也学习了Verilog HDL语言。在学习过程中,我逐渐体会到Verilog的巧妙之处,发现一小段代码就能完成复杂的原理图设计,而且语言的可移植性和可操作性远强于原理图设计。

标准在 FPGA 逻辑设计中的重要性

在行业中工作过的朋友都知道,公司非常重视标准,尤其是大型设计(无论是软件还是硬件)。不遵循标准几乎不可能实现。逻辑设计也不例外:如果不遵循标准,一个月后调试时可能会发现错误。回顾自己编写的代码,你可能已经忘记了很多信号函数,更不用说错误检查了。如果有人在项目中途离职,继任者很可能不得不从头开始设计。如果需要在原始版本中添加新功能,很可能不得不重新开始,这使得设计难以实现可重用性。

从逻辑上来说,我认为以下几个标准比较重要:

  1. 设计文档:设计思路、详细实现等都应该写成文档,经过严格的审核批准后才能开展下一步工作。这样的做法可以让项目始终处于可控、可实现的状态。
  2. 代码标准化:规范信号命名,信号名使用小写,参数使用大写,低电平有效信号用 _n 在最后(例如, rst_n),并将端口信号安排为每线一个信号,以便在仿真验证时更容易发现错误。
  3. 时钟域管理:每个模块只使用一个时钟,在涉及多个时钟域的设计中,使用专用模块进行时钟域隔离,以使综合器综合出更最优的结果。
  4. 避免使用锁存器的组合逻辑:在 FPGA 设计中,禁止使用纯组合逻辑来生成锁存器。可以使用带有 D 触发器的锁存器,例如配置寄存器。
  5. 信号同步:一般来说,进入FPGA的信号必须先进行同步,以提高系统工作频率。
  6. 注册所有输出:设计时应将所有模块输出进行寄存,以提高工作频率,实现时序收敛。
  7. 避免门控时钟:除非是低功耗设计,否则不要使用门控时钟,因为这会增加设计的不稳定性。
  8. 时钟使能信号:禁止使用计数器分频后的信号作为其他模块的时钟。请使用时钟使能信号。

高性能时序设计

我的老板有在华为和君龙工作的背景,很自然地给我们讲了一些华为和Altera的逻辑设计实践。我们的项目标准基本都是参考华为的实践。在前几个月的工作中,我印象最深的就是华为的一句话:时序是设计出来的,不是模拟出来的,也不是编出来的。在我们公司,每个项目都会经过严格的评审,评审通过后才能进行下一步的工作。比如逻辑设计,我们不是马上就开始写代码,而是先写总体设计方案和详细逻辑设计方案,评审通过后,觉得可行,就可以开始写代码了。一般来说,这些工作的时间比写代码的时间要长得多。

总体规划主要涉及模块划分、一级模块和二级模块的接口信号和时序,以及后续如何测试设计。在这一级规划中,重要的是确保时序收敛到一级模块(最终收敛到二级模块)。这是什么意思呢?我们做详细设计的时候,肯定会对一些信号的时序做一些调整。但是,这些时序调整最多只能影响一级模块,而不会影响整个设计。记得上学的时候,因为不懂时序设计,经常因为一个信号的时序不满足,而不得不调整其他模块信号的时序,非常让人沮丧。

在详细的逻辑设计方案中,我们已经设计好了各级模块的接口时序,各级模块的实现方式也基本确定。正因为如此,编码速度自然会更快。最重要的是,这种方式可以让设计始终处于可控状态,避免因为某个地方出错而导致整个设计重头再来。

影响电路工作频率的因素有哪些?

电路的工作频率主要与寄存器之间的信号传播延迟以及时钟偏移有关。如果FPGA中的时钟走线较长,则时钟偏移非常小,可以忽略不计。这里为了简单起见,只考虑影响信号传播延迟的因素。信号传播延迟包括寄存器的开启和关闭延迟、布线延迟以及通过组合逻辑的延迟。为了提高电路的工作频率,我们需要对这三个延迟进行优化,使其尽可能小。

  1. 通过改变路由来减少延迟:指定一些重要信号(例如时钟和控制信号)的走线,使它们通过 FPGA 尽可能少。这样可以有效减少路由延迟。
  2. 减少组合逻辑的数量:尽量使用查找表(LUT)代替逻辑门。另外,也有人使用级联寄存器来减少门的数量,但最好的方法是使用流水线技术来减少门的数量。

总体而言,减少门电路数量和改变电路布线是提高电路工作频率的有效方法。在实际设计中,通常会结合这两种方法。然而,这并非绝对。在某些情况下,改变电路布线可能无法减少延迟,此时最有效的方法仍然是减少门电路数量。

逻辑设计的挑战:系统架构与仿真验证

刚进公司的时候,老板跟我说,逻辑设计的难点不在于RTL级代码的设计,而在于系统架构设计和仿真验证。目前国内比较注重可综合的设计,但关于系统架构设计和仿真验证的资料好像不多,这可能反映出国内的设计水平比较低。

上学的时候,我一直以为只要把RTL级代码做好就可以了,仿真验证只是走个形式,所以对HDL行为描述语法不屑一顾,也不愿意去学习测试平台(testbenches)——因为觉得画波形图方便,对系统架构设计一窍不通。直到在公司遇到一些事情,才发现完全不一样。

事实上,在国外,仿真验证所花费的时间和人力大概是RTL级代码的两倍,现在仿真验证已经成为百万门级芯片设计的关键路径。

仿真验证:建模与自动化

仿真验证的难点主要在于如何建模才能完整、准确地验证设计的正确性(主要是提高代码覆盖率),在这个过程中,验证速度也很重要。

验证,简单来说就是如何产生足够覆盖的激励源,然后检测出错误。我个人认为,在仿真验证中,最基本的就是实现验证的自动化,这也是为什么我们需要编写测试平台(TestBench)的原因。我目前的一个设计,每次仿真大约需要一个小时左右(其实是一个小设计)。由于画波形图无法实现验证自动化,如果通过画波形图来仿真,第一,波形图会画死(尤其是算法复杂、输入统计分布比较多的设计),第二,看波形图会死,第三,错误检测率几乎为零。那么如何实现自动化呢?我的水平还很有限,只能简单讲一下BFM(总线功能模型)。

以制作MAC核(背板是PCI总线)为例,我们需要MAC_BFM、PCI_BFM和PCI_BM(PCI行为模型)。MAC_BFM的主要作用是生成以太网帧(激励源),帧的长度和帧头都是随机的,内容也是随机的,发送的同时也会复制到PCI_BM;PCI_BFM的作用是模拟PCI总线的行为,例如,当被测设备接收到正确的帧时,会向PCI总线发送请求,PCI_BFM会进行响应,并将数据带入;PCI_BM的主要作用是比较MAC_BFM发送出去的和PCI_BFM接收进来的。由于它既有MAC_BFM的发送信息,又有PCI_BFM的接收信息,只要设计合理,就可以随时自动完整地测试被测设备是否工作正常,从而实现自动检测。

华为在国内的仿真验证方面估计做得比较好,他们搭建了比较好的验证平台,大部分跟通信相关的BFM都做得很好。听朋友说,现在只需要把被测设备放到测试平台里,配置好参数,就能自动检测被测设备是否正常工作。

语言注意事项

关于HDL语言,国内很多人在争论VHDL和Verilog哪个更好。其实我个人觉得这个意义不大,外面的大公司基本都是用Verilog做RTL级的代码,所以我还是建议大家尽量学习Verilog。在仿真方面,由于VHDL在行为建模方面弱于Verilog,所以用VHDL做的仿真模型很少。当然,Verilog也并非完美无缺,其实Verilog在复杂行为建模方面的能力也比较有限,比如它还不支持数组。在一些复杂的算法设计中,需要用高级语言进行抽象描述行为模型。在国外,很多仿真模型是用SystemC和E语言做的,用Verilog已经被认为过时了。华为国内的验证平台好像就是用SystemC写的。

未来展望

在系统架构设计方面,由于我目前负责的设计规模不大,经验尚浅。我只是觉得我必须具备一些计算机系统架构方面的知识。划分的首要依据是功能性,其次才是选择合适的总线结构、存储结构以及处理器架构。系统架构的划分应该使各个功能模块清晰易懂,易于实现。等过段时间我在这方面有了一点经验之后,再分享一些心得,所以暂时先不做误导。

个人见解

最后,我简单总结一下。归根结底,就是多练习、多思考、多提问。熟能生巧。与其把别人的答案看一百遍,不如自己动手实践。练习的动力一部分来自兴趣,一部分来自压力。我个人认为后者更重要。有需求就容易产生压力,也就是说,最好在实际的项目开发中练习,而不是为了学习而学习。

在实践过程中,要多思考,多思考问题的原因。解决问题之后,多问几次为什么。这也是积累经验的过程。如果你有写项目日志的习惯就更好了。把问题、原因、解决方案以及解决的方法都写在里面。最后,多提问。如果思考了还是解决不了,就问。毕竟个人能力有限。问问同学、同事、搜索引擎、网友。一篇文章或者朋友的指导,或许能帮你快速解决问题。

结语

功能仿真之后,由于我们是在FPGA中进行设计,所以设计时RTL级代码基本可以保证与综合结果以及功能仿真结果一致。只要综合布局后的静态时序报告没有违反时序约束的警告,就可以进行上板调试。实际上,华为和中兴在FPGA设计时也不会进行时序仿真,因为时序仿真耗时较长,而且效果也未必比查看静态时序分析报告好。

当然,如果是ASIC设计,仿真验证的工作量会更大。当涉及多时钟域设计时,一般都会进行后仿真。不过,在进行后仿真之前,通常会先使用形式验证工具,并结合静态时序分析报告检查是否存在违反设计要求的情况。这样做之后,后仿真的工作量就会小得多。

如果此要求影响采购或生产发布,请将其与以下情况进行比较: 电子元件采购表面光洁度比较 在将最终文件发送审核之前。

快速获取PCB&PCBA报价

推荐文章

快速报价
了解我们的专业知识如何帮助 PCBA 项目。