function文,task文
# このページは,学生実験用資料として筑波大学リコンフィギュラブルコンピューティングシステム研究室のwebページで公開されていたものを,許可を得て転載したものです.
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
|
function文とtask文の違い
- function文は必ず1単位時間で実行される。task文の処理は1単位時間より長くともよく、タイミング操作を記述することができる。
- function文からtaskを接続することはできない。task文はfunction文と他のtask文を接続することができる。
- function文は少なくとも一つは入力ポートを持ち、入出力ポート、出力ポートを持つことができない。task文はどの入出力ポートを持つことができるか、入出力ポートを持たなくともよい。
- function文は戻り値を持つ。task文は戻り値を持たない。
戻る