task
2008/08/20
書式
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を外部プログラムで吐いて,取り込んだほうが早かった気がするけれど。。。