相信不少人都听过verilog这个词,今天我就想讲一讲我所理解的verilog是什么。
Verilog是一种硬件描述语言,它最基本的功能,就是把一份电路图用代码的形式表示出来,然后让计算机理解一份代码所对应的电路。硬件描述语言有很多,现在主流的基本就是verilog,或者它的升级版systemverilog。之前上学的时候还接触过VHDL,但现在好像慢慢地没什么人在用了。
Verilog代码和C、Java这种计算机编程语言有本质的不同,verilog里基本所有写出来的东西都会对应实际的电路。声明变量的时候如果指定是一个reg,那么这个变量就有寄存数值的功能,可以综合出来一个实际的寄存器;如果指定是一段wire,那么他就只能传递数据,只是表示一条线。在verilog里写一个判断可能就对应了一个mux,写一个for可能就是把一段电路重复好几遍(这在电路设计中是不太实用的,for语句也好像只在systemverilog中才支持)。最能体现电路设计思想的就是always块了,它可以指定某一个信号在某个值或某个跳变的时候执行块里的代码。总之,前端工程师写verilog代码的目的,就是要对应出一个实际的电路出来,这个电路会完成我们期望的逻辑功能。
但是,人类写出来的verilog代码是高度抽象的,一般人甚至编码者自己也很难把一段verilog代码和实际的电路联系起来。编码者在编写的时候更多的是关心信号的逻辑功能有没有错误,我们会看每一个关键信号的波形,确保输入输出一切正常。至于哪里用了一个三输入与门或者两个二输入与门我们不会去关心。一般就把这些人类写出来的很抽象的代码叫做verilogRTL代码,RTL是registertransitionlevel。
RTL代码要翻译给机器看懂,还要经过synthesis(综合)这一步。这一步是tool完成的,它表示就把RTL变成最基本的逻辑门连接的形式,还是以verilog的格式写出来,一般我们就称综合后的verilog为网表文件,或者叫netlist。综合的时候已经要开始考虑芯片PPA的性能了,要知道,一段逻辑相同的电路,可能有很多种实现方式。比如说一个逻辑表达式可以写成与非的形式,也能写成或非形式,对应的电路可能就是与非门或者或非门。而对于同一种电路,选用的cell可能也不一样,同样是一颗buffer,要选驱动能力多大的、开启电压选多大的等等也有很多讲究。
后端在拿到netlist就可以布局布线了,我们后端在做的时候netlist也不是会一成不变的,我们会在确保逻辑功能不变的前提下对netlist进行改动。但是,改动之后必须要和改动前的netlist对比检查,确保没有改它的逻辑才行。这一步有时候我们就会称为formal检查,formality就是一个可以用来做这种检查的工具,synopsys家的。实际上,前端在综合前后也会做类似的检查。