task <name>;
// input ; 値渡し. 呼び出しもとのreg等に影響を与えない.
// output
// process...
endtask
syntax
task_declaration ::= (From Annex A - A.2.7)
task [ automatic ] task_identifier ;
{ task_item_declaration }
statement
endtask
| task [ automatic ] task_identifier ( task_port_list ) ;
{ block_item_declaration }
statement
endtask
task_item_declaration ::=
block_item_declaration
| { attribute_instance } tf_input_declaration ;
| { attribute_instance } tf_output_declaration ;
| { attribute_instance } tf_inout_declaration ;
task_port_list ::=
task_port_item { , task_port_item }
task_port_item ::=
{ attribute_instance } tf_input_declaration
| { attribute_instance } tf_output_declaration
| { attribute_instance } tf_inout_declaration
tf_input_declaration ::=
input [ reg ] [ signed ] [ range ] list_of_port_identifiers
| input [ task_port_type ] list_of_port_identifiers
tf_output_declaration ::=
output [ reg ] [ signed ] [ range ] list_of_port_identifiers
| output [ task_port_type ] list_of_port_identifiers
tf_inout_declaration ::=
inout [ reg ] [ signed ] [ range ] list_of_port_identifiers
| inout [ task_port_type ] list_of_port_identifiers
task_port_type ::=
time | real | realtime | integer
block_item_declaration ::= (From Annex A - A.2.8)
{ attribute_instance } block_reg_declaration
| { attribute_instance } event_declaration
| { attribute_instance } integer_declaration
| { attribute_instance } local_parameter_declaration
| { attribute_instance } parameter_declaration
| { attribute_instance } real_declaration
| { attribute_instance } realtime_declaration
| { attribute_instance } time_declaration
block_reg_declaration ::=
reg [ signed ] [ range ]
list_of_block_variable_identifiers ;
list_of_block_variable_identifiers ::=
block_variable_type { , block_variable_type }
block_variable_type ::=
variable_identifier
| variable_identifier dimension { dimension }
- 記述はmoduleとほぼ同じ. 許容される型/process文が増える程度.
- 引数は宣言した順に渡される.名前渡しも可能.(ドット+名前(信号))
- input引数は値渡しになる.呼び出し元に影響はでない.
- inout/outputは代入すると呼び元に値を返すことができる.[LRM 10.1]
- 実回路としてsynthesize不可. simulation modelでのみ使用可能
- "#値"による待ち処理を入れることができる. task呼び出し元は, task内で消費した時間の後に返ってくる.
if文を用いて、条件によって待ち時間を変化させることもできる.ex.
if (t_AD > t_CS) begin
# (t_CS)
CS_n <= 0;
# (t_AD - t_CS)
ADR <= ADR_buf;
end
else begin
# (t_AD)
ADR <= ADR_buf;
# (t_CS - t_AD)
CS_n <= 0;
end
※CS_nとADRの変化時間が、パラメタt_ADとt_CSの大小関係により前後するため、分岐させた.後日,CPUバスの試験パターンを振るための例を示す.waveformを外部プログラムで吐いて,取り込んだほうが早かった気がするけれど。。。