fpga && verilog

Task 以及 Function

2019-11-03  本文已影响0人  madao756

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

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

0X00 Task

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

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 的特性:

我们来看 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
上一篇 下一篇

猜你喜欢

热点阅读