刚结业的时分,我年少轻狂,认为自己现已能够独立自主,庙堂之上所学现已足以敷衍业界需求。可是在后来的作业进程中,我认识了许多牛人,也从他们身上学到了许多,从中总结了一个IC规划工程师需求具有的常识架构,想跟咱们共享一下。
技术清单
作为一个真实合格的数字IC规划工程师,你永久都需求去不断学习愈加先进的常识和技术。因而,这儿列出来的技术永久都不会是完好的。我尽量每年都对这个列表进行一次更新。假如你觉得这个清单不全面,能够在本文下留言,我会尽或许把它弥补完好。
言语类:Verilog-2001/ VHDL ,SystemVerilog/ SystemC,Makefile/ Perl/ Python/ Shell,Tcl
东西类:NCVerilog/ VCS/ ModelSim,SimVision/ DVE/ Verdi,Vim/ Emacs,SVN/ CVS/ Git,Microsoft Office
渠道类:Windows,Linux,OS X
其他加分项目:MATLAB,ISE/ Synplify/ Vivado/ Quartus,LEC/Formality,VMM/ UVM,ESL,ZeBu Server,JIRA/ Confluence,C/ Assembly Language,Computer Architecture/ ARM Architecture/ MIPS Architecture
为什么 & 怎样办
A) Verilog-2001/ VHDL
这儿之所以着重Verilog-2001而不是Verilog-1995,是由于在Verilog-2001中规则了许多新特性,因而能够发生更好的代码风格。
我从前在什么是杰出的Verilog代码风格一文中对新版的接口语法进行过详细的举例阐明。这种新的接口办法修正起来愈加简略,例化模块的时分运用也愈加便利,不像旧版的接口语法由于一个接口需求分3次描绘,无端端增加了代码行数并且阅览和改动都很困难,尤其是当一个模块的接口数目超越一个屏幕的显现规模时Verilog-2001的这种优势愈加杰出。
学习Verilog最大的问题便是:许多国内的书写得都很欠好,书中的许多比如都是为了阐明语法特征而存在的,没有任何实用价值,乃至许多代码都是过错的(这儿过错的意思并不是说他语法过错,而是说他是不行归纳的,无法用数字电路来对等完结的)。
所以,关于学习Verilog,我的主张是,随意找一本相似语法手册的书本,仓促把根本语法看过一遍,搞清楚模块界说,接口界说,模块例化,寄存器界说,线界说,always块怎样写这些根本内容后,就开端到OpenCores网站上去下载现现已过FPGA验证的完好开源项目代码进行学习。先做到看懂他人写的代码,然后再测验自己去仿照,有不理解的问题再有针对性地去网上查找答案。
Verilog言语与软件言语最大的差异便是,由于它是用于描绘电路的,因而它的写法是十分固定的,由于电路的改变是十分有限的。学习Verilog的时分,许多时分咱们并不是在学习这门言语自身,而是学习其对应的电路特征,以及怎样对这个电路进行描绘。
假如心中没有电路,那么你是不行能写好Verilog的。从根底开端,一点点堆集相似计时器,译码器这样的小型电路描绘办法是十分重要的。Verilog鼓舞在电路中进行立异,而不是在描绘办法上进行立异。因而,即便是国际上最牛的Verilog高手,他写出来的Verilog代码语法也都是很一般的,而他的构思则在于怎样去组合这些根本的小型电路。
VHDL尽管我并不是太了解,可是现在在欧洲许多国家,VHDL仍是干流的RTL规划言语。VHDL言语的严谨性比Verilog要好,不像Verilog中相同存在许多契合语法却永久无法归纳的句子,简略对新人形成误导(仿真经过的代码却在FPGA归纳时报错,或许FPGA完结成果与仿真不一致)。而VHDL和Verilog尽管能够彼此转化,可是转化进程中依然存在许多问题,无法做到彻底的主动化。关于这一点我之前写过一篇专题进行评论:怎样将VHDL转化为Verilog。有爱好的同学能够去看看。
B) SystemVerilog/ SystemC
这两种言语都是为了验证而存在的。作为IC规划工程师,验证常识不是有必要的,可是把握根本的验证办法学有助于进步自己的debug功率和成果。我从前在怎样快速建立模块验证渠道一文中详细介绍过一种我自己总结的验证办法,这种办法便是根据SystemVerilog语法完结的。由于SystemVerilog对Verilog彻底兼容,就像C++对C言语的兼容相同,所以SystemVerilog(或SV)学起来其实并不算难。
SystemVerilog是一种面向对象的言语,其规划的原意是用于建立验证渠道,干流的VMM/UVM办法也都是根据SystemVerilog完结的,所以立志成为IC验证工程师的同学,SystemVerilog的深化学习和盛行办法论的学习都是必不行少的。
而关于那些只想做IC规划的同学而言,SystemVerilog相同也是值得学习的。且不说本文前面说到的用于进步验证功率的debug办法,即便仅仅为了做好规划,SystemVerilog也是大有用武之地。在欧美许多发达国家,许多国际尖端的IC规划公司内部都现已开端运用SystemVerilog进行RTL规划了。由于在SystemVerilog中参加了许多相似always_ff、always_comb等用于显式标明归纳电路目的的新语法,代码的可读性更高,归纳进程中也减少了歧义,尽或许地确保了归纳成果与规划目的的一致性。从另一个视点来说,asserTIon的参加也极大地进步了代码的debug功率,十分有助于在大规模的数据交互进程中定位到犯错的初始点,没有把握的同学能够多花一些时刻研究一下。
C) Makefile/ Perl/ Python/ Shell
以上四种都是IC规划工程师们常用的脚本言语,看起来好像它们都跟IC规划的专业才干没有一点点联系,可是由于本行业的专业东西价格十分贵重,项目需求差异极大,因而把握一门称心如意的脚本言语将对你作业功率的进步协助极大。假如你还没有测验过编写自己的脚本言语,那么问问你自己,有没有从前为了完结一批仿真用例熬到深夜?有没有从前由于要比对几万个数据搞到眼瞎?有没有从前由于要修正一个大局信号的比特位宽而无比抓狂?要把一个hex类型数据文件转换为memory模型需求的特别格局怎样办?没错,假如你把握了脚本言语,以上这些奇奇怪怪的需求都不是事儿,重复而详尽的体力劳动就交给计算机来完结吧。我一贯信仰的标语便是:凡是做过一次的作业,就没有必要重复第2次。
假如你现已在作业中运用过其它工程师开发的渠道或许脚本,那么它很或许是用这4种言语写成的。假如履行脚本的办法是make run,那么很或许你用到的是一个Makefile脚本;假如履行办法是source run,那么这应该是一个Shell言语写成的脚本;假如是其它状况,那么就得看详细这个脚本首行是怎样写的了。Makefile和Shell言语比Perl/Python要更简略上手,写起来也愈加简略,比较适宜满意一些十分简略的批量使命需求。Perl的强项则在于它强壮的文本处理才干和无所不能的CPAN库,随时能够满意你的各种固执需求。Python的长处则是较好的可维护性。
关于脚本言语的重要性,咱们能够到这儿看看相关评论:Perl等脚本言语在IC规划中有哪些用途?。
D) Tcl
严格来说,Tcl是一门十分单纯而简略的言语,而它的学习难点在于,仅仅把握它的语法是远远不够的。这种状况有点相似javascript,假如你用js来开发网页,那么你有必要深化了解DOM和HTML;假如你用js来开发游戏,那么你有必要深化了解Unity3D引擎的各种常识;假如你用js来开发Web App,那么你有必要会用node.js的各种库和常见的服务端结构。
言语永久仅仅东西,这句话放在Tcl上再适宜不过了。在IC规划这个范畴中,Tcl是一门十分常见的言语。他能够用于描绘时序和管脚束缚文件,UPF信息,也能够用来建立简略的作业渠道。它既是许多IC范畴EDA东西默许支撑的脚本言语,也是这些东西装备和输出的文件格局。因而,能够读懂Tcl,把握Tcl言语的根本语法,就能够协助你更好的运用EDA东西,真可谓是Tcl在手,全国我有!
可是,成也萧何败萧何,正如前文一开端说到的,仅仅把握了Tcl的语法还远远不是悉数。不同的EDA东西对Tcl脚本供给的指令和参数支撑都是不相同的,每逢你需求为一种新东西编写Tcl脚本时,都有必要要熟读官方给出的用户手册,了解这种东西支撑的Tcl指令结构,才干确保写出的脚本是能够被正确履行的。
E) NCVerilog/ VCS/ ModelSim/ iVerilog
以上三种都是比较业界比较干流的仿真东西,其间NCVerilog和VCS都只支撑Linux渠道,而ModelSim貌似是一起支撑Linux渠道和Windows渠道的。可是不论哪一种,我都期望咱们能意识到两件事:
榜首,仿真器和波形查看器是两回事,本条目介绍的仅仅仿真器,仿真器的作业原理跟波形查看器是有天差地别的,一起由于IEEE对规范波形文件*.vcd格局的规范,恣意仿真器都是能够和恣意波形查看器组合运用的。
第二,仿真器一般是没有图形界面的,为了更好地运用仿真器,你要熟读自己常用仿真器的用户手册,了解一些常见需求的指令行参数,至少要做到了解如下内容:怎样指定编译的文件类型,怎样指定编译文件清单,怎样指定索引目录,怎样指定仿真精度,怎样指定暂时的宏变量,怎样指定语法查看的苛刻等级,怎样混合编译由多种言语写成的工程,怎样调用不同波形生成东西的pli接口,怎样合作SDF反标进行后仿等等。
不同仿真器的功用其实都迥然不同,可是是不是只把握一种仿真器就能够打遍全国无敌手了呢?当然不是。在实践的工程中,咱们常常用到第三方IP核,有时分出于保密的需求,第三方IP核会以加密二进制文件的办法供给,加密二进制文件长啥样呢?
它们一般以“*.vp”格局命名,文件的最初部分便是规范的Verilog语法,可是在一行注释之后就悉数变成了乱码。一般乱码之前的那行注释会指定该加密二进制文件支撑的仿真器类型。所以你看,假如你是一个重度VCS运用者,而有一天项目经理忽然塞给你一个只支撑NCVerilog的加密文件,你心里必定会有千万只草泥马呼啸而过。
F) SimVision/ DVE/ Verdi/ ModelSim/ gtkWave
与上面的仿真器相对应,以上三种也是业界比较干流的波形查看东西。一切的波形查看器都有必要支撑规范波形文件*.vcd格局,可是由于*.vcd格局的存储功用并欠好,冗余信息过多,所以各家波形查看东西都纷繁推出了自己独家支撑的波形文件格局,如DVE的*.vpd,Verdi的*.fsdb,ModelSim的*.wlf, SimVision的*.shm等。一般波形查看东西独家支撑的文件格局都具有较高的紧缩率。
举例来说的话,一般1G左右的*.vcd格局波形转换为*.vpd格局后只要40MB左右,而转换为*.fsdb后一般会更小,因而将规范波形文件*.vcd转换为其他紧缩格局愈加有利于数据备份。
假如期望在仿真进程中不出产*.vcd,而是直接生成紧缩率更高的其他波形查看器专用格局,则需求调用对应东西供给的pli接口,一起合作测验渠道代码中的体系函数调用(如$fsdbDumpOn等)来完结。
G) Vim/ Emacs
常常看到一些Verilog新人提出这样一个让人啼笑皆非的问题:“请问一般Verilog编程用什么样的软件?
首要,Verilog是一种电路描绘言语,它本质上或许跟电路图的血缘还更近一些,至少不应该把这个描绘进程说成是“编程”。
其次,写Verilog其实并没有什么专门的软件,大部分业界的工程师都是用Vim或Emacs这样原始粗暴的文本编辑器来写Verilog代码的,假如你乐意的话用Notepad或Texteditor来写也未尝不行,仅仅假如你有深化了解过Vim或Emacs的话,天然就会理解这么多人挑选它们的原因地点——进步功率。
1、你是否从前在代码写完之后被老迈臭骂一顿原因是你没有把一切的reg和wire界说都放到文件的一致方位(如第38行)?假如运用Vim编辑器的话,只需求运用:g%^\s*reg\s*%m 38加上:g%^\s*wire\s*%m 38就能够了。
2、你是否从前被要求删去某个文件中一切的注释?只需求:%s%//.*$%%g就能够了。
3、你是否从前需求把一个模块例化256次,然后由于每次例化的一点细小不同导致你不能直接运用for循环?没联系,用qq录像功用,你只需求操作一次,然后运用256@q就能够把你的动作主动重复256次啦。
4、你是否从前遇到键盘坏掉了,“a”键常常失灵乃至没有反应?没联系,用:inoremap ‘ a把‘键从头映射为a键吧。
相似的比如几乎数都数不完,更多内容拜见与Verilog有关的Vim实用技巧。
所以说,运用Vim或Emacs最大的优点便是,你会感觉到你的大脑比手更忙,由于从你想清楚到代码写好只需求花费极短的时刻。你能够把悉数精力投入到代码的内容上,而不是代码输入这个机械的进程中,就好像用打字机替代毛笔的感觉相同。只要是你能用编程描绘清楚的作业,Vim就能够替代你快速完结,而条件便是你要先学会许多的Vim指令和正则表达式,以确保你的表述能被编辑器正确理解。
G) SVN/ CVS/ Git
以上三种都是现在比较干流的“版别办理”东西。什么是版别办理?
简而言之,便是一种用于记载和查询文件版别改动的东西,一般都会被布置在公共服务器上,以确保数据的安全和可恢复。在项目的开端阶段,首要需求创建好版别办理的根目录,然后由不同的工程师逐个把自己的规划文件初次参加到版别办理的各级子目录下。
在项目履行的进程中,每逢有人修正一个文件,都需求经过版别办理东西上传代码并注释改动内容,版别办理东西会主动查看改动内容与服务器上的最新版别是否抵触(抵触的意思便是说,在该工程师改动这个文件的进程中,有其它人也对该文件的同一行代码进行了改动并上传了新版别),假如没有抵触,则会主动将新上传的改动兼并到当时最新版别,反之,则将抵触部分进行比照显现,让工程师手艺判别应当怎样兼并抵触行的内容,处理抵触后能够再次从头上传。
H) ISE/ Synplify/ Vivado/ Quartus
ISE和Vivado都是Xilinx旗下的FPGA东西,其间ISE比较老,官方现已中止更新了,现在最新的版别是14.7,而Vivado作为新一代的FPGA东西一直在持续更新。Quartus则是Altera旗下的FPGA东西,功用和ISE/ Vivado迥然不同。笔者素日里对FPGA东西的触摸并不多,但从有限的触摸领会而言,Quartus比ISE/ Vivado更适宜用于学习,入门的门槛更低一些,操作界面也愈加简略易学(但千万不要运用6.2版别以下Quartus中自带的波形仿真东西,那是废物)。
I) Windows/ Linux/ OS X
信任大多数人的个人计算机运用的都是以上体系或相似以上体系的其他体系吧。以上3个体系,关于专业的数字IC前端规划人员而言,作业的便利程度(留意,是专业人员的便利程度,而非学习曲线的峻峭程度,这儿是指均已到达熟练把握的条件下关于作业功率的协助)由便利到困难分别是:Linux 》 Windows 》 OS X。
在Windows下,你或许需求的东西有Cygwin(模仿Linux shell,带有大部分GNU东西),Modelsim,Debussy(更名Verdi后的版别没有对应的Windows版别), Quartus, ISE等。在Linux下,你或许需求的东西包含Bash/Csh/Tcsh,Modelsim,Quartus,ISE,VCS,Simvision,DVE,NCVerilog,Formality,LEC,Synplify等。而在OS X下(笔者不幸就坐落该渠道下),你能够运用的东西就只剩余Bash/Csh/Zsh,iVerilog,gtkWave这些挑选了。
从以上内容不难看出,在东西的多样性视点而言,Linux完爆其它渠道,这也是为什么绝大多数IC开发公司的服务器都挑选布置在Linux下的主要原因之一。关于个人电脑而言,大部分同学会挑选运用虚拟机来统筹不同渠道的东西挑选,个人主张咱们最好在熟练把握Linux渠道及其东西的条件下,一起也了解一下其它渠道的处理方案。