verilog中task和function的区别是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了verilog中task和function的区别是啥?相关的知识,希望对你有一定的参考价值。

1、task定义可以没有输入。function必须至少输入
2、function智能与主模块共用同一个仿真时间单位,而task可以定义自己的方阵时间单位
3、function要有返回值,返回一个值,而task不需要返回值。
4、function不能启动task,而task可以启动其他task和function
参考技术A

function只是草稿纸,task是验证用途的。

verilog中task和function的区别:

module: 电路;sub-program (task, function): 电路的测试程序(test bench)

module是物理电路,function只是草稿纸,task是验证用途的。完全没有任何联系。function里实现的功能,必须是电路开始工作之前就能执行运算的功能,task不能写在实际电路中。

任务(task)

任务就是封装在task-endtask之间的一段语句。任务是通过调用来执行的,也只能通过调用来执行,如果定义了任务,但整个过程都没有调用它,它是不会执行的。调用任务时可能需要它来处理某些数据并返回操作结果,所以任务应当有接受数据的输入端和返回数据的输出端。另外,任务可以彼此调用,任务还可以调用函数。

在定义任务时,有下列六点需要注意:

1、在第一行task语句中不能列出端口名称。

2、任务的输入、输出和双向端口数量不受限制,甚至可以没有输入、输出和双向端口。

3、在任务定义的描述语句中,可以出现不可综合操作符合语句,但这样会造成任务不可综合。

4、在任务中可以调用其他的任务或函数,也可以调用自身。

5、在任务定义结构中不可出现initial和always语句。

6、在任务定义中可以出现“disable中止语句“,将中断正在执行的任务,但其是不可综合的。

参考技术B

有四个区别。

1、task定义可以没有输入。function必须至少输入;

2、function智能与主模块共用同一个仿真时间单位,而task可以定义自己的方阵时间单位;

3、function要有返回值,返回一个值,而task不需要返回;

4、function不能启动task,而task可以启动其他task和function。

Verilog学习笔记基本语法篇········ 结构说明语句

Verilog中的任何过程都可以属于以下四种结构的说明语句;

1) initial;  2) always;  3) task;   4) function;

1) initial说明语句;

一个程序中的 initial 和 always 的次数是不受限制的,他们都是在仿真的一开始同时开始运行的。initial 只执行一次,而 always语句则是不断地重复活动,直到仿真活动结束、但是always 后面的过程快是否运行,则要看他的触发条件是否满足,满足则运行一次,再满足再运行,直至仿真结束。

 格式:

   initial 

     begin

      语句1;

      语句2;

         ...

      语句n;

   end

一个模块中可以有多个initial块,他们都是并行运行的。 initial 块常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境。

 

2)always说明语句

其声明格式如下:

always  <时序控制>  <语句>

如果always没有时序控制,则会产生仿真器的死锁。 如:always  areg=~areg;这将产生0延迟的无限循环跳变过程,这时发生仿真死锁。

always 的时序控制可以是边沿触发也可以是电平触发,可以单个信号亦可以十多个信号,中间用关键词or链接。

 A)  always @(posedge clock or posedge reset)

       begin

        ....

       end

B)  always @(posedge clock or posedge reset)

       begin

        ....

       end

上述中,A是由两个边沿触发的always只要其中一个沿出现,就立即执行一次过程块。B是有a b c 三个信号电平触发的,只要a b c 中任何一个发生变化,从高到低或从低到高都会执行过程块。

边沿触发的always 块常常描述时序行为,如有限状态机,通常对应于寄存器组和门级组合逻辑的结构。而电平触发的always块常常用来描述组合逻辑的行为。

在always语句中,由关键词or 链接的多个事件名或者信号名组成的列表称为敏感列表。用关键词or或者‘,‘表示这种关系。如果输入的逻辑变量较多,那么编写敏感列表会很繁琐而且容易出错。针对这种情况,Verilog中可以用@* 和 @(*),他们表示对后面语句块中所有的输入变量的变化是敏感的。

电平敏感的时序控制:

Verilog用关键字wait 来表示等待电平敏感的条件为真:

如: always  

           wait  (count_enabal)  #20 count = count+1;

这个例子中,仿真器连续见识count_enable的值,其值为0,则不执行后面语句。如果其值为1,则20个单位后执行这个语句,如果count_enable始终为1,那么count每20个单位时间+1。

 

以上是关于verilog中task和function的区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中Function和function有啥区别?

RTL基本知识:task和function

verilog语言中任务和函数的区别

Verilog-2001新增特性

在systemverilog的task中只能用阻塞赋值么

verilog 循环执行task的问题