module、task、function区别与应用举例
前言
module、task、function区别与应用举例
一、module
1.作用:
完成不同模块之间的数据流输入输出,完成交互;
2.三个的区别:
module是这三个中最广泛,级别最高的模块,他可以实现Verilog的一切功能,兼容最大;
1.可以包含initial、always块等等模块;
2.可以包含时间延迟控制语句比如#,repeat,@(posedge clk)等的调用;
3.可以调用其他的module、task、function,实现模块的连接与灵活调用;
3.格式:
module 模块名称 (input 端口1,
input 端口2,
.....
output 端口,
output 端口);
wire
reg
assign
always@(*)begin end
always@(posedge clk)begin end
initial begin end
task
function
#5;
@(posedge clk);
repeat()
.....
module 其他模块例化();
endmodule
4.注意:
主要注意所有未定义端口默认为wire,连续赋值用assign
而出现在always中的或者initial等模块中的变量用reg
且不在这些块中的变量也有情况用reg;
5.实例:
module addr_2(
input [3:0]A,
input[3:0]B,
output [3:0]C);
initial
begin
#5;
A=5;B=6;
task addr(A,B,C);
#5;
A=5;B=6;
task addr(A,B,C);
end
task addr;
input[]3:0] A;
input[3:0]B;
output [3:0]C;
wire C;
assign C=addr_function(A,B);
endtask
function [3:0] addr_function;
input[3:0] A;
input[3:0] B;
begin
addr_function=A+B;
end
endfunction
endmodule
二、task
1.作用:
task是为了让代码更清晰,且可以复用提高代码的编写效率,减小冗余的关键模块;
2.三个的区别:
1.他不可以包含initial、always块;
2.可以包含时间延迟控制语句比如#,repeat,@(posedge clk)等的调用;
3.可以调用其他的task以及自身、function,相当于一个阉割了部分功能的module,他的格式与module基本类似,也包含接口定义;
3.格式:
与module类似就是module与endmodule换成task与endtask
且没有大括号描述输入输出值,第一行直接task名称加;
task task名称;
input /output描述
操作语句
endtask
4.注意:
1.第一行跟module写法有所不同,module是(input ,output );
task是task 名称;
2.输入输出端口没有限制,可以没有输入输出,这个与function也有不同,function要求有返回值,思考一下,task只是个任务,做任务完成即可可以不用得到什么,function是函数必须经过运算要得到一个函数值,而module是一个交互模块必须有进有出才合理,这里是最大的不同;
5.实例:
module addr_2(
input [3:0]A,
input[3:0]B,
output [3:0]C);
initial
begin
#5;
A=5;B=6;
task addr(A,B,C);
#5;
A=5;B=6;
task addr(A,B,C);
end
task addr;
input[]3:0] A;
input[3:0]B;
output [3:0]C;
wire C;
assign C=addr_function(A,B);
endtask
function [3:0] addr_function;
input[3:0] A;
input[3:0] B;
begin
addr_function=A+B;
end
endfunction
endmodule
三、function
1.作用:
function也是为了让代码更清晰,且可以复用提高代码的编写效率,减小冗余的关键模块;
2.三个的区别:
1.不可以包含initial、always块;
2.不可以包含时间延迟控制语句比如#,repeat,@(posedge clk)等的调用;
3.不可以调用task,仅仅能实现组合逻辑,返回值也仅仅只能应用于组合逻辑;
3.格式:
代码如下(示例):
function <返回值的类型或者范围> <函数名>
<端口说明语句>
<变量类型说明>
begin
<语句>
end
endfunction
调用格式(定义)
wire 变量
assign 变量=函数名(输入值);
4.注意:
1.function返回值类型可以不写,系统默认为reg型;
2.返回值只能应用于组合逻辑;
3.不能包含时间延迟控制语句;
4.不能调用task,更不用说级别更高的module(原因是这里面含有时间控制语句);
5.至少有一个input;
5.实例:
module addr_2(
input[3:0] A,
input[3:0] B,
output[3:0] C);
wire C;
assign C=addr(A,B);
function [3:0] addr;
input [3:0] A;
input [3:0] B;
begin
add=A+B;
end
endfunction
endmodule
总结
等级 module>>task>>function