如何提高Verilog代码编写水平?



By
jonson
08 3 月 24
0
comment

在IC设计端的诸多岗位中,只要提到基础知识和必备技能,就一定少不了Verilog。

按照20年芯片设计老兵的说法“1. 知道module的基本框架。2. 知道怎么写assign,和always块。3. 其他没有了。”

也就是说用VerilogHDL做设计不要追求花架子,要多花心思在电路设计上。

Verilog是什么?

Verilog HDL是目前世界上最流行的硬件描述语言之一,是用文本形式来描述数字系统硬件的结构和行为的语言。

使用Verilog能够清楚地展现逻辑电路图、表达式等等,还可以用来表示数字逻辑系统所完成的逻辑功能。 (需要借助EDA工具)

Verilog为何诞生?

IC行业诸多工具、岗位的出现,都是源于行业和市场的需求。

电路设计复杂度的不断提高,传统的电路原理图设计方法的工作量越来越大。但与之对应的是:设计效率和正确性不断降低,验证的难度不断提高。这样的现状已经无法满足市场对于IC产品高性能、低功耗、快上市的需求。1985年,Gateway Design Automation公司为其仿真器产品Verilog-XL开发了Verilog语言。1989年,Cadence收购Gateway公司,并继续推广Verilog语言。后来Verilog受到了越来越多工程师的欢迎,IEEE也制定了Verilog IEEE标准。

Verilog有何特点?

Verilog的语法风格类似于C语言,对于有C语言基础的同学来说,还是比较友好的。但是Verilog和C还是有本质上的区别,C语言是一种软件开发语言,主要是控制硬件实现某些功能。而Verilog作为硬件描述语言,其实最终还是为了产生实际的硬件电路或者对硬件电路进行仿真。

【示例1】

左边是与门电路符号,右边是把左边电路转换成verilog描述。

【示例2】

左边是异步复位触发器电路,右边是把触发器电路转换成verilog描述。也就是说,Verilog的代码并不仅仅是一行行代码,而是一块一块硬件模块。

基本语法介绍

Verilog语言采用模块化设计,以模块集合的形式来描述数字系统。模块(module)可以理解为verilog HDL语言的基本描述单位,它用于描述某个电路的功能或结构,以及该模块和其他模块通信的输入输出端口。模块支持层次嵌套,一个模块可由若干子模块构成,模块所构建的硬件电路可以是基本门电路也可以是一个复杂的系统电路。每个模块必须以module开头,以endmodule结尾;设计模块还需要定义端口,用input、output、inout分别描述输入、输出、双向端口;模块中间的Verilog程序的书写类似C语言,每条语句以分号结束;使用“/*…*/”和“//”可以对多行或一行程序进行注释。

1. 用assign描述持续赋值

assign语句一般用于组合逻辑电路赋值,也称之持续赋值,例如下图电路结构可描述为:

assign f=((a&b)|(c&d));

2.用always描述过程块赋值

例:16位的计数器模块设计

3. 模块实例化(调用模块)

Verilog中一个模块调用另一个模块是通过实例化来实现的,这样就能建立起层次化的设计结构。

例如在其他模块调用上面的16位计数器模块。

如何提高Verilog编码水平?

Verilog是IC设计工作中必不可少的。首先一定要熟悉最基本的语法知识,对于技术类的岗位来说,只学基础知识显然是不够的,还需要不断练习和仿真,养成良好的代码编写习惯。

作为芯片设计端的工程师,心中对于要实现的电路必须门清。

“至少你必须在头脑中把RTL级的行为构建出来。然后再用assign (组合逻辑)加always (时序逻辑)把你的想法描述出来。”

这里给新手几条建议:深入理解Verilog概念和语法;实践编写代码;阅读和分析优秀的代码;调试和验证代码;参与开源项目和社区,多交流多学习。

最重要的还是“心中有电路”,Verilog也好、EDA也好,都只是实现电路的工具。工具的掌握是基本功,长期下功夫还是要在电路结构和电路设计上。

发表回复