在高级编程语言中,为了避免在程序中多次重复编写特定的例行程序,可以使用子程序和函数。Verilog语言也提供类似的功能,即Verilog的函数和任务。。它可以把大型程序模块化,从而使代码更加容易理解。。
1。Verilog任务
任务用关键词task声明,以endtask结束。
任务必须包含在调用该任务的模块中。它可以有输入输出端口,任务的端口仅用来在模块和任务之间传递数据。
只能从always或initial块中调用任务。任务不返回任何值。
下面是有mux4to1组成的16选一多路选择器。
module mux16to1(W,S,f);
input [15:0] W;
input [3:0] S;
output reg f;
always @(W,S)
case(S[3:2])
0:mux4to1(W[0:3],S[1:0],f);
1:mux4to1(W[4:7],S[1:0],f);
2:mux4to1(W[8:11],S[1:0],f);
3:mux4to1(W[12:15],S[1:0],f);
endcase
//task that specifies a mux4to1
task mux4to1 ;//注意了此处为分号
input [0:3] X;
input [1:0] S4;
output reg g;
case(S4)
0: g=X[0];
1: g=X[1];
2: g=X[2];
3:g=X[3];
endcase
endtask
endmodule
verilog函数:
函数用关键词function声明以endfunction 结束函数必须有一个输入,而且只返回一个值到函数被调用的位置。
函数是在模块内部定义的,可以在模块内的连续赋值语句和过程性语句中被调用。
module mux16to1(W,S,f);
input [15:0] W;
input [3:0] S;
output reg f;
//function that specifies a mux4to1
function mux4to1 ;//注意了,此处为分号啊。
input [0:3] X;
input [1:0] S4;
case(S4)
0: mux4to1=X[0];
1: mux4to1=X[1];
2: mux4to1=X[2];
3: mux4to1=X[3];
endcase
endfunction
always @(W,S)
case(S[3:2])
0:f=mux4to1(W[0:3],S[1:0]);
1:f=mux4to1(W[4:7],S[1:0]);
2:f=mux4to1(W[8:11],S[1:0]);
3:f=mux4to1(W[12:15],S[1:0]);
endcase
endmodule
注:
函数可以调用另外一个函数,但不能调用另外一个任务。
而任务可以调用另外一个任务,也可以调用函数。
函数和任务的一个优点是可以在always块中调用多个函数和任务块,而这些块是不允许包含实例引用语句的。。
本文深入探讨了Verilog语言中的任务与函数的概念、声明方式、调用规则及应用场景,详细介绍了如何利用任务和函数将大型程序模块化,提高代码的可读性和维护性。
2294

被折叠的 条评论
为什么被折叠?



