module、task、function区别与应用举例

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

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极光sdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值