function文,task文

function文

function文を使うと、処理を分割することができます。

function [戻り値の最上位桁: 戻り値の最小位桁] ファンクション名;
入力ポートの宣
内部信号の宣言
処理
endfunction

または

function [戻り値の最上位桁: 戻り値の最下位桁] ファンクション名(入力ポート,...,入力ポート);
処理
endfunction

functionを接続するためには、以下のように記述します。

信号 = ファンクション名(信号,信号,...,信号);

以下に例を示します。

wire [3: 0] conter;
wire [1: 0] msb = getMSB(counter);

// 最上位桁を取得
function [1: 0] getMSB(input [3:0] in);
begin

  case(in)
  4'b1xxx: getMSB = 2'd4;
  4'b01xx: getMSB = 2'd3;
  4'b001x: getMSB = 2'd2;
  4'b0001: getMSB = 2'd1;
  default: getMSB = 2'd0;
  endcase
end

endfunction

task文

task文を使うと、処理を分割することができます。上位モジュールの信号にアクセスすることができます。

task タスク名;
入出力ポートの宣言
信号の宣言
処理
endtask

または

task タスク名 (入出力ポート,...,入出力ポート);
信号の宣言
処理
endtask

taskの呼び出しは以下のように記述します。

タスク名(信号,信号...,信号);

以下に例を示します。

reg [1: 0] signal, delayed_signal;

...
always @(posedge clock) begin
delay();
end

...
// signalを遅延させて、delay_signalへ代入

task delay;
reg [1: 0] queue[1: 0];
begin
  delayed_signal <= queue[0];
  queue[0] <= queue[1];
  quepe[1] <= signal;
end
endtask

task文とfunction文の違い

  • function文は必ず1単位時間で実行される。task文の処理は1単位時間より長くともよく、タイミング操作を記述することができる。
  • function文からtaskを接続することはできない。task文はfunction文と他のtask文を接続することができる。
  • function文は少なくとも一つは入力ポートを持ち、入出力ポート、出力ポートを持つことができない。task文はどの入出力ポートを持つことができるか、入出力ポートを持たなくともよい。
  • function文は戻り値を持つ。task文は戻り値を持たない。