Verilog基础语法快速入门 - 第1节

一、数字电路设计简介

说实话,很多人一上来就学Verilog,却不知道它到底在干什么。这就像学开车却不了解发动机原理——也能开,但出了故障就抓瞎。

数字电路设计,说白了就是用0和1来构建逻辑功能。我们日常用的手机、电脑、路由器,里面全是数字电路。我当年刚入行时,师傅跟我说过一句话,至今记忆犹新:「数字电路设计,就是跟时间和逻辑打交道」。

数字电路分两类:

  • 组合逻辑:输出只取决于当前输入。比如与门、或门、加法器。
  • 时序逻辑:输出不仅取决于当前输入,还取决于历史状态。比如触发器、计数器、状态机。

嗯,这里要注意:实际项目中,90%以上的设计都是时序逻辑。组合逻辑只是时序逻辑的「零件」。

核心观点:Verilog不是软件编程语言,它是用来描述硬件行为的。你写的每一行代码,最终都会变成真实的门电路。这个思维转变,是初学者最大的坎。

二、Verilog历史与作用

Verilog诞生于1984年,由Gateway Design Automation公司开发。后来被Cadence收购,再后来成为IEEE标准(IEEE 1364)。

你可能要问:为什么不是VHDL?其实两者都是硬件描述语言,但Verilog更接近C语言风格,上手更快。我个人习惯用Verilog,因为它的语法更简洁,写起来不啰嗦。

Verilog的作用,说白了就三件事:

  1. 描述:用代码描述数字电路的行为和结构
  2. 仿真:在电脑上验证设计是否正确
  3. 综合:把代码转换成真实的门级网表

我在项目中遇到过一位同事,他写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程序 组合逻辑 时序逻辑 描述 仿真/综合 分而治之 接口设计 module assign

这张图把本章的四个核心知识点串起来了。从数字电路基础,到Verilog语言本身,再到设计方法学,最后落到一个具体的半加器实例。你学完这一章,应该能回答三个问题:

  • 数字电路是什么?
  • Verilog能干什么?
  • 怎么写一个最简单的Verilog模块?

如果这三个问题你都能答上来,恭喜你,入门了。

总结一下:这一章我们讲了数字电路的基本概念,了解了Verilog的来龙去脉,学习了模块化设计思想,最后亲手写了一个半加器。虽然半加器很简单,但它包含了Verilog最核心的语法要素。后面的内容,都是在这个基础上不断扩展。

可可精品资料库