一. 模块例化
“.”表示端口;后面紧跟端口名,其名称必须与所例化的模块定义的端口名一致;小括号内的信号名为与该端口连接的信号线名,可以用别的名称,但必须在本模块中定义,说明其类型。
二. 数据类型及其常量和变量
1. 常量
- 数字
1).整数
2).x和z值
3).下划线
4).ASCII值 - 参数型(parameter)
在Verilog中用parameter来定义常量。如:
parameter msb=7//定义参数msb为常量7
2. 变量
- wire型
wire型数据常用来表示assign关键字指定的组合逻辑信号
Verilog程序模块中输入,输出信号类型默认时自动定义为wire型
wire a;//定义了一个1位的wire型数据
wire [7:0] b;//定义了一个8位的wire型数据
- reg型
寄存器数据类型的关键字reg,reg类型数据的默认初始值为不定值x。
在always模块内被赋值的每一个信号都必须定义成reg型
reg a;//定义了一个1位的名为a的reg型数据
reg[3:0]b;//定义了一个4位的名为b的reg型数据
- memory型
memory型数据是通过扩展reg型数据的地址范围来生成的,举例说明:
reg[7:0] mema[255:0];//定义了一个名为mema的存储器,该存储器有256个8位存储器,该存储器的地址范围是0到255
三.运算符及表达式
1.基本运算符
- +(加法运算符)
- -(减法运算符)
- *(乘法运算符)
- /(除法运算符)
- %(求余运算符)
主要注意一下除法和求余运算符。举例说明
10%3 结果等于1(10除以3,余数等于1)
11%3 结果等于2(11除以3,余数等于2)
10/3 结果等于3(10除以3,商等于3)
11/3 结果等于3(11除以3,商等于3)
2.位运算符
- ~(按位取反)
举例说明:
a=4'b1010//a的初值为4'b1010
a=~a;//a的值进行取反运算后变为4'b0101
- & (按位与)
- |(按位或)
- ^(按位异或)
举例说明:
a=1;b=0;a^b=1;//当a,b不相等时,a异或b便等于1
a=1;b=1;a^b=0;//当a,b相等时,a异或b便等于0
- ^~ (按位同或)
3.逻辑运算符
- && 逻辑与
- || 逻辑或
- !逻辑非
- 移位运算符
1).<<(左移运算符)
举例说明:
reg[3:0] start,result;
start=1;//start在初始时刻值为4'b0001
result=(start<<2);//移位后,start的值为0100,然后赋值给result
在这个例子中可以看出,start在移位两位后,是用0来填补空出的位,进行移位运算时应注意移位前后变量的位数,如下:
4'b1001<<1=5'b10010;
4'b1001<<2=6'b100100;
1<<6=32'b1000000;//在没有指定位宽时,默认为32位
4'b1001>>1=4'b0100;
4'b1001>>4=4'b0000;
- 位拼接运算符
用这个运算符可以把两个或多个信号的某些位接接起来进行运算操作。
举例说明:
{a,b[3:0],w,3'b101}
,在位拼接表达式中不允许存在不有指明位数的信号。位拼接可以用重复法来简化表达式,见下例:
{4{w}}//等同于{w,w,w,w}
位拼接还可以用嵌套的方式来表达。见下例:
{b,{3{a,b}}}//等同于{b,a,b,a,b,a,b}
四.赋值语句和块语句
在Verilog语言中,信号有两种赋值方式:
1.非阻塞赋值方式(如b<=a)
注意:非阻塞赋值符"<=“与小于等于”<="看起来是一样的,但是意义完成不同,小于等于是关系运算符,用于比较大小,而非阻塞赋值符用于赋值操作
2.阻塞赋值方式(如b=a)
两种赋值方式的区别在于:非阻塞赋值方式主要用于时序逻辑,比如always块语句。阻塞赋值方式主要用于组合逻辑,比如assign语句
五.产生仿真测试信号的Verilog建模
为了对已设计的模块进行检验往往需要产生一系列的信号,输入到已设计的模块,并检查已设计模块的输出,看它们是否符合设计要求。这就要求编写测试模块,也称做测试文件。用这种方法所建立的模型主要用于产生仿真时测试下一级电路所需的信号,如下一级电路有输出反馈到上一级电路,并对上一级电路有影响时,也可以在这个模型中再加入输入信号,用于接收下一级电路的反馈信号。
六.语言指导原则
1.posedge表示上升沿触发,negedge表示下降沿触发,比如always@(posedge clk or negedge rst_n)//表示在clk的上升沿或rst_n的下降沿触发执行always块内的语句。