注意:此题是时钟下降沿有效
functipon语法:function用于返回一个值
function<返回值范围><返回值类型>函数名(端口声明);
本地变量
过程块、语句组
endfunction
*注意 function中不能使用非阻塞赋值"<="以及连续赋值语句"assign xx=xx;",且function至少应该有一个输入
function调用
function隐含的声明了一个与function同名的变量,调用时返回该变量
目标变量 = function(输入变量);
function <返回值的类型或范围> (函数名)
<端口说明语句>
<变量类型说明语句>
begin
<语句>
...
end
endfunction
函数function的使用规则
1.函数的定义不能包含有任何时间控制语句,即任何用#,@,wait来标识的语句;
2.函数不能启动task;
3.定义函数时至少要有一个输入参量;
4.在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋函数的结果值,该变量具有和函数名相同的名字。
2.1 function和task使用与对比
function和task的区别:
(1)任务能调用任务和函数,但是函数只能调用函数,不能调用任务;
(2)任务可以描述组合逻辑和时序逻辑,可以有时延;函数只能描述组合逻辑,仿真时延为0;
(3)任务可以有任意多个各种类型的输入;函数只能有input端口的输入参数,且至少输入一个参数;
(4)任务可以没有返回值;函数必须有一个返回值;
解法一
- `timescale 1ns/1ns
- module function_mod(
- input clk,
- input rst_n,
- input [3:0]a,
- input [3:0]b,
-
- output [3:0]c,
- output [3:0]d
- );
- assign c = data_rev(a);
- assign d = data_rev(b);
-
- function [3:0] data_rev;
- input [3:0] data_in;
- begin
- data_rev[0] = data_in[3];
- data_rev[1] = data_in[2];
- data_rev[2] = data_in[1];
- data_rev[3] = data_in[0];
- end
- endfunction
-
- endmodule
解法二
- `timescale 1ns/1ns
- module function_mod(
- input clk,
- input rst_n,
- input [3:0]a,
- input [3:0]b,
-
- output [3:0]c,
- output [3:0]d
- );
- assign c = rst_n?data_rev(a):0;
- assign d = rst_n?data_rev(b):0;
-
- function [3:0] data_rev;
- input [3:0] data_in;
- integer i;
- for(i=0;i<4;i=i+1)
- begin:reverse
- data_rev[i] = data_in[3-i];
- end
- endfunction
-
- endmodule
解法三:位拼接
- `timescale 1ns/1ns
- module function_mod(
- input clk,
- input rst_n,
- input [3:0]a,
- input [3:0]b,
-
- output [3:0]c,
- output [3:0]d
- );
- assign c = rst_n?data_rev(a):0;
- assign d = rst_n?data_rev(b):0;
-
- function [3:0] data_rev;
- input [3:0] data_in;
- begin
- data_rev = {data_in[0],data_in[1],data_in[2],data_in[3]};
- end
- endfunction
-
- endmodule
解法四:易理解、最简单
- `timescale 1ns/1ns
- module function_mod(
- input clk,
- input rst_n,
- input [3:0]a,
- input [3:0]b,
-
- output [3:0]c,
- output [3:0]d
- );
- assign c = {a[0],a[1],a[2],a[3]};
- assign d = {b[0],b[1],b[2],b[3]};
-
- endmodule