美文网首页fpga && verilog
Task 以及 Function

Task 以及 Function

作者: madao756 | 来源:发表于2019-11-03 23:46 被阅读0次

前言:这是一篇翻译文章,希望对你有一些帮助,原文在这里:https://documentation-rp-test.readthedocs.io/en/latest/tutorfpga07.html

function 和 task 是用来减少重复代码的利器!不仅仅如此,如果你想要你的代码变得更具有「可读性」不妨多用用 function 和 task。

0X00 Task

Task 是可以在该 Task 被定义的模块中任意时刻调用的子例程。但是可以在其他文件中定义它们,并将文件 include 到一个 module 中。

Task 有以下几种特性:

  • Task 可以包括 delay,但是 function 不能。
  • Task 可以有任意数量的输入和输出,但是 function 只能有一个输出
  • 在 Task 中定义的「变量」不能在 Task 外被使用
  • Task 是用语句调用的,不能在表达式中使用,function 可以在表达式中使用
  • Task 可以使用全局变量

再我们来看看它的语法(可以有任意数量的输入输出):

  // Style 1
  task [name];
    input  [port_list];
    inout  [port_list];
    output [port_list];
    begin
      [statements]
    end
  endtask
 
  // Style 2
  task [name] (input [port_list], inout [port_list], output [port_list]);
    begin
      [statements]
    end
  endtask

接着我们来看一个例子:

module  task_calling (adc_a, adc_b, adc_a_conv, adc_b_conv);
    input [7:0] adc_a, adc_b;
    output [7:0] adc_a_conv, adc_b_conv;

    reg [7:0] adc_a_conv, adc_b_conv;

    task convert;
    input [7:0] adc_in;
    output [7:0] out;
    begin
        out = (9/5) *( adc_in + 32)
    end
    endtask

    always @ (adc_a) begin
      convert (adc_a, adc_a_conv);
    end

    always @ (adc_b) begin
      convert (adc_b, adc_b_conv);
    end

endmodule

0X01 Function

Function 的本质更像是定义在 module 的一套组合逻辑,而 Task 是一个定义在 module 内的 module

Function 就像 Task 但还是有很多不同的,接下来我们说 Function 的特性:

  • 函数不能包含时序延迟,例如 posege,negedge,delay,这意味着 Function 仅仅实现了组合逻辑
  • 函数可以具有任意数量的输入,但只有一个输出
  • 考虑函数中的参数的声明顺序,并且必须与调用时参数的顺序相同
  • 函数可以调用其他函数,但不能调用任务
  • 最重要的是当对同一个函数多次使用的时候,它的局部变量是共享的,与 c 相反,如果要每次调用一个函数就生成一套新的电路,就必须使用 automatic 关键字

我们来看 Function 的语法:

  function [automatic] [return_type] name ([port_list]);
    [statements]
  endfunction

再看一个具体例子:

module  function_calling(a, b, c, d, e, f);

input a, b, c, d, e ;
output f;
wire f;

function  myfunction;
input a, b, c, d;
begin
    myfunction = ((a+b) + (c-d));
end
endfunction

assign f =  (myfunction (a,b,c,d)) ? e :0;

endmodule

相关文章

  • Task 以及 Function

    前言:这是一篇翻译文章,希望对你有一些帮助,原文在这里:https://documentation-rp-test...

  • Task And Function

    Task 在SystemVerilog中,Task(任务)常被认为是程序块或过程块,其具有以下特点: Task在被...

  • JQ同一元素crud

    $(function () {$("#add-task-btn").click(function (event) ...

  • 2018.7.29

    function task(){ var now=new Date(); var end=new ...

  • Descending Order(codewars-java 4

    Your task is to make a function that can take any non-neg...

  • 12

    function task(){ //获取当前时间、 var now=new Date(); //获取下课...

  • 2018-08-14

    function task(){var now=new Date();var end=new Date('2018...

  • gulp踩坑记录

    1、[ERR_ASSERTION]: Task function must be specified 原因:1、g...

  • gulp del插件注意事项

    在写gulpfile.js的task时,一开始我是这么写的: gulp.task('clean',function...

  • 倒计时、动态表格、防微博

    一、倒计时 倒计时 距离下课还有: || function task(){ //获取当前时间、 ...

网友评论

    本文标题:Task 以及 Function

    本文链接:https://www.haomeiwen.com/subject/wgfrbctx.html