目录
initial语句:
always语句:
task和function说明语句:
task和function说明语句的不同点:
task说明语句:
function说明语句:
Verilog语言中的任何过程模块都从属于以下四种结构的说明语句:
1) initial说明语句
2) always说明语句
3) task说明语句
4) function说明语句
initial和always说明语句在仿真的一开始即开始执行。initial语句只执行一次。相反,always语 句则是不断地重复执行,直到仿真过程结束。在一个模块中,使用initial和always语句的次数是不 受限制的。task和function语句可以在程序模块中的一处或多处调用。
initial语句:
initial语句的格式如下:
例:
从这个例子中,我们可以看到initial语句的另一用途,即用initial语句来生成激励波形作为电路的 测试仿真信号。一个模块中可以有多个initial块,它们都是并行运行的。initial块常用于测试文件 和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。
always语句:
always语句在仿真过程中是不断重复执行的。 其声明格式如下:
always语句由于其不断重复执行的特性,只有和一定的时序控制结合在一起才有用。如果一个always 语句没有时序控制,则这个always语句将会发成一个仿真死锁。见下例:
这个always语句将会生成一个0延迟的无限循环跳变过程,这时会发生仿真死锁。如果加上时序控制, 则这个always语句将变为一条非常有用的描述语句。见下例:
这个例子生成了一个周期为:period(=2*half_period) 的无限延续的信号波形,常用这种方法来描 述时钟信号,作为激励信号来测试所设计的电路。
这个例子中,每当areg信号的上升沿出现时把tick信号反相,并且把counter增加1。这种时间控制是 always语句最常用的。
always 的时间控制可以是沿触发也可以是电平触发的,可以单个信号也可以多个信号,中间需要用 关键字 or 连接,如:
沿触发的always块常常描述时序逻辑,如果符合可综合风格要求可用综合工具自动转换为表示时序逻 辑的寄存器组和门级逻辑,而电平触发的always块常常用来描述组合逻辑和带锁存器的组合逻辑,如 果符合可综合风格要求可转换为表示组合逻辑的门级逻辑或带锁存器的组合逻辑。一个模块中可以有 多个always块,它们都是并行运行的。
task和function说明语句:
task和function说明语句分别用来定义任务和函数。利用任务和函数可以把一个很大的程序模块分解 成许多较小的任务和函数便于理解和调试。输入、输出和总线信号的值可以传入、传出任务和函数。 任务和函数往往还是大的程序模块中在不同地点多次用到的相同的程序段。学会使用task和function 语句可以简化程序的结构,使程序明白易懂,是编写较大型模块的基本功。
task和function说明语句的不同点:
1) 函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
2) 函数不能启动任务,而任务能启动其它任务和函数。
3) 函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量。
4) 函数返回一个值,而任务则不返回值。
task说明语句:
如果传给任务的变量值和任务完成后接收结果的变量已定义,就可以用一条语句启动任务。任务完成 以后控制就传回启动过程。如任务内部有定时控制,则启动的时间可以与控制返回的时间不同。任务 可以启动其它的任务,其它任务又可以启动别的任务,可以启动的任务数是没有限制的。不管有多少任务启动,只有当所有的启动任务完成以后,控制才能返回。
- 定义任务的语法如下:
- 启动任务并传递输入输出变量的声明语句的语法如下:
- 下面的例子说明怎样定义任务和调用任务:
任务调用变量(v,w,x,y,z)和任务定义的I/O变量(a,b,c,d,e)之间是一一对应的。当任务启动时,由 v,w,和x.传入的变量赋给了a,b,和c,而当任务完成后的输出又通过c,d和e赋给了x,y和z。
function说明语句:
函数的目的是返回一个用于表达式的值。
请注意这一项是可选项,如缺省则返回值为一位寄存器类型数据。下面用例子说明:
- 从函数返回的值:
函数的定义蕴含声明了与函数同名的、函数内部的寄存器。如在函数的声明语句中为缺省,则这个寄存器是一位的,否则是与函数定义中一致的寄 存器。函数的定义把函数返回值所赋值寄存器的名称初始化为与函数同名的内部变量。
- 函数的调用:
- 函数的使用规则
1) 函数的定义不能包含有任何的时间控制语句,即任何用#、@、或wait来标识的语句。
2) 函数不能启动任务。
3) 定义函数时至少要有一个输入参量。
4) 在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内 部变量具有和函数名相同的名字。
下面的例子中定义了一个可进行阶乘运算的名为factorial的函数,该函数返回一个32位的寄存器类 型的值,该函数可后向调用自身,并且打印出部分结果值。