2023届EDA领域校招总结,完结撒花!!!


目录

前言

一、EDA公司介绍

二、项目面试

1.自我介绍

2.项目深入

3.专业经验

4.成果和技能

5.对面试官有什么问题

三、C++面试

1、高频考点

2、其他知识点

3、算法题

四、逻辑综合面试

1.逻辑综合知识详解

2.开源逻辑综合ABC

五、简历制作

总结


前言

  • 2022/08/26:

本人2023年6月毕业,于2022年7-10月参加秋招,面试总结纯属个人经验,仅供参考

面试的是EDA前端软件开发岗位,也会掺杂一些EDA其他流程的面试

在面试过程中发现自己准备的很乱,没有一个清晰的思路,现在把自己面试的所有经历和题型整理出来,在这里做一个小的总结,不仅帮助自己整理思路,也给大家做个参考

  • 2022/08/27:

对于基本算法而言,推荐去LeetCode力扣进行刷题学习,主要分为easy/medium/hard三种难度系数,保证自己在medium难度下可以做出题目即可。

  • 2022/09/05:

自9月份来看,2022年国内EDA行业的就业形势是没有2021年好的。

主要原因有二,一是22年互联网寒冬,导致很多计算机专业的学生选择到EDA这个工资高、跟互联网差不多的行业就业,竞争加剧。

二是因为20年美国发布EDA禁令,今年正好是20届入学的研究生的择业年。

目前的形式是22年的最高工资没有21年的平均工资高,且竞争压力极其卷。

本人目前收到2家公司的offer,在工资层面分别比去年低了20%和15%,在竞争层面是与985的学生进行竞争,<211的基本都很难。

可以预见的是,23年校招和24年校招将会一年比一年难。

  • 2022/09/18

陆陆续续接到好几家公司的offer,观察了今年的局势,个人理解是找一家具有良好人员体系培养的公司是最关键的。

首先需要明确,国产EDA的路至少还有10年,才能逐渐追赶上S/C这些国际大厂。

如果我们以每三年为界,至少需要在第一份合同结束前,变成可以独挡一面的R&D,才能在未来的EDA市场中站住脚。

在收到offer后,一定要明确了解到该公司是否具有良好的人员培养体系,而不是一味地追求高薪水和好公司履历,毕竟EDA市场是以实力为准的。


一、EDA公司介绍

自2020年起,国内的EDA公司犹如雨后春笋般出现,各路公司争相在市场上抢夺人才,并购、对抗等不计其数,因此对就业者来说,选择一家适合自己的且有发展前景的公司是首要的。

据可靠消息称,到2025年左右,国内EDA行业的就业形式依旧是一片良好,工资可以随便开到比互联网大厂还要高的水平,但是再往后看,似乎就不一定了,面试最重要的就是对自己未来发展有一个良好的规划。

在这里,首先介绍一些我熟知的、目前比较火热的国内EDA公司,给大家做个不成熟的行业介绍。

1.合见工软(上海)

公司目前融资30亿左右,简单来说就是财大气粗,同时吸引了很多Synopsys和Cadence的专家,可以学到很多东西,工资也是目前开的很高的之一,其主营业务目前有simulation工具和prototype工具。

本人面试的是prototyping工具下emulation frontend组,做的是FPGA原型验证,将ASIC的RTL设计转换成FPGA的RTL,通过EDA工具生成多块FPGA板,已达到验证ASIC设计正确性的目的。

2.华大九天(上海)

刚上市的EDA公司,首日股价暴涨3倍,足以看出业界对他的信心。前身是国内第一个EDA工具——熊猫系统,也算是国企,目前的模拟电路设计EDA是行业领先的水平,公司正在开展数字电路设计EDA的全流程开发。

目前是全国最火,最火的EDA公司,无限被拔高,面试人都挤破脑袋想往公司进。

本人面试的是SYN组和STA组,做的是ASIC电路的逻辑综合。

3.鸿芯微纳(上海)

国内较早开始的EDA公司,有前端和后端两大产品线的ASIC EDA公司,其中后端产品Aguda是基于国外某EDA巨头的布局布线产品前身开发的,属于行业领先水平。目前尚未融资过多,因此工资开的不属于最高的那批,公司秉持着先拿产品说话,再搞资本运作的理念。

个人评价——国内目前最干实事的公司,员工基本都是科研型,俗称EDA黄埔军校,本人面试的是前端综合组,以ABC为基准进行开发。

4.芯华章(南京)

亿元俱乐部的亿元,为数不多的在南京的EDA公司,可见与南京市政府等关系十分紧密。主要产品是验证工具,包括simulation和emulation等,据传其产品背后有某国际EDA公司支持,因此实力十分雄厚。

  • 2022/09/27
    最近芯华章刚刚收购了瞬曜(Emulation)公司,实力又进一步。

5.安路(上海)

国内目前最大的FPGA上市公司,以国产化替代Xilinx为目标,主要做硬件设计,辅以相应的EDA软件,目前在低端市场可以有一席之地,生存下去是没问题的,工资是开的十分的高,属于会眼红的状态。

本人面试的是Synthesis组,即设计EDA工具的前端(逻辑综合),可以适用于安路自己生产的FPGA上。

6.立芯(上海)

复旦大学陈建利教授创立的公司,其在ICCAD Contest上多次获得PR 1st的成绩,其主要做ASIC芯片布局布线的EDA工具,同时也在开展前端EDA工具的设计。

本人面试的是Syn组,其考验程度可以称为极高,需要在线做LeetCode多题,并且还有众多C++细节以及逻辑综合的面试内容。

7.中微亿芯(无锡)

中国电子旗下的FPGA公司,简称国企。在江苏无锡,小城市福利很不错。主要做的是基于FPGA(Xilinx)开发EDA工具,团队人很好,因为是国企,没有什么压力。

本人面试的是EDA综合组,面试不算很难。

8.Synopsys(新思)(上海)

虽说是EDA三巨头的头把交椅,实际上就是全世界最“牛逼”的EDA公司,没有之一。产品线覆盖EDA全流程且效率极其高,目前国内的技术大牛基本都是从S出来的。

目前S的前端工具DC就是TOP1,但是后端工具ICC2似乎不是很给力。

由于国内S很少招聘EDA前端的岗位,本人面试的是验证岗位,面试更多与Verilog相关的知识点。

9.Cadence(楷登)(上海)

EDA三巨头之一,万年老二,但是同S一样依旧覆盖EDA全流程,且效率极高。

C的后端工具Innovus有反超S的ICC2的架势,且C较S少了很多傲慢,毕竟是追赶者的角色。

同样,国内C也是很少招聘EDA前端的岗位,本人依旧是面试的验证岗位,但是面试官的和善度稍微比S高一些些(S轻喷,纯纯个人意见,虽然但是,能去S的还是一定去S的)。


二、项目面试

1.自我介绍

问: 请简单的介绍一下你自己和你在学校里研究的项目

// 虽说是简单介绍,但不是随便介绍,需要用少的语言(1~2分钟)概括自己简历上的全部内容

答:个人条件+研究课题及成果+专业知识和技能

  • 个人条件:毕业于某大学电子科学与技术专业,目前的研究方向是EDA前端设计,主要研究内容是逻辑综合。

  • 研究生研究课题和成果:我的课题是基于布尔可满足性求解器(SAT)的精确逻辑综合,已知一个待实现电路,对其约束条件进行SAT求解,并得到对应最优电路结构,实现了精确综合,相关内容共发表了5篇论文,其中在CCFDAC2021会议上得到了大会唯一最佳论文奖。

  • 专业知识和技能:目前在合见工软实习,熟悉EDA前端的流程,熟练使用C++开发,较熟悉脚本语言、Linux系统、gdb调试以及基本Verilog。

2.项目深入

问: 能仔细说说你课题具体做了什么吗?

// !!!将科研内容以最通俗易懂的语言进行全方面的讲解,记住三字口诀(是什么、为什么、怎么做)

答: 主要分为三部分回答:

1、是什么:做的课题叫什么?主要实现了什么应用?

  • 最重要的是,一定要强调跟面试的公司的项目组有哪些共性问题!
  • 面试官可能并不知道你做的课题是什么,他需要对你有一个评估,其标准就是你做的东西难不难,你做的东西是不是跟公司的业务有联系,即你是否有相应的背景。
  • 同时,可以适当的做一些功课,了解其公司业务,在相关领域看看一些文献或实际工具(逻辑综合强烈推荐要提前看看ABC),这是一个大的加分项!!

2、为什么:为什么要开展这个研究?

  • 介绍做这个项目的意义和实际应用,突出自己解决一个问题时的思路
  • 重点对比有这个项目和没有这个研究的区别!

3、怎么做:你是怎么实现的?C++代码!!!!

  • EDA公司目前无非是C++写代码、verilog写case、tcl写自动化脚本、GDB进行Debug
  • 需要强调自己在实现过程中,是怎么用到这些技能的,这是基本盘,也是你在面试官眼里的第一印象。

3.专业经验

问: 我看到你这里有一些实习经验,可以简单说说你干了什么吗?

//如果没有实习,这个问题也可以改成“你在学校里参与了什么课题,可以展开说说吗?”

//这个问题主要是考验你如何从0到1解决一个问题,或者看你在一个项目中的参与度。

//在公司中是需要解决实际问题的,如果有类似实践经验,会上手很快,这是加分项!

答:类似问题可以总结为三类经验,导师课题(面上项目、纵向课题、企业横向课题)/ 研究生科研项目(省市级项目、校科研项目、比赛项目)/ 实习

1、导师课题:突出你负责的内容,划水的项目不如不写!

2、研究生科研项目:以本人为负责人的项目

  • 课题内容简介(参考项目经验)
  • 如何把课题从0到1完成,如何分配你的任务给项目成员(考验你对一个问题如何进行划分和实现)

3、实习:具体做了哪些事情,参与了什么/负责了什么要写清楚

  • 参与:浅浅的在一个project中做了什么事
  • 负责:需要一五一十的全部讲清楚

4.成果和技能

1、尽量有体系的写明自己的成果

  • 从GPA到奖学金 = 学习能力
  • 科研项目-比赛 = 实践能力
  • 论文 = 科研能力

2、依次从熟练-熟悉-较熟悉-了解说明自己的技能,在这里列举个人认为在EDA前端需要掌握技能的熟练程度

  • 熟练:C++/C, 算法(LeetCode)
  • 熟悉:基本Verilog语法, GDB调试(Debug能力), 前端设计流程, 综合常用算法
  • 较熟悉:脚本语言(不限于TCL/Shell/Python)
  • 了解:Git/gerrit等版本控制系统

5.对面试官有什么问题

问: 那你对我们公司和部分有什么想问的吗?

//看似是没话找话,但如果回答的好,实际上让面试官对你情商以及态度的印象很好

//!!!!千万不要问“你们公司是做什么的?”等此类问题,实际上这种问题在面试前可以在网上自己获得的,很容易让现场变得尴尬,尤其是技术面的时候,面试官是公司的研发大佬,你问这种低级问题,至少不会加分了。

答: 这里我分类成提问三部曲,结合各位自己的实际情况,供大家参考

1、“我在入职贵公司之后,可能会负责的项目大概会是哪个方向?我可以提前学习一下。”

      “请问,假如我入职了,您对我未来几年的规划是什么?”

  • 这个问题实际上是给面试官一个信号,你对未来的职业规划有一个清晰的认识,同时有一个希望解决的问题的态度。
  • 同时,如果面试官告诉你具体的方向的话,你也可以评估自己是否喜欢这部分内容,或直接开始学习这部分知识,以为入职后打算。

2、“冒昧的问一句,我这次面试下来,有哪些不足和缺点?”

  • 首先,你会给面试官一个态度,表决心也好、突出自己的上进心也罢,这是一个积极的信号!
  • 其次,可以旁敲侧击出公司对你这种岗位和水平的人有什么要求,比如EDA前端软开就必备C++、算法和GDB等基础知识,可以了解到面试官更重视哪方面,可以针对性的进行学习。
  • 哪怕这次面试失败了,从外人的角度看出很多问题,发现自己还有哪些不足,可以快速提升自己,以备下次面试。

3、“感谢您的面试,这次对我收获很大,对于我的不足我也会尽力去补足,也希望可以通过面试加入贵公司!”

  • 简单来说,最后一句话就可以总结成一个字 —— “舔”。
  • 但是要“舔”的有深度,“舔”的含蓄,“舔”出风格~
  • 以下步骤仅供参考,如有雷同或冒犯,纯属巧合
  1. 第一步,降低自己的姿态
  2. 第二步,提高面试官的地位
  3. 第三步,以退为进,说自己可能进不了,但是下次在努力学习后,还会再来面试
  4. 第四步,感谢话术
  5. 第五步,展现自己锲而不舍、撞破南墙的,要加入公司的态度

三、C++面试

1、高频考点

首先,总结一些高频考点,下述问题都是必须要懂的,且要了解的很透彻。

1.智能指针

  • 避免申请的空间在函数结束时忘记释放 —— 可以减少野指针(wild)和悬空指针(dangling),即内存泄漏的产生
  • 野指针:没有被初始化的指针
  • 悬空指针:指针最初指向的内存已经被释放的指针
     
  • unique_ptr:保证同一时间只有一个智能指针可以指向该对象,避免空间泄露
  • shared_ptr:强引用。多个智能指针可以指向相同对象,但该对象仅在“最后一个引用被销毁时”释放
  • weak_ptr:弱引用,用的不多。协助shared_ptr工作,其构造和析构不会引起引用计数的增加或减少,防止两个shared_ptr互相引用导致的死锁问题(资源永远不释放)
     
  • 因为智能指针是一个类,类会自动调用析构函数,自动释放内存。

2.参数传递

  • 形参:在函数定义时出现的参数
  • 实参:函数实际调用的参数
     
  • 指针:形参为指向实参地址的指针。对指针进行地址操作时,会改变实参。编译时将“指针变量名-指针变量的地址”添加到符号表中
  • 引用:形参是实参的别名,不可修改,必须初始化。在栈中开辟形参的空间,存放的是实参的地址。编译时将“引用变量名-引用对象的地址”添加到符号表中
  • 值:形参是实参的拷贝。在栈中开辟了空间,将实参复制给形参,改变形参不会修改实参
     
  • 指针参数传递&引用参数传递:指针传参的本质是值传递,传递地址值 / 引用传参是地址传递,传递引用变量
  • 编译的角度:指针在符号表上对应的地址值为指针变量的地址(可修改指向的对象),引用在符号表上对应的地址值为引用对象的地址(不可修改被引用的对象)

例:int &ref= var;

引用:ref作var的别名,不单独占用内存空间,即ref和var的地址是相同的

指针:程序将开辟一块内存空间,存储“ref指向var”这一信息

但仔细思考,如果没有内存空间存储“ref指向var”,计算机是怎么知道ref是var的别名?

解:在部分编译器中,ref在内存中是占用了一块空间的。
但编译器处理后,使计算机认为ref不单独占用内存空间,且取ref地址时直接取到var的地址。

在内存空间中,ref本身也占用一块内存,里面存储着var的地址,实际上大小与指针相同,只是经过编译器处理后,访问这块ref内存时将直接转而访问var的内存。

综上:引用实际上是占用内存空间的,是在程序运行过程中声明的,但程序把它按照不占用内存空间来处理。

3.const关键字

  • 基本数据类型:修饰符为const的变量定义为常量
  • const应用到函数的参数中:
    1、参数const:调用函数时对参数const初始化const,在函数体中保护了对应对象的属性(通常用于参数为指针或引用)
    2、返回值const:返回值分为引用返回(返回引用对象)和非引用返回(返回对象的副本)
    对于引用返回,需要使用const增加其常量属性,则不能被修改,保护对象的属性。
  • const应用到类(class)中:
    1、const成员变量:在对象的生命周期中是const,但类可以创建多个对象,具有多个const值。
    不能在类的声明中初始化const常量,只能在构造函数的初始化列表中初始化
    2、const成员函数:防止成员函数修改成员变量的内容
    使用mutable可以强行修改某个变量,static const成员变量可以建立整个类都恒定的常量
    3、const类对象:定义常量对象,只能调用常量函数。
    非常量对象既可以调用const函数,也可以调用非const函数

4.class的定义和基本概念

  • 类

C++是面向对象的程序设计。类(class)是C++的核心特性,包含了数据表示法(类成员对象)和处理数据的方法(类成员函数)。类似于C的struct,但比struct更丰富。

类的公共数据成员可以使用直接成员访问运算符 . 实现

创建对象: 类名称 对象 (如 Name A)

  • 类对象

对象有三个访问修饰符:public, private, protected,默认访问修饰符是private。

  1. public(公有):在类的外部是可访问的
  2. private(私有):在类的外部是不可访问的,甚至是不可查看的
  3. protected(受保护):与私有比较类似,但protected还可以在派生类中被访问
  • 构造函数(默认是无参构造函数)

在每次创建类的新对象时执行

构造函数的名称和类的名称是完全相同的,并且不会返回任何类型,也不会返回void。

  • 一般构造函数:构造函数可以带参数,用于为某些成员变量设置初始值,一个类可以有多个一般构造函数,前提是参数的个数或者类型不同
  • 拷贝构造函数:函数参数为对象本身的引用(在创建对象时使用同一类中之前创建的对象来初始化新创建的对象)
    使用场景:通过使用另一个同类型的对象(本类型的一个引用变量)来初始化新创建的对象,为深拷贝  
  1. 对象以值传递的方式传入函数体,需要拷贝构造函数创建一个临时对象
  2. 对象以值传递的方式从函数体返回,需要拷贝构造函数创建一个临时对象
  3. 对象需要另一个对象进行初始化
  • 类型转换构造函数:一般构造函数的一种,根据一个指定类的对象创造一个本类的对象(不允许默认转换的话,提前声明explict)
  • 执行顺序:已知存在多态,与析构顺序相反
  1. 基类构造函数,若多个基类,则以在类派生表中出现的顺序进行构造
  2. 成员类对象构造函数,若多个成员类对象,则以对象在类中被声明的顺序进行构造
  3. 派生类构造函数
  • 析构函数

类似于构造函数,在每次删除所创建的对象时执行

析构函数的名称和类名称完全相同,只是在前面加了一个波浪号(~)作为前缀, 它也不会返回任何值,也不能带有任何参数。析构函数有助于在调出程序(如关闭文件,释放资源等)前释放资源

  • 执行顺序:已知存在多态,与构造顺序相反
  1. 派生类构造函数
  2. 成员类对象构造函数,若多个成员类对象,则以对象在类中被声明的顺序进行析构
  3. 基类构造函数,若多个基类,则以在类派生表中出现的顺序进行析构
  • 友元函数

友元函数定义在类的外部,其特点是有权访问类的所有私有(private)成员和保护(protected)成员。友元既可以是一个函数又可以是一个类。友元类中,整个类及其所有的成员都是友元。定义友元函数需要在函数原型前使用关键字friend。

  • 内联函数

通常与类一起使用。定义内联函数需要在函数名的前面加关键字 inline,与宏类似,但更高级。

特点:编译器在编译时会把函数的代码副本放置在每个调用该函数的地方。在类中定义的函数都是内联函数,可以不使用inline限定。

5.类的三大特性

  • 封装:把对象的属性和动作封装成抽象的类

封装性是通过访问控制来实现的(public,protected,默认模式private)

  • 继承:让某个类的对象可以获得另一个类的对象的属性(多态的前提)

继承性是实现软件可重用性的一种手段,即A类被B类继承,A类为父类,B类为子类,B类继承A类的所有public和protected成员数据和成员函数

!子类可以重新定义父类某些属性,重写父类的某些方法,即覆盖父类的某些属性和方法,使其获得与父类不同的功能(重写 override)

  • 多态:不同对象对同一个信息产生不同的行为(同一个接口,不同实现)

动态多态:基于封装和继承的实现,多个子类对继承于一个父类的虚函数进行重写
静态多态:在同一个作用域对函数进行重载(函数名相同,函数参数列表不同) / 对函数进行模板化,忽略数据类型强调数据操作

体现:父类引用或指针指向子类对象 / 父类的引用或指针可以接受子类对象

前提:存在父类与子类的继承关系/父类中必须有虚函数/子类必须重写父类的虚函数/父类引用或指针指向子类对象

6.虚函数

  • 虚函数:在基类的函数前加virtual关键字,并在一个或多个派生类中重新定义的成员函数,实现同一个接口不同的实现,即多态
  • 作用:实现动态联编 / 实现统一接口但不同执行过程
  • 虚函数主要通过虚函数表来实现,其保存该类中虚函数的地址,并且为派生类对象生成一个虚函数指针,指向该类型的虚函数表(可解决继承、覆盖的问题,虚函数表就像一个地图一样,可指明实际所应该调用的函数)
    每一个有虚函数的类都有一个虚函数表,虚函数是整个类所共有的,虚函数表存储在对象内存最开始的位置。如果子类继承了多个父类,并且父类有虚函数,则子类要存储多个虚函数指针。如图所示,如果继承了n个父类,并且每个父类都有虚函数,那子类会有n个虚函数表指针。

虚函数表

更多文章请关注《万象专栏》

转载请注明出处:https://www.wanxiangsucai.com/read/cv177944