英伟达数字设计面经

面试岗位 ASIC intern / IP  Design & Verification Team

一面 90min(actual) / 180min(expected) 三位面试官

  1. 请你自我介绍一下?(中文)
  2. 你能说一下你的cpu项目做了哪些task吗?(答:对照一生一芯流程,先做core,再加总线,乘除法,cache,跑通测试集)
  3. 你说你的流水线是四级,为什么要拿掉访存,那你怎么访存呢?(答:为了减少资源,优化时序)
  4. 你能说一下你是怎么实现Load/Store的吗,数据通路是怎样的,可以具体一点吗?答:(show 出结构图,在EX级实现访存,如何实现全速流水)
  5. 你能说一下流水线之间有没有类似valid,ready的握手protocol呢?你能列举流水线的什么行为可以跟ready allow的各种组合对应呢?(答,介绍valid,ready_go,allow_in,不过面试官没有理解为什么要单独valid,因为这样可以实现传递bubble。)
  6. 你有了解过SVA吗?(答:无SV经验)
  7. 你有测试过,在allow置位以前,ready自己toggle的情况吗?(答:想了一下,没有意义,不影响功能正常运作。但是有测试解决过valid信号toggle的情况,确实影响功能)(复盘:面试官希望看到自动化测试)
  8. 你说你通过了所有指令集测试,它们是组合的吗?有没有想过随机测试?(答:是组合的,但不是自由组合。不存在完全随机的测试,标准测试集是静态的,确实是遗憾。)(吐草一句,别的RVcore也就是通过标准测试集就当功能通过了,为什么我的不能coremark,它们就可以,一定是编译器的问题!)
  9. 你是怎么处理分支跳转指令的?(答:静态预测,flush流水线)
  10. 你是怎么处理forwarding的,forwarding是为了解决什么问题?(答:为了减少等待有效操作数的气泡。)
  11. 你是怎么实现乘除法的?你说的连续乘除法融合特性是什么意思?(答:华莱士树+Booth编码,迭代试商除法,不重复计算输入相同的乘除法,节约多个周期。)。
  12. 你的执行阶段的部件是可以同时处理多条指令的吗?如果你执行除法加乘法,那你消耗多少clock?你是怎么处理多指令reorder和retire?(答:其实我没听懂retire,但我是顺序提交,降低效率简单处理了。单发射cpu,没有复用EX阶段的组件,确实没做到位。乘除法单元单独存在不复用ALU。)
  13. 你的访存地址来自哪里?现在项目里的critical path是哪个?(答:访存地址来自alu计算结果,和访存请求一起在同一个stage产生。由ALU产生跳转地址,产生了超长的path,是设计上的不足。)
  14. 你项目现在的PPA情况是怎么样的?
  15. 那你能说一下你怎么优化时序吗?(答:其一,可以加一级取指,对地址打一排切断关键路径,顺便还能做分支预测。另外是平衡流水线之间的延迟,比如调整forwarding的stage到ID阶段,确实增加了我的slack。)
  16. 你能说一下,你是怎么解决read after load相关的吗?你还解决过其他的hazard吗?(答:产生hazard,插入bubble来解决。另外有前递无效hazard,同样是插入bubble来解决的。)
  17. 你有把你的项目跟市面上其他cpu进行过对比吗?后续你打算怎么优化呢?你是自己兴趣做cpu,为什么不找专门做这个的导师?(答:coremark没通过编译,很遗憾。后续跑通测试,然后解决缓存一致性问题。觉醒太晚。)
  18. 我们需要讨论一会,你稍等一下,会有面试官进一步问你。
  19. 你能说一下你的乘法器是什么format吗,具体一些?(答:乘法器是单周期,无符号数当作有符号数处理,拓展位宽。)
  20. 你能说一下你的booth编码的radix吗,为什么使用两位?你使用多位编码也能达到减少资源的效果,为什么不用?(答:两位以上的编码需要对输入补码数扩展更多位宽,浪费资源。虽然多位编码也能减少部分积的个数,当时没想那么多。只用两位,出于学习的考量,学习怎么切分流水线,刚好满足100M约束就算了。)
  21. 我还是不明白你的结构,你能继续说明一下华莱士树是怎么组织的吗?这种结构是最优的吗?(答:说明了我对64位结果每一位都有一颗华莱士树,产生该位的进位与和,最后64位进位跟和相加得到乘法结果。其实对于低位乘法结果可以不用完整的华莱士树,更低位的进位就白白浪费了资源,但是为了generate好写我还是用了。真正不浪费资源的乘法华莱士树其实是一颗偏斜的树。)
  22. 为什么你的华莱士数是七层,你可以建模得到吗?(答:我采用的保留进位加法器的压缩比是三分之二,每用一层数就减少三分之一的数据输入。根据输入位数17位可以递推得到华莱士数的层数。)
  23. 从你刚刚说的结构可以知道,你的树其实是偏斜的,有很多拓展位宽的地方,实际上不参与运算,有优化的空间。你可以不这么做吗?(答:其实从booth编码开始就一直有浪费拓展位宽,如果不拓展符号位的话还可以采用单符号位多驱动下一级组合逻辑的输入,但是这样我担心fanout会太大,所以就偷懒了拓展位宽算了。关于树的问题如前所述)
  24. 你有没有想过,在综合的时候,约束频率的高低会影响你综合出来的电路吗?或者我们具体一点,不用你的detailed实现,就单纯用符号来实现乘法加法,你觉得综合的结果会受到影响吗,slack会怎么变化?(答1:没回答上来,我感觉频率对综合结果没有影响,无非是优先满足什么约束罢了。从综合策略来说,可能会为了降低fanout而自动复制寄存器,但是我一般不开启这个选项)(答2:想了一会还有一种情况,就是fpga对多位算术运算会有优化,12位以上的加法会采用carry4资源来实现,降低延时,所以12位以下加法可能反而会慢。)
  25. 面试官追问,那你的carry4资源是free的?对功耗有没有影响?(答1:我觉得free,fpga每个slice都有carry4,根本用不完。虽然对功耗有影响,但是没测过)(答2:补充了一下,carry4相比lut因为有冗余的输入,容易受到操作数的影响,确实对功耗会更加敏感。)
  26. (另一个面试官)我们的技术问题没有了,想问问你对实习的期望?你会不会c++,面向对象编程?能实习多久,full-time吗?顺便介绍了一下他们的团队。