CAD (Computer Aided Design),计算机辅助设计,本意指利用计算机及其图形设备帮助设计人员进行设计工作,这个定义也可以用来近似类比IC公司CAD工程师这个岗位的工作。
早期IC公司的CAD岗位主要致力于公司内部EDA工具的开发,自从二十世纪八十年代独立的EDA公司崛起,各大IC公司的EDA研发人才逐渐剥离进入几大主流vendor厂,IC公司的CAD岗位职责慢慢演变为EDA工具更上一层的集成电路设计流程自动化,通过顶层的流程控制配合底层的EDA工具来进一步提升IC设计交付效率。此外,很多公司内部也会做一些类EDA工具的inhouse-tool开发工作,在自研工具中加入特性化功能以弥补商用EDA工具过度普适性的缺陷。
可以说,CAD岗位以计算机编程为基本手段,以匹配公司产品特性的自动化管理流程和满足自身IC设计special需求的自研工具为核心生产力,通过计算机辅助极大地提高了集成电路设计交付效率。由于可以将IC工程师从许多繁琐的手工操作中解放出来,减少工程师在IC设计核心环节的精力支出,CAD在节省企业人力资源、提高设计效率、优化企业成本方面起了重要的作用。
近年来中国集成电路行业突飞猛进,2018年中国的集成电路企业新增318家达到1698家,但是多数IC企业中计算机辅助设计的现状堪忧。据了解,绝大多数国内的IC企业,尤其是初创企业以及中小型企业,还是比较原始的作坊式开发方式(夸张的是,个别公司竟然连服务器都没有,一人一台台式机跑仿真!),略微有些流程自动化概念的公司,也常常把CAD相关的工作强加到IT工程师或者IC工程师身上,却往往由于缺乏广泛的IC知识和扎实的编程基础而导致事倍功半。据悉,国内只有海思等寥寥数家大型IC公司构建有相对完整的CAD体系。
由于国内IC企业的特殊发展经历,很多IC企业的CAD部门脱身于IT部门,CAD和IT之间有着千丝万缕的关系,CAD不再仅仅是较为单纯的偏向于编程的流程自动化岗位。那么中国IC公司本地化视角之中,CAD在公司中处于一个怎么样的角色和位置,主要职责有哪些?
图1 IC公司中CAD岗位的角色
图1所示为IC公司中CAD岗位的角色,它处于IC设计和IT基础平台之间,向上承接IC设计需求,向下肩负起同IT共同架构IT基础平台的责任。CAD工程师需要能够很好地了解公司IC设计在IT基础平台上的需求,将这些需求有效转化为具体的IT实现,然后和公司的IT通力合作来完成平台搭建。
图2 IC公司中CAD岗位的职责
由于脱胎于IT岗位,中国的IC公司CAD岗位天然承接了“EDA license管理”、“计算平台管理”,甚至于“EDA工具安装”这样偏向于基础IT的工作,但是大家也承认它着重承载着“设计流程管理”、“inhourse-tool开发”这些更加贴近于IC设计流程的本职工作。
尽管每个公司CAD的工作内容和工作职责各不相同,但是简要地归纳,国内大多数IC企业的CAD部门工作可以区分为偏IT和偏Methodology两部分。偏IT的工作脱胎于IT岗位,在此暂且不做讨论。偏Methodology的工作较为契合IC-CAD的本意,本文主要就IC-CAD Methodology的基础知识体系构建做简要讨论。
下面是根据一些实际工作经验绘制的IC-CAD Methodolgoy知识图谱,这些基础知识可以用于搭建起IC设计中的计算机辅助设计体系的大厦。
图3 IC CAD Methodology 知识图谱
IC-CAD Methodology的最基础的需求在于掌握各种IC相关编程语言,其核心围绕于各种EDA工具的使用、查错、二次开发展开,另外lsf(openlava)也是IC设计中任务运行不可或缺的硬件资源管理平台,而SQL普遍用在IC设计中各种数据的存储,Web则既可以用来做信息展示,也可以用于流程控制和项目管理。
1. Language
IC设计的基本开发环境一般为Linux,常常需要接触到的脚本语言包括shell/Tcl/Perl/Python等。
1.1 Shell
IC设计中常用的shell有bash和csh(tcsh是一种类csh语言,归为一种),bash是很多linux的默认shell,csh则由于历史原因被很多ICer偏爱。
由于shell本身的逻辑编程功能较弱,所以我们主要关注于vim/find/grep/sed/awk这几个知识点即可,这些知识点都很容易在百度/google上搜到大量的优质教程,所以我们只浅论功能。
1.1.1 vim
vim普遍用于linux中各种普通文本的编辑,一个顺手的vim配置可以让Linux端的工作效率大增。我们可以通过配置“~/.vimrc”文件来配置自己的vim,比如我的工作环境下vim配置只有四条,如下:
syntax on
set ruler
set showmode
set hls
功能分别为 “自动语法高亮”、“显示当前的行号和列号”、“左下角显示当前vim模式”和“搜索高亮”
更多配置可以参考 http://www.cnblogs.com/rickyk/p/3839674.html。
1.1.2 find
find命令主要用于在指定目录下查找文件,属于Linux上的常用指令。
使用说明可以参考 https://www.cnblogs.com/weijiangbao/p/7653588.html。
分享一个知识点,可以用命令“find ./ -inum fileinum -exec rm '{}' \;”来删除一个奇怪名字的文件(比如“!&@”),其中fileinum就是文件的inode号,可以用ls -i filename来获取。
范例: 找到当前路径下所有的lib后缀的文件 find . -type f -name "*.lib"
1.1.3 grep
grep sed awk合称Linux三剑客,威力强大,其中grep主要用于文本搜索。
使用说明可以参考 https://www.cnblogs.com/wangcp-2014/p/5146335.html。
范例:找出文件“log”中所有的空行,并标识行号 grep -n "^\s*$" log
1.1.4 sed
sed命令主要用于字符串替换(及删除)。
使用说明可以参考 https://www.cnblogs.com/ginvip/p/6376049.html。
范例:直接修改文件“log”,将其中的字符串“synthesis”均改为“DFT” sed -i 's/synthesis/DFT/g' log
1.1.5 awk
awk本质是一种编程语言,功能极其强大,一般主要用于字符串(列)提取。
使用说明可以参考 http://blog.chinaunix.net/uid-25266990-id-100557.html。
范例:将文件“log”中第二列的内容打印出来 awk '{print $2}' log
前面find, grep, sed, awk的强大之处在于其均支持shell的正则表达式,所以学会Linux的正则表达式也具有重要意义。Perl以其强大的正则表达式系统享誉江湖,但其基本语法和Linux的正则表达式是类似的,学会一着即可举一反三。
1.2 Tcl
由于历史原因,Tcl语言广泛应用于EDA工具之中,尤其是作为配置文件使用,所以有必要了解Tclsh的基本语法。但是由于Tcl功能较弱,不适用于复杂的功能性脚本开发,所以作为CAD这个岗位而言不建议过于深入学习,会基本的语法即可。
《Tcl/Tk入门经典》是一本经典的Tcl入门教程,不过貌似现在网上已经买不到了中文版了。
1.3 Perl
早些年Perl广泛流行于IC界,用于逻辑功能开发,但是现在大有被Python取代的趋势。
Perl的核心优势在于强大的正则表达式和文本处理功能,但是这些功能Python能够完美取代。Perl的主要劣势在于语法过于随意,所以可读性差,可维护性低。我工作后写的第一个较为大型的CAD应用即使用了Perl,总代码量大概为30000行,主程序有5000行,后来做程序更新的时候,我发现自己已经完全无法读懂自己三个月之前写的Perl代码了,从那时起我就毅然决然地投到了Python的阵营。
个人不建议花太多精力学习Perl,能够了解基本语法,读懂代码,可对原有perl脚本做简单维护即可。
1.4 Python
Python是现在非常流行的一门脚本语言,也已经广泛第应用于IC行业。
Python的主要优势在于语法简洁,扩展库极多,开发效率很高(执行效率比较低,但是现在硬件强大,运行效率足够用)。
Python入门包括掌握基本的Python语法,包括变量,数据结构,循环,类等,能够写一般逻辑的脚本,比如文本处理程序、流程控制程序;Python的进阶包括各种库的使用,能够对简单python工具做二次开发和改进,能够写较复杂逻辑应用,能够写图形界面程序,能够以较为规整的软件架构开发系统性工具。
Python可以广泛应用于IC设计流程的方方面面,属于CAD开发的基石,我们曾经用它做过如下事情:
* 自动化regression系统。代码更改自动触发regression运行,收集结果,自动分析错误并定位到具体的check-in,自动汇报bug。
* 自动流程控制系统。synthesis/DFT/clp/fv/sta的自动流程控制系统,包括自动创建design block的运行环境,自动调配openlava资源运行任务(中间状态展示),运行结果检查分析,运行结果汇总和展示。
* openlava的数据采集、数据分析及数据展示系统。开源工具openlavaMonitor(源代码网址https://github.com/liyanqing1987/openlavaMonitor)就是这些应用中的一部分。
* IC inhourse-tool开发。其中library解析及数据展示的开源工具libView(源代码网址https://github.com/liyanqing1987/libView)就是这些应用中的一部分。
2. EDA
在实际工作中,一般一个CAD工程师需要support一个或者多个IC设计的flow,帮助ICer配置EDA工具的基础运行环境,debug EDA工具使用过程中遇到的各种问题(运行缓慢,crash,各种随机错误),搭建良好易用的EDA工具使用平台。
一个好的CAD工程师需要了解实际的IC设计flow,了解EDA工具的用法,在此基础上进一步研发更高层级的流程自动化平台,或者研发相关inhouse-tool作为商用EDA工具的补充,从而促进IC设计流程更高的交付效率。
3. lsf
对于稍微有些规模的IC企业而言,由于仿真运算资源消耗量大,用于进行仿真运算的硬件资源较多,服务器集群管理系统必不可少。现在国内IC业界使用的主流服务器集群管理系统主要为sge和lsf系列,其中sge功能较弱且缺乏技术支持,已逐渐退出市场,lsf系列是主流。lsf系列主要包括lsf、openlava和SkyForm。它们三者在技术上属于同一系列,都脱胎于IBM的商用软件lsf,因而用法基本兼容,区别在于lsf和SkyForm为商用收费软件,支持更好,而openlava是开源软件,没有商业企业支持,但是胜在免费,应该是国内IC公司最为广泛应用的服务器集群管理系统。
方便起见,下面提到服务器集群管理系统,均用openlava代替。
由于openlava作为IC设计流程中运算资源管理的核心载体,其优化配置和高效运行对IC设计流程时效性具有重要影响,因此也是IC CAD工作的重要一部分。
IC CAD需要在openlava的以下方面加以关注。
* 根据企业服务器资源数量和实际的设计流程运算资源需求,合理配置openlava(尤其是queue的配置),提高运算资源的整体使用率。
* 监控硬件资源,及时处理各种硬件异常。(lsf或者SkyForm应该已经自带各种监控,openlava则需要自己开发,或者在网上找一下开源应用)
* 采集openlava基础信息,通过大数据分析(openlava的信息采集至少达到百万量级)等技术手段获取queue/host/load/job/user的使用状况和使用习惯,反过来指导ICer正确地使用openlava,从而提高openlava的使用效率,并保证IC设计仿真运算任务高效正确地完成。(lsf/SkyForm自带通用的数据采集和分析功能,但是更多定制化的功能可能还需要企业内部自己开发)
4. SQL
IC中常用的SQL主要包括mysql和sqlit,其中mysql主要用来存储较大量的数据,速度较快,但是需要单独配置和管理,而sqlite可以用来存储中小数量的数据,速度略慢,但是配置简单,无需过多管理。
IC中许多场景都需要用到数据库,比如:
* 项目管理系统中数据存储。
* 网页展示系统中的基础数据存储。
* 前面提到的openlava数据采集平台,用于openlava基础数据存储。
* 各种inhouse-tool,比如企业library管理系统中,需要存储的极大量数据,也需要用数据库来管理。
5. Web
Web即可以作为一个信息展示的平台,也可以作为项目管理的工具,甚至Linux端有些图形界面的工具,其图形展示和逻辑功能触发也可以移植到web端。理论上,基于web,我们可以搭建一套完整的IC项目管理平台。
如果是在Linux端,可以基于bootstrap做快速的web开发,配合合适的模板一般效果都相当不错。如果有更加复杂的定制化需求,可以选用django或者flask等python开发框架来做web开发。