目录
学习目标
学习内容
1.任务和函数的区别
2.任务
3.函数
学习时间
学习总结
学习目标:
1.理解任务和函数之间的区别。
2.理解定义任务所需的条件,学会任务的声明和调用。
3.理解定义函数所需的条件.学会函数的声明和调用。
学习内容:
提示:这里可以添加要学的内容
1.任务和函数的区别
在 Verilog中,任务和函数用于不同的日的。我们将在下面的几节中,对两者进行更详细的讨论。但是,在学习之前,理解两者之间的区别是很重要的,中,我们对两者的不同点进行了概括。 在verilog中,任务和函数用于不同的日的.我们将在下面的几节中,对两者进行更详细的讨论.但是,在学习之前,理解两者之间的区别是很重要的,我们对两者的不同点进行了概括。
任务可以具有输人、输出和输入J输出(双向)变量,而函数只有输入变量。另外,可以在任务和函数中声明局部变量,如寄存器、时间、整数、实数和事件,但是不能声明线网类型的变量。在任务和函数中只能使用行为级语句,但是不能包含always和 initial 块。设计者可以在always块、initial块以及其他的任务和函数中调用任务和函数。
2.任务
任务使用关键字task和endtask进行声明.如果子程序满足下面任意一个条件,则必须使用任务而不能使用函数:
1.于程序中包含有延迟、时序或者事件控制结构。
2.没有输出或者输出变量的数目大于1。
3.没有输入变量。
根据所使用的变量类型,使用关键字input,output 或inout对任务的端口进行声明。input(输入)类型和 inout(输入/输出)类型的变量从外部传递到任务中,input(输入)类型的变量在任务所包含的语句中进行处理。当任务执行完成时,output (输出)类型和inout(输人/输出)类型的变量传回给任务调用语句中相应的变量。除了在模块中,任务也可以在其他任务或函数中被调用(函数能调用另一个函数,但不能调用另一个任务。
虽然在任务中也使用关键字input,output 或inout进行输人/输出变量的声明,就像在模块中声明端口一样,但是两者在本质上是有区别的:模块的端口用来和外部信号相连接,而任务的IO〔输入/输出)变量则用来向任务中传入或从任务中传出变量。
3.函数
1.Verilog使用关键字function和endfunction 来进行函数声明。对于一个子程序来说,如果下面的所有条件全部成立,则可以使用函数来完成。
2.在子程序内不含有延迟、时序或者控制结构。·子程序只有一个返回值。
3.·至少有一个输入变量。·没有输出或者双向变量。不含有非阻塞赋值语句。
函数具有-些独特的性质。当函数声明的时候,在 Verilog 的内部隐含地声明了一个名为function_identifier(函数标识符)的寄存器类型变量,函数的输出结果将通过这个寄存器类型变量被传递回来。函数的调用通过指明函数名和输人变量来进行。在函数执行结束时,返回值被传回到调用处。可选项range_or_type(类型或范围)说明了内部寄存器的位宽。如果没有指定返回值的类型或位宽、则默认位宽为1。Verilog 中的函数和FORTRAN中的函数非常类似。
注意在函数声明中必须至少有一个输入声明,同时由于隐含的寄存器变量function_identifier
包含了函数的返回值,因此函数是没有输出变量的。另外,在函数中不能调用任务,只能调用其他函数。
学习时间:
20230616
学习总结
提示:这里统计学习计划的总量
任务和函数都用来对设计中多处使用的公共代码进行定义。使用任务和函数可以将模块分割成许多个可独立管理的子单元,增强了模块的可读性和可维护性。它们和C语言中的子程序起着相同的作用
任务可以具有任意多个输人、输人/输出( inout)和输出变量。在任务中可以使用延迟、事件和时序控制结构,在任务中可以调用其他的任务和函数;
可重入任务使用关键字automatic进行定义,它的每--次调用都对不同的地址空间进行操作。因此,在被多次并发调用时仍然可以获得正确的结果;
函数只能有一个返回值、并且至少要有一个输入变量。在函数中不能使用延迟、事件和时序控制结构。在函数中可以调用其他函数,但是不能调用任务;
递归函数使用关键字automatic进行定义,递归函数的每一次调用都拥有不同的地址空间。因此对这种函数的递归调用和并发调用可以得到正确的结果;
任务和函数都包含在设计层次中,可以通过层次名对它们进行调用。