闲言稍叙
Verilog和VHDL就是目前使用最多的两个硬件描述语言(HDL),如果阅读本文的你也是Verilog新手,这部分闲言或许对你有所启发。
作者本科是计算机科学与技术专业,现在是准研一,方向和硬件相关。
由于学艺不精,只会点C、Java,电路、信号、单片机等硬件课程都只懂皮毛。由于课题组研究需要,学习了Verilog语言并总结为本文。
C语言是软件描述语言,编码的核心目的在于经过编译、链接后能够产生机器能够识别的指令序列,进而完成代码功能。而Verilog是硬件描述语言,编码的核心目的在于描述门与门之间的连接,通过综合、实现所写的代码,产生可以转化为芯片的图纸,交由厂商通过光刻来生产所设计的电路,最终经过封装、测试,即通常所称的芯片。
要学习Verilog首先需要一个编程平台,有Vivado、Modelsim等,其中Vivado是用的最多的,但是运行比较慢,Modelsim运行的快,但是界面丑,这个看个人喜好安装就好。
有编程平台后,通过在网站上刷题和看书,逐渐就可以上手了。那么下面列举出我学习Verilog所使用过的网站、书籍:
网站:
1.HDLBits
网站地址
该网站是全英文的,里面有100多道练习题,题解可以在Github上找到。
2.VLab Verilog OJ
网站地址
这是由中科大团队开发的Verilog在线评测系统,类似于软件编程的洛谷等网站。
其中每个题都会给出比较充分的知识点叙述,然后再让你动手编码,目的在于帮助大家学习Verilog。
有挺多的简单题,适合我这样的零基础菜鸟,但这个网站没有题解,网上只能查到前27题的题解。
其他网站:
- 菜鸟教程(有Verilog的内容,但没有OJ)
- EDA Playground(英文网站,可以在线运行代码,很流畅)
书籍
-
《EDA技术与Verilog HDL》 王金明编著 清华大学出版社
这本书是基于Vivado平台的,讲了Vivado的基本操作、Verilog语法和一些实例,硬件用EGO1实验板。 -
《自己动手写CPU》 雷思磊 电子工业出版社
这本书是基于Modelsim平台的,主要是使用Verilog设计能运行mips32指令的处理器。 -
《Vivado入门与FPGA设计实例》 廉玉欣 侯博雅编著 电子工业出版社
这本书也是基于Vivado和EGO1的,介绍了不少组合逻辑和时序逻辑的基本器件设计,如加法器设计。
一、简介
Verilog HDL(Hardware Description Language)是IC设计者常用的两种HDL之一,另一种是VHDL,通过比较Verilog和C语言的区别可以更好地理解它。
Verilog和C语言的区别:
- 描述对象不同:
Verilog语法和C接近,但C描述的是算法逻辑,依赖于硬件对其进行实现。而Verilog是硬件描述语言,描述的是硬件本身。 - 处理方式不同:
C需要经过编译、汇编、链接来将代码转化为可由计算机执行的二进制代码,而Verilog则需要经过综合来生成描述门与门之间互联关系的网表文件。 - 执行方式不同:
Verilog的部分描述语句可以并行执行,而C只能串行执行。
二、模块
2.1 模块是Verilog的设计实体
Verilog的基本设计思想是自顶向下(top-down),设计实体是模块,所有Verilog代码都将在模块内书写。
如下图所示,先定义顶层模块,分析顶层模块中所需的各个子模块,然后进一步对各个子模块进行分解和设计,最终可以将一个大的系统分解为多个子系统。
在Verilog中,成熟的、封装好的模块称为IP(intelligent property),调用已有IP的本质就是模块实例化。

2.2 模块声明
模块是Verilog的基本设计实体,模块声明的第一行指定了模块名称和端口列表,下面若干行指定了每个端口的方向、位宽、数据类型。
例如定义一个32位加法器模块:
module add32(in1,in2,out);
input wire[31:0] in1,in2;
output wire[31:0] out;
assign out=in1+in2;
endmodule
其中in1,in2,out是该模块的三个端口,采用上述代码较为简洁,也可以采用如下定义:
module add32(
input wire[31:0] in1,
input wire[31:0] in2,
output wire[31:0] out
);
assign out=in1+in2;
endmodule
2.3 模块的实例化
模块实例化有两种方式,
一是按照名称:
.模板中端口名称 (要连接到端口的线名),
二是按照位置
和定义时一一对应
下面我们将在top_module顶层模块中实例化mod_a,如图所示:

其中mod_a实现的功能是将输入的a、b、c、d四个信号相与、相或,赋给out1和out2,mod_a的声明如下:
module mod_a(
output out1, out2,
input in1,in2,in3,in4
);
assign out1 = in1 & in2 & in3 & in4;
assign out2 = in1 | in2 | in3 | in4;
endmodule
在top_module中两种实例化mod_a模块的代码如下:
module top_module(
input a,
input b,
input c,
input d,
output out1,
output out2
);
//基于端口位置的实例化如下
mod_a inst_1(
out1,out2,a,b,c,d
);
//基于端口名称的实例化如下
mod_a inst_2(
.out1(out1),
.out2(out2),
.in1(a),
.in2(b),
.in3(c),
.in4(d

本文详细介绍了Verilog的基础知识,包括模块、基本要素、行为语句和Testbench。通过实例解析了模块声明、实例化、变量声明、运算符的使用,以及如何编写Testbench来验证设计。此外,还探讨了时钟和复位信号的产生方法,以及常用系统函数的应用。
最低0.47元/天 解锁文章
1004

被折叠的 条评论
为什么被折叠?



