数字IC设计基本上都要学习Verilog,这是从业者的基本功,在数字IC设计岗位面试中就时常会问到verilog的一些问题。之前分享过一Verilog的资料,受到大家的欢迎,时至今日还有不少同学在后台留言获取资料。识别下方二维码获取资料:
今天为大家分享《Verilog语言简介(数字逻辑课程笔记)》,干货满满,点赞收藏。
概念
Verilog是一种硬件描述语言:用形式化方法(文本形式)来描述和设计数字电路和数字系统的高级模块化语言。可编写设计文件、建立电路模型、编写测试文件进行仿真。
数据类型
1.变量值
0:代表逻辑0或否条件;在电路中一般是低电平
1:代表逻辑1或真条件;在电路中是高电平
X:代表未知的逻辑值(可能为0或1);一般是寄存器类型(reg)未初始化
Z:代表一个高阻态;是线型(wire)变量未接驱动
2.wire & reg
wire: 线网; 用来表示硬件单元之间的物理连线
1 wire a;
2 wire b;
3 wire c=1'b0;
reg: 寄存器; 用来表示存储单元
1 reg rstn;
2 initial begin
3 rstn=1'b0;
4 #100;
5 rstn=1'b1;
end
3.向量vector
标量Scalar: 1-bit位宽的线网或寄存器类型
wire n1;
reg d1;
向量Vector:n-bit位宽的线网或寄存器类型
wire [3:0] n0;
reg[3:0] d0;
4.数组Array
在Verilog中允许声明reg, wire, integer, time, real及其向量类型的数组
1 // y is an scalar reg array of depth=12, each 1-bit wide
2 reg y1[11:0];
3 //y is an 8-bit vector net with a depth of 4
4 wire [0:7] y2 [3:0];
5 //y is a 2D array rows=2, cols=4 each 8-bit wide
6 reg [7:0] y3 [0:1][0:3];
存储器:寄存器数组模拟存储器,可用来描述RAM或ROM的行为
module des();
//reg vector 8-bit wide
reg [7:0] mem1;
//8-bit wide vector array with depth=4;
reg [7:0] mem2 [0:3];
//16-bit wide vector 2D array with rows=4, cols=2
reg [15:0] mem3[0:3][0:1];
initial begin
mem=8'ha9;
$display("mem1 = 0x%0h", mem1);
7395486
5.其他类型
integer: 32位宽的通用整型变量,可在对硬件建模时用于其他目的(可综合)
time: 无符号64位宽,可用于存储仿真时间量以进行仿真调试,realtime变量时将时间存储为浮点数(不可综合)
real:实数变量,可存储浮点值, 可以与integer和reg相同的方式进行赋值(不可综合)
string:字符串,存储在reg中, reg变量的宽度必须足够大以容纳字符串(可综合)
模块构建
Verilog的基本设计单元是模块。
模块由四个主要部分组成:
端口定义:module 模块名(端口1,端口2,…)
I/O说明:包括输入(input)、输出(output)和双向(inout)
信号类型声明:声明信号的数据类型和函数声明wire,reg,integer,real,time
功能描述:用来描述设计模块的内部结构和模块端口间的逻辑关系。常用assign语句、always块语句等方法实现
module block1(a,b,c,d);
input a,b,c;
output d;
wire x;
assign d=a|x;
assign x=(b&~c);
endmodule
模块是一个具有特定功能的设计单元,在电路综合时模块会被转换为相应的数字电路
给定模块一组输入,模块会返回一组输出,这意味着模块可以被重复使用,由此来实现更复杂的电路
按照如下形式来实例化模块:
module mod1(input d,...);
//contents of the module
endmodule
module mod2;
wire data;
mod1 u0(.d(data),...);
//contents of the module
endmodule
操作符
操作符也称运算符, 是Verilog HDL预定义的函数符号。
● 在逻辑运算中,如果操作数不止一位,应将操作数作为一个整体来对待;
● 两个不同长度的操作数进行位运算时,将自动按右端对齐,位数少的操作数会在高位用0补齐。
● 关系运算符优先级低于算术运算符,返回结果为逻辑值,0或1或x;
● 等于运算符(= =)和全等运算符(===)的区别: 使用等于运算符时,两个操作数必须逐位相等,结果才为1,若某些位为x或z,则结果为x;使用全等运算符时,若两个操作数的相应位形式上完全一致,则结果为1,否则为0.
文章长度有限,该学习笔记将持续更新,点赞收藏。
来自CSDN秘密果酱博主的,已获博主许可,转载请联系博主。