function
function与C语言定义子函数很像,以function关键字开头,以endfunctuon结束。
function <返回值位宽或类型说明> 函数名;
端口声明;
局部变量定义;
其他语句;
endfunction
function后跟着返回值(函数名)及其位宽,然后定义输入input,可以有多个Input,但是只有一个输出,输出就是返回值。
然后以begin开始function的逻辑语句,如果逻辑比较复杂,则在begin之前,input之后定义中间变量。
begin里面可以调用过程赋值语句,如case,if-else等。
function是定义在一个module内部的,可以在always或者assign语句里调用。
调用方式为函数名接括号,括号内部依次填写定义的输入值。
functon通常用来描述组合逻辑,整个function内部的语句不能加入等待,不能有时延,如#200,wait,@posedge clk等,所以语句都是在一个时间点顺序执行完毕,在仿真上可以认为不消耗时间。
如果想定义多个输出,可以把增大返回值位宽,将多个输出连接成一个变量。
task
task与function类似,区别在于可以由多个input及多个output,函数描述部分可以加入延时。
function是定义在一个module内部的,可以在task内部可以直接访问module内部定义的reg类型的变量。task可以彼此调用,而且task内部还可以调用function。
在task定义的描述语句中,可以使用出现不可综合操作符合语句(使用最为频繁的就是延迟控制语句),但这样会造成该task不可综合。
在task定义结构内不能出现 initial和 always过程块。