算法不仅参与到设计活动中,还有必要参与到验证活动中。
芯片验证的本质是将设计出来的电路与参考模型进行对比,对比的对象是两者的输出,只有当输出一致时才说明设计正确。
验证人员从开发人员处获得设计电路,而参考模型从何而来呢?
一般来说,参考模型由验证人员自己根据理解编写。对于结构和计算都较为简单的电路,参考模型的编写是验证人员能够胜任的。验证时,使用System Verilog语言,对于数据操作的自由度和灵活度比开发人员编写RTL时要高很多。比如,验证人员编写一个模型,不需要过多关注该模型是否省电、时序是否能通过、面积是否足够优化,只要保证功能正确即可,并且模型的计算精度可以超过RTL的计算精度。因为模型并不是设计,并不会拿去流片,因此相对来说顾虑少一些。同时,System Verilog的语法也比用于电路设计的可综合的Verilog语法灵活得多。因此,若开发人员和验证人员同时开始编写同一个模块的电路和模型,验证人员会更快完成,而且计算更准确。只有保证验证人员的速度优势,才能使得验证人员在完成设计上每个模块对应的参考模型的同时,有精力和时间构建验证平台,并且编写各种激励对设计进行充分验证。
如果芯片内部的原理比较复杂,则需要许多数学知识和相关背景,比如做通信芯片,需要熟悉OFDM通信机制、信道编码的原理和编解码方法等,做图像视频等多媒体处理芯片,需要有媒体处理的经验,掌握信源压缩算法和小波变换,会进行二维和三维的谱分析。
可见,对于简单芯片来说,开发和验证是纯粹的电路工种,而对于原理复杂的芯片来说,开发和验证都属于跨学科工种。由于立项的芯片项目往往会使用最新的技术成果,仅了解原理和皮毛完全无法胜任开发和验证的工作。
那么,这是否意味着开发和验证都必须是相关领域的专家呢?
对于集成电路科班出身的开发和验证工程师来说,在短时间内成为其他领域的专家是不现实的,正因如此,才有算法岗位存在的必要。针对验证工程师无法给出参考模型的问题,算法人员需要提供算法支持。这种支持可以是文档描述、现场支持,但更多的情况是直接提供参考模型。算法人员提供的参考模型可以是用C语言或System Verilog语言编写的算法代码,也可以是MATLAB、Python等常用算法开发环境下生成的动态链接库和静态链接库文件。
VCS的仿真工具可以进行不同语言的混合编译,也可以调用链接库文件,用System Verilog调用库中的算法函数。在以算法为主导的验证过程中,验证工程师的工作主要是搭建验证平台、构建设计和验证的对比机制等。
算法人员在为验证提供支持以及出具参考模型时,其代码的表述方式需要进行一系列调整。以基于MATLAB出具的参考模型为例,需要注意以下两点:
1)在建模时,需要尽量避免使用MATLAB内建的算法函数,因为内建算法函数在生成的库文件中可能无法使用,比如信道编解码、星座图的映射与解映射,在MATLAB中都有现成的函数可以调用,但在写参考模型时,需要算法人员自己用代码实现,不能调用现成函数。
2)对于复数的处理,在算法上一个复数就被当作一个数,而在VCS等平台中,如果调用的函数输出的是一个复数,则其虚部会被忽略。因此,在算法人员编写的算法函数中,封装的输入、输出口都使用实部与虚部分开传输的方式。
总之,用于仿真和性能评估的算法,与用于指导RTL设计的算法,以及用于验证的算法参考模型,虽然本源都是同一套,但根据应用场景和应用对象的不同,会有不同的变体,这些都是做芯片算法需要注意的。