Verilog 函数和任务

本文介绍了Verilog中的函数和任务,包括它们的定义、用途、区别(如函数用于计算和组合逻辑,任务用于行为描述和测试),以及自动修饰的作用。强调了函数和任务在模块化编程中的重要性,以及它们在仿真时间和可重用性上的特性。

一、函数和任务简介

在Verilog代码中,通过把代码分成小的模块或者使用任务(task)和函数(function),可把一项任务分成许多较小的、易于管理的部分,从而提高代码的可读性、可维护性和可重用性。函数和任务往往还是大的程序模块在不同地点多次用到的相同的程序段。

  • 函数(function):一般用于计算,或者用来代替组合逻辑。不能包含任何延迟;函数在零时间执行。函数只有input变量,虽然没有output变量,但可以通过函数名返回一个值。可以调用其他的函数,但不可以调用任务。函数不可以包含时间控制,可综合,多用来模块化组合逻辑,方便复用、调用。
  • 任务(task):一般用于编写测试模块,或者行为描述的模块。其中可以包含时间控制(如:#,@,wait),也可以包含input, outputinout 端口定义和参数。可以调用其他的任务或函数。任务可以包含时间控制,但加入时间控制后则该部分无法综合,所以任务常用于testbench测试模块。

二、Verilog 函数function

函数的目的是通过返回一个用于某表达式的值,来响应输入信号。适于对不同变量采取同一运算的操作。函数在模块内部定义,通常在本模块中调用,也能根据按模块层次分级命名的函数名从其他模块调用。函数的目的是返回一个用于表达式的值。
定义函数的语法

function < 返回值的类型或范围 > 函数名;  // 返回值类型integer、范围 [15:0]等等
< 端口说明语句>       // input xxx
< 变量类型说明语句 >  // reg yyy
begin
    <语句>
end
end function
SystemVerilogVerilog继承了任务函数功能,它们是定义子程序的两种方式。任务函数的主要区别在于是否消耗仿真时间以及是否有返回值。若子程序需要消耗仿真时间,使用任务;若子程序消耗仿真时间为0,则使用函数。另外,函数可以有返回值,而任务没有 [^1]。 在Verilog中,任务函数的区别更为明显,任务可以消耗时间而函数不能。函数里面不能带有诸如#100的时延语句或诸如@(posedge clk)的阻塞语句,也不能调用任务。并且,Verilog中的函数必须有返回值,且返回值必须被使用,例如用到赋值语句中。在SystemVerilog(SV)中,对任务函数做了一些改进,使其更像C或C++中的程序。在SV中若想调用函数并忽略其返回值,可以使用void进行结果转换,例如:void'($fscanf(file,"%d",i)) [^2]。 对于使用方法,有不同的系统任务函数示例: - `$system`:会调用C语言的函数system(),该C函数执行传递给它的参数,就像从终端执行参数一样。$system可以作为任务函数调用。当它作为函数调用时,返回数据类型为int。如果调用$system时没有带字符串参数,则调用c函数system()时将带NULL字符串 [^3]。 - `$sformat`:与系统任务$write相似,但有一个主要不同。与输出系统任务$display$write不同的是,$sformat只把第二个参数作为格式字符串。格式字符串可以是字符串常量,例如"data is%d",或者是整数表达式、非合并字节数组、字符串数据类型。$sformat支持$display一样所有支持的格式。如果没有为格式说明符提供足够的参数或提供了太多的参数,应用程序将发出警告并继续执行 [^5]。 - `$sformatf`:其语法为$sformatf ( format_string [ , list_of_arguments ] ) [^5]。 ```systemverilog // 示例:使用void忽略函数返回值 module example; int file; int i; initial begin file = $fopen("test.txt", "r"); void'($fscanf(file,"%d",i)); $fclose(file); end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暴风雨中的白杨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值