Verilog中的function和task用法
【博客首发于微信公众号《漫谈芯片与编程》,欢迎专注一下,多谢大家】
在 Verilog 中,function 和task都是用于封装可重用代码的结构;
通过把代码分成小的模块或者使用任务(task)和函数(function),可把一项任务分成许多较小的、易于管理的部分,从而提高代码的可读性、可维护性和可重用性。
在我们认为中,function和task主要是用在SV中,主要用于验证,而不是综合;那是不是Verilog的综合语句不能使用function和task呢?
1 概念
1.1 VS
任务task:一般用于编写测试class中;或者用于行为描述可综合的模块;其中可以包含时间控制(#delay,@,wait);也可以包含input,output和inout端口定义和参数;也可以调用其他的任务或函数。Task可以包含时间控制,但加入时间控制则该task不可综合,此时是用于写测试task;
函数function:主要用于计算–用来代替纯组合逻辑。函数中肯定是不能包含时间语句;函数在零时间执行;函数只有input变量,虽没有output变量,但可以通过函数名返回一个值。可以调用其他的函数,但不可以调用任务。因为函数不包含时间控制语句,所以可综合,主要用在模块中的组合逻辑,方便复用和调用;
接下来主要是讨论function和task在Verilog可综合语句中的用法;
1.2 function
function 主要用于计算并返回一个值。它可以在表达式中调用,并且不能包含任何延迟或时间控制语句。function 通常用于执行简单的计算或数据转换。函数在模块内部定义,通常在本模块中调用,也能根据按模块层次分级命名的函数名从其他模块调用。
function [返回类型] 函数名;
input [参数类型] 参数名1;
input [参数类型] 参数名2;
// 更多输入参数...
begin
// 函数体
函数名 = 表达式;
end
endfunction
//demo
//function 实现
function integer clogb2 (input integer bit_depth);
begin
for(clogb2=0; bit_depth>0


6910

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



