赞
踩
因为工作原因,在该领域工作过一段时间,多做总结可以提升自己,也希望能获得一些建议反馈。
可以从目录就先有个整体印象。
同时也提醒各位,不能简单的以为软件就可以对硬件进行“降维打击”,每个领域都有它自己很专业的东西。
希望大家能有所收获。
System Verilog是在C++和Java诞生之后,借鉴了C++和Java的优点,结合IC设计的特点,而诞生的一门编程语言。
在IC领域,设计人员(相当于软件开发)一般使用Verilog或VHDL语言,验证人员(相当于软件测试)使用更高级的System Verilog、System C、C语言等等,支持白盒灰盒黑盒(和软件测试的概念一致)的方式去验证。还有把芯片放到单板上,集成性地去验证(这是业界常用的做法)。System Verilog适用于针对性的验证,会让芯片设计阶段的版本迭代加快。
推荐一本比较全面的书《芯片验证漫游指南》,其中有讲到很多软件工程、软件思维的东西,会比较有亲切感。豆瓣链接https://book.douban.com/subject/30222541/
对编程语言经验较少的同学,简单科普一下,C语言是面向过程的语言,当然它可以面向对象,我用C的时候,记得以前我们SDK架构师还给专门培训过,但是大部分做底层软件用C语言的人并不是很熟悉面向对象。
直接点说,面向对象不熟悉的话,你会看不懂别人的代码逻辑,团队也不能统一编码的风格。
使用封装、继承、多态,让代码更加高内聚低耦合。
这个比较基础,有很多书籍资料,理解之后需要实践才能掌握好。这里不做过多讲解。
在System Verilog基本使用中并不用去太关心,如果是C++就一定要注意垃圾回收(因为没有自动回收这样的机制),Java的某些场景下需要手动回收,虽然各种JVM已经做了很好的GC机制。
语法和Java类似,比C++要高级一点。但也有一些补充。
数据结构很常用的是线性表,做芯片的习惯叫FIFO,教程里有点误导新人,我可能会另外写一篇博客去吐槽这个事情,哈哈。FIFO不仅是芯片验证的UVM的组件连接会用到,在芯片设计里也有很多而且有很大不同,水线、反压等等,那System Verilog是没有天然的相同设计的,当然公司会有自己的通用的库,避免重复造轮子。
到了芯片,那真的是比C还要底层的多,会看到很多0和1。注意计算机运算使用的是补码,负数运算算错了就丢人丢大了。
C语言的话,就我个人经验,在OSI计算机网络7层模型的二层三层会使用得多。在芯片那就是一层(物理层)和二层了,会有一定的挑战。
UVM框架比较好用了,虽然部门甚至项目组会自己在UVM之上再加一些东西,不过有点可惜我没能参与到框架的这种补充工作。
常用的代理模式,用agent proxy去代理driver、monitor等。
工厂模式是UVM核心。
单例模式很常见。
观察者模式、访问者模式、策略模式、命令模式等等。
我业余时间也看了一些大牛对于UVM方法学中的设计模式的整理,在知乎专栏UVM方法学与设计模式看了,对于自己会有一些帮助,但是短期很难看到效果。
总之概念都是一致的,学过软件测试这门课的,这些都知道。涉及硬件设计的地方,具体方法上有区别,下面第3节会说。
白盒灰盒黑盒这些概念是一致的。
单元测试、模块测试、子系统测试、系统测试,概念一致。
从开发难度上来说,验证虽然有一定门槛,但是在业务方面,相当于我们在OJ(Online Judge)做题时候的感觉差不多,而且有架构师订好了方案,你要做的,是不照抄设计人员的实现方式,用自己的思路去做,当发现结果和设计人员的不一致,那就得去定位是谁的问题了。
定位问题的思路这里不多扩展了,与业务强相关,简单说一下,有业务经验可以很快想到是哪个模块,没经验的话,建议用二分法,总比无脑从头看到尾的方式会高效很多。
关于相同点暂时想到这么多,欢迎补充。
从定位产品到最终流片,得经历很多阶段。
比如是通用型的芯片,比如时钟芯片,会应用在很多种类的产品上,那么场景需求就有很多要整理和对齐的。
比如是大型的芯片,像公司主打的超强的AI芯片,或者是麒麟之类的,那复杂度和大量人力投入,能这么快推出一代又一代。
不同规模(门级数)的芯片、不同工艺(5nm/7nm…)的,都有区别。走线、布局还很可能在开发中间发现问题,进行调整。
不同芯片制造厂商(台积电以及很多厂商),对电路的实现方式也是不同的,都有很多注意点。这些东西,验证人员也是得涉及到的。
在普通的软件编程中,没有时钟这样的概念,在芯片中,有个始终在运行的时钟,你可以理解为计时器。在芯片中多个模块可能有不同的时钟域,你可以理解为大小不同的计时器。每个拍,会做一系列的动作,数字验证可以去高层次的模拟,但是必须得去观察设计的波形图,就像下面这样(真实情况比图片这个复杂得多,往往为了一个测试点,会需要同时观察多个信号,甚至追踪几十个信号才能得到需要的信息):
(网图,不涉及项目,侵删)
硬件的电路,天然就是多线程的。所以一些信号量什么的,怎么触发的,什么情况下使用断言,什么情况下使用定向测试用例,什么情况下System Verilog无法模拟等等,不仅得熟悉掌握System Verilog的用法,还要一定弄懂设计的思路,对数字电路要很熟悉。
时序是最容易出问题的,需要很多基础知识以及经验。
关于IC领域的特殊之处,经验有限,也就暂时想到几个点,欢迎老司机补充。
推荐绿皮书《 SystemVerilog验证》作者: 克里斯·斯皮尔 豆瓣链接:https://book.douban.com/subject/4014970/,部门里人手一本。
书上内容很多,但是都得掌握,应该让你师傅给你标记一下重点,除了也可以参考别人的博客 http://blog.sina.com.cn/s/blog_6314c0900102w0wj.html
有些东西是普通编程语言里没有的,或者用起来不一样的,以下的常见的务必熟悉:
四态变量
port
线程以及线程间的通信,fork的三种用法的区别。
随机(用法很多),达到目的即可,也不用花里胡哨。
覆盖率收集
过程语句/task/function,因为时序,一个是有时序一个是没时序的。
…
UVM是演进后最新的,也很成熟,现在新人基本也是直接上手UVM。
推荐紫书《UVM实战》,豆瓣链接https://read.douban.com/ebook/15305188/,把UVM的细节和比较原始的用法和高级的用法都讲了,部门里很多新人都会反复阅读这本书,人手一本。
UVM里,在运行的每个phase中,里面不同的模块,都可以面向切面编程地去在pre和post加东西,方便调试和使用,不过初学还是要多请教前辈,因为你理解的什么阶段做什么操作,可能不太对或者不是符合大家的习惯用法。
想要从上往下去理解时序系统,应该看看《计算机组成原理教程》。这本书有专门章节去讲时序系统,而且会介绍清楚指令周期和机器周期、节拍、工作脉冲、多级时序系统、节拍电位和工作脉冲的时间配合关系。
数字芯片的话,数字电路基础扎实、模拟电路懂得越多越好(模拟芯片我就不了解了,向搞模拟的大佬低头)。
信号处理,有些公式和常见的算法。
自动化控制的PID控制算法也了解一下,我是遇到了。
从事网络相关的产品,那要有计算机网络的知识基础,计算机相关专业的倒是都懂这个。
可以看一下ARM相关的,三级五级流水线设计等等。
也可以了解一下嵌入式的东西,看看下游怎么使用它。
友情提醒,软硬双修不是那么好修的。
天呐,没想到写着写着写了好多,都5000字了…觉得文章有用欢迎点赞❤️收藏⭐️关注✔️转发
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。