Verilog基础语法快速入门 - 第1节
一、数字电路设计简介
说实话,很多人一上来就学Verilog,却不知道它到底在干什么。这就像学开车却不了解发动机原理——也能开,但出了故障就抓瞎。
数字电路设计,说白了就是用0和1来构建逻辑功能。我们日常用的手机、电脑、路由器,里面全是数字电路。我当年刚入行时,师傅跟我说过一句话,至今记忆犹新:「数字电路设计,就是跟时间和逻辑打交道」。
数字电路分两类:
- 组合逻辑:输出只取决于当前输入。比如与门、或门、加法器。
- 时序逻辑:输出不仅取决于当前输入,还取决于历史状态。比如触发器、计数器、状态机。
嗯,这里要注意:实际项目中,90%以上的设计都是时序逻辑。组合逻辑只是时序逻辑的「零件」。
核心观点:Verilog不是软件编程语言,它是用来描述硬件行为的。你写的每一行代码,最终都会变成真实的门电路。这个思维转变,是初学者最大的坎。
二、Verilog历史与作用
Verilog诞生于1984年,由Gateway Design Automation公司开发。后来被Cadence收购,再后来成为IEEE标准(IEEE 1364)。
你可能要问:为什么不是VHDL?其实两者都是硬件描述语言,但Verilog更接近C语言风格,上手更快。我个人习惯用Verilog,因为它的语法更简洁,写起来不啰嗦。
Verilog的作用,说白了就三件事:
- 描述:用代码描述数字电路的行为和结构
- 仿真:在电脑上验证设计是否正确
- 综合:把代码转换成真实的门级网表
我在项目中遇到过一位同事,他写Verilog就像写C语言——全是for循环和while循环。结果综合出来的电路面积大得吓人,根本没法用。所以记住:写Verilog时,脑子里要想着硬件。
小技巧:初学Verilog,建议先用手画电路图,再写代码。等熟练了,就可以直接在脑子里「画」电路了。
三、模块化设计思想
模块化设计,是数字IC设计的基石。你想想看,一个芯片动辄上亿个晶体管,如果不用模块化,根本没法管理。
模块化设计的核心思想就四个字:分而治之。把大系统拆成小模块,每个模块独立设计、独立验证,最后再拼起来。
我一般把模块分成三个层次:
| 层次 | 说明 | 例子 |
|---|---|---|
| 顶层模块 | 整个芯片的对外接口 | CPU芯片的引脚定义 |
| 功能模块 | 实现具体功能 | ALU、寄存器堆、Cache |
| 基础单元 | 最底层的逻辑单元 | 与门、或门、触发器 |
模块化设计的好处很明显:
- 复用:写好的模块可以在不同项目里重复使用
- 调试:出问题了,可以快速定位到具体模块
- 团队协作:每个人负责一个模块,互不干扰
我曾经在一个项目中,因为顶层模块和子模块的接口没对齐,导致整个芯片功能紊乱。排查了整整三天才找到问题。从那以后,我每次写模块都会先画接口图,再动手写代码。
避坑指南:模块的接口越简单越好。我曾经见过一个模块有50多个端口,调试起来简直噩梦。一般来说,一个模块的端口不要超过20个。
四、第一个Verilog程序:半加器
好了,理论说够了,我们来写第一个Verilog程序——半加器。
半加器是什么?就是两个二进制位相加,产生一个和(Sum)和一个进位(Carry)。真值表如下:
| A | B | Sum | Carry |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
从真值表可以看出:Sum = A XOR B,Carry = A AND B。就这么简单。
下面是用Verilog实现的半加器代码:
module half_adder (
input wire a, // 输入a
input wire b, // 输入b
output wire sum, // 和
output wire carry // 进位
);
// 用连续赋值语句描述组合逻辑
assign sum = a ^ b; // 异或运算
assign carry = a & b; // 与运算
endmodule
这段代码虽然短,但包含了Verilog最重要的几个概念:
- module/endmodule:模块定义,所有Verilog代码都在这个框架里
- input/output:端口方向定义
- wire:线网类型,用于组合逻辑
- assign:连续赋值语句,描述组合逻辑
- ^ 和 &:位运算符,分别表示异或和与
我个人习惯在写模块时,把端口声明和内部逻辑分开。这样代码结构清晰,别人一看就懂。
小提示:初学者最容易犯的错误是忘记写端口方向。我曾经在代码评审时,看到有人写了20多个端口,结果一半没写方向。这种低级错误,综合工具会报错,但仿真可能不报,特别坑。
五、本章知识体系
下面这张图展示了本章的核心知识结构,我特意用SVG画出来,方便你理解:
这张图把本章的四个核心知识点串起来了。从数字电路基础,到Verilog语言本身,再到设计方法学,最后落到一个具体的半加器实例。你学完这一章,应该能回答三个问题:
- 数字电路是什么?
- Verilog能干什么?
- 怎么写一个最简单的Verilog模块?
如果这三个问题你都能答上来,恭喜你,入门了。
总结一下:这一章我们讲了数字电路的基本概念,了解了Verilog的来龙去脉,学习了模块化设计思想,最后亲手写了一个半加器。虽然半加器很简单,但它包含了Verilog最核心的语法要素。后面的内容,都是在这个基础上不断扩展。
可可精品资料库