0.前
抽象模型分级:
• 系统级(system):用高级语言结构实现设计模块的外部性能的模型。
• 算法级(algorithm):用高级语言结构实现设计算法的模型。
• RTL级(Register Transfer Level):描述数据在寄存器之间流动和如何处理这些数据的模型。
• 门级(gate-level):描述逻辑门以及逻辑门之间的连接的模型。
• 开关级(switch-level):描述器件中三极管和储存节点以及它们之间连接的模型。
1.最基本的数据类型
reg型、wire型、integer型、parameter型
在数字电路中,x代表不定值,z代表高阻值。
一个数字可以被定义为负数,只需在位宽表达式前加一个减号,减号必须写在数字定义表达式的最前面。
在一个模块中改变另一个模块的参数时,需要使用defparam命令。
wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。
reg型数据常用来表示用于“always”模块内的指定信号,常代表触发器。
reg型数据的缺省初始值是不定值。
memory型数据是通过扩展reg型数据的地址范围来生成的。举例说明:
reg [n-1:0] mema[m-1:0];
这个例子定义了一个名为mema的存储器,该存储器有m个n位的存储器。
注意:对存储器进行地址索引的表达式必须是常数表达式。
对memory中的存储单元进行读写操作,必须指定该单元在存储器中的地址。下面的写法是正确的:
mema[3]=0; //给memory中的第3个存储单元赋值为0。
2.运算符及表达式
1) 算术运算符(+,-,×,/,%)
2) 赋值运算符(=,<=)
3) 关系运算符(>,<,>=,<=)
4) 逻辑运算符(&&,||,!)
5) 条件运算符(?:)
6) 位运算符(~,|,^,&,^~):
a) ~ //取反
b) & //按位与
c) | //按位或
d) ^ //按位异或
e) ^~ //按位同或(异或非)
7) 移位运算符(<<,>>)
8) 拼接运算符({ })
9) 其它:
缩减运算符(reduction operator):例如:
reg [3:0] B;
reg C;
C = &B;
相当于:
C =( (B[0]&B[1]) & B[2] ) & B[3];
3.关键词
4.赋值语句和块语句
1)赋值语句
在Verilog HDL语言中,信号有两种赋值方式:
(1).非阻塞(Non_Blocking)赋值方式( 如 b <= a; )
1) 块结束后才完成赋值操作。
2) b的值并不是立刻就改变的。
3) 这是一种比较常用的赋值方法。(特别在编写可综合模块时)
(2).阻塞(Blocking)赋值方式( 如 b = a; )
1) 赋值语句执行完后,块才结束。
2) b的值在赋值语句执行完后立刻就改变的。
3) 可能会产生意想不到的结果。
2)块语句
块语句通常用来将两条或多条语句组合在一起,使其在格式上看更象一条语句。块语句有两种,一种是begin_end语句,通常用来标识顺序执行的语句,用它来标识的块称为顺序块。一种是fork_join语句,通常用来标识并行执行的语句,用它来标识的块称为并行块。
a)顺序块
顺序块有以下特点:
1) 块内的语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。
2) 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
3) 直到最后一条语句执行完,程序流程控制才跳出该语句块。
顺序块的格式如下:
begin
语句1;
语句2;
......
语句n;
end
b.并行块
并行块有以下四个特点:
1) 块内语句是同时执行的,即程序流程控制一进入到该并行块,块内语句则开始同时并行地执行。
2) 块内每条语句的延迟时间是相对于程序流程控制进入到块内时的仿真时间的。
3) 延迟时间是用来给赋值语句提供执行时序的。
4) 当按时间时序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。
并行块的格式如下:
fork
语句1;
语句2;
.......
语句n;
join
5.条件语句
1)if_else语句
if语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
Verilog HDL语言提供了三种形式的if语句。
(1).if(表达式)语句
(2).if(表达式) 语句1
else 语句2
(3).if(表达式1) 语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;
........
else if(表达式m) 语句m;
else 语句n;
若为0,x,z,按“假”处理,若为1,按“真”处理
2)case语句
case语句是一种多分支选择语句,if语句只有两个分支可供选择,而实际问题中常常需要用到多分支选择,Verilog语言提供的case语句直接处理多分支选择。case语句通常用于微处理器的指令译码,它的一般形式如下:
1) case(表达式) <case分支项> endcase
2) casez(表达式) <case分支项> endcase
3) casex(表达式) <case分支项> endcase
case分支项的一般格式如下:
分支表达式: 语句
缺省项(default项): 语句
其中casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。
由于使用条件语句不当在设计中生成了原本没想到有的锁存器:如果用到if语句,最好写上else项。如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了Verilog程序的可读性。
6.循环语句
四种类型的循环语句,用来控制执行语句的执行次数。
1) forever 连续的执行语句。
2) repeat 连续执行一条语句 n 次。
3) while 执行一条语句直到某个条件不满足。如果一开始条件即不满足(为假),则语句一次也不能被执行。
4) for通过以下三个步骤来决定语句的循环执行。
a) 先给控制循环次数的变量赋初值。
b) 判定控制循环的表达式的值,如为假则跳出循环语句,如为真则执行指定的语句后,转到第三步。
c) 执行一条赋值语句来修正控制循环变量次数的变量的值,然后返回第二步。
7.结构说明语句
Verilog语言中的任何过程模块都从属于以下四种结构的说明语句。
1) initial说明语句
2) always说明语句
3) task说明语句
4) function说明语句
8.编译预处理
1)宏定义 `define
用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为:
`define 标识符(宏名) 字符串(宏内容)
2)“文件包含”处理`include
所谓“文件包含”处理是一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。Verilog HDL语言提供了`include命令用来实现“文件包含”的操作。其一般形式为:
`include “文件名”
“文件包含”命令是很有用的,它可以节省程序设计人员的重复劳动。可以将一些常用的宏定义命令或任务(task)组成一个文件,然后用`include命令将这些宏定义包含到自己所写的源文件中,相当于工业上的标准元件拿来使用。
3)时间尺度 `timescale
`timescale命令用来说明跟在该命令后的模块的时间单位和时间精度。`timescale 命令的格式如下:
`timescale<时间单位>/<时间精度>
在这条命令中,时间单位参量是用来定义模块中仿真时间和延迟时间的基准单位的。
4)条件编译命令`ifdef、`else、`endif
条件编译命令有以下几种形式:
1) `ifdef 宏名 (标识符)
程序段1
`else
程序段2
`endif
它的作用是当宏名已经被定义过(用`define命令定义),则对程序段1进行编译,程序段2将被忽略;否则编译程序段2,程序段1被忽略。
2) `ifdef 宏名 (标识符)
程序段1
`endif
Verilog HDL的语法与C语言的语法有许多类似的地方,但也有许多不同的地方。
来源:https://www.cnblogs.com/protogenoi/p/8926993.html