结构说明语句
Verilog语言中的任何过程模块都从属于以下四种结构的说明语句。
1) initial说明语句
2) always说明语句
3) task说明语句
4) function说明语句
initial和always说明语句在仿真的一开始即开始执行。initial语句只执行一次。相反,always语句则是不断地重复执行,直到仿真过程结束。但always后面的过程块是否运行,则要看它的触发条件是否满足。
在一个模块中,使用initial和always语句的次数是不受限制的,它们都是同时开始运行的。
//所有结构说明语句都是并行的,同时开始运行的,这是硬件语言的特点。
1) initial说明语句
initial语句的格式如下:
initial
begin
语句1;
语句2;
......
语句n;
end
2) always说明语句
always语句在仿真过程中是不断重复执行的。其声明格式如下:
always <时序控制> <语句>
always语句由于其不断重复执行的特性,只有和一定的时序控制结合在一起才有用。如果没有时序控制,由于always的重复运行特性,语句将产生死锁。当多个信号都能触发always事件时,Verilog中用“or”或者“,”来连接事件,被连接的信号名被称为敏感列表。也可以使用符号@*和@(*)来表示后面语句块中所有输入变量的变化是敏感的。
沿触发的always块常常描述时序逻辑,如果符合可综合风格要求可用综合工具自动转换为表示时序逻辑的寄存器组和门级逻辑,而电平触发的always块常常用来描述组合逻辑和带锁存器的组合逻辑,如果符合可综合风格要求可转换为表示组合逻辑的门级逻辑或带锁存器的组合逻辑。
//initial块内的语句只执行一次,不符合电路的运行模式,因此是不可综合的,它一般用来初始化赋值。always块内的数据是可以反复执行的,一般写成always@(posedge clk or negedge reset)或者always@*的形式来分别表示时序逻辑和组合逻辑。
3) task说明语句
定义任务的语法如下:
task <任务名>;
<端口及数据类型声明语句>
<语句1>
<语句2>
.....
<语句n>
endtask
启动任务并传递输入输出变量的声明语句的语法如下:
任务的调用:<任务名>(端口1,端口2,...,端口n)
4) function说明语句
Verilog模块中使用函数时是把它当作表达式中的操作符,这个操作符的结果值就是这个函数的返回值。
定义函数的语法:
function <返回值的类型或范围> (函数名);
<端口说明语句>
<变量类型说明语句>
begin
<语句>
........
end
endfunction
当声明函数时,Verilog的仿真器都会隐含地声明一个同名的寄存器变量,函数的返回值通过这个寄存器传递回调用处。
函数的调用是通过将函数作为表达式中的操作数来实现的。其调用格式如下:
<函数名> (<表达式><,<表达式>>*) 其中函数名作为确认符。
函数的使用规则:
1) 函数的定义不能包含有任何的时间控制语句,即任何用#、@、或wait来标识的语句。
2) 函数不能启动任务。
3) 定义函数时至少要有一个输入参量。
4) 在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内
部变量具有和函数名相同的名字。
Verilog中函数是不能进行递归调用的。设计模块中若某个函数在两个不同的地方被同时并发调用,由于这两个调用同时对同一块地址空间进行操作,那么计算结果将是不确定的。
如果在函数声明时使用了关键字automatic,那么该函数将成为自动的或者可递归的,即仿真器为每一次函数调用动态地分配新的地址空间,每一个函数调用对各自的地址空间进行操作。因此,自动函数中声明的局部变量不能通过层次名进行访问。而自动函数本身可以通过层次名进行调用。
任务和函数的不同点:
(1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
(2) 函数不能启动任务,而任务可以启动其他任务和函数。
(3) 函数至少要有一个输入变量,而任务可以没有或者有多个任何类型的变量。
(4) 函数返回一个值,而任务则不返回值。
//函数和任务的区别是笔试、面试常考点;在验证中也需要理解应用这一块知识点。
标签:语句,逻辑,函数,always,initial,说明,verilog From: https://www.cnblogs.com/amxiang/p/16756785.html