一、数据类型
在Verilog语言中主要有三大数据类型:寄存器数据类型、线网数据类型、参数数据类型
1、寄存器数据类型
关键字:reg,reg类型数据默认初始值为不定值X;需要注意的是reg类型的数据只能在always语句和initial语句中被赋值。
reg [31:0] delay_cnt;
reg key;//默认位宽为1
如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器;如果该过程描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线;
2、线网数据类型
关键字:wire和tri;最常见的是wire类型
wire key_flag;//默认位为1位(设计变量位宽与reg相同)
线网数据类型表示结构实体之间的物理连线;线网类型的变量不能存储值,它的值是由驱动它的元件所决定,能够驱动线网类型变量的元件有门、连续赋值语句、assign等。如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻的,即其值为Z。
3、参数数据类型
关键字:parameter;参数其实就是一个常量,可以一次定义多个参数,参数与参数之间需要用逗号隔开,且每个参数定义的右边必须是一个常数表达式。
parameter SYS = 4'd2;
参数类型的数据常用于定义状态机的状态、数据位宽和延迟大小等。采用标识符来代表一个常量可以提高代码的可读性和维护性。
二、运算符
1、算数运算符
+ 加
- 减
* 乘
/ 除(只能实现整除)
% 模除(求余)
2、关系运算符
> 大于
< 小于
<= 小于等于
>= 大于等于
== 等于
!= 不等于
3、逻辑运算符
! 非
&& 与 (a&&b 如果a和b都为1,结果才为1,表示真)
|| 或(a||b 如果a或者b有一个为1,结果为1,表示真)
4、条件运算符
?: a?b:c (如果a为真,就选择b,否则选择c)
5、位运算符
~ 取反
& 与(按位与)
| 或(按位或)
^ 异或(按位异或)
6、移位运算符
>> 右移 a>>b (将a右移b位)
<< 左移 a<<b (将a左移b位)
7、拼接运算符
{} {a,b} 将a和b拼接起来,作为一个新的信号
运算符的优先级:
(从高到低)
! ~
* / %
+ -
<< >>
< <= > >=
== != ==== !==
&
^ ^~
|
&&
||
?:
三、注释方式
Verilog中有两种注释方式 ,一种是//开头的语句,它表示以//开始到本行结束都属于注释语句;另一种是以“/*”开始,以“*/”结束,在两个符号之间的语句都是注释语句。这种注释方式与C语言相同。
四、常用的关键字
- module 模块开始定义
- input 输入端口定义
- output 输出端口定义
- inout 双向端口定义
- parameter 信号的参数定义
- wire wire信号定义
- reg reg信号定义
- always 产生reg信号语句的关键字
- assign 产生wire信号语句的关键字
- begin 语句的其实标志
- end 语句的结束标志
- edge/posedge/negedge 时序电路的标志
- case case语句起始标记
- default case语句的默认分支标志
- endcase case语句结束标记
- if if/else语句标记
- else if/else语句标记
- for for语句标记
- endmodule 模块结束定义
五、程序框架
Verilog基本的设计单元是模块(block);一个模块由两个部分组成,一部分描述端口,另一部分描述逻辑功能。
每一个Verilog程序包括4个主要的部分:端口定义、IO说明、内部信号声明、功能定义。
功能定义部分有三种方法:
1、assign语句:描述组合逻辑电路
2、always语句:描述组合/时序逻辑
3、例化实例元件:如and#2 u1(q,a,b);
需要说明的是上述三种逻辑功能是并行的