02. 並列実行と無限ループ
個人的によく使う手法として、複数のtaskを同時実行させ続ける、というのがあります。このtaskは常にあの処理をさせておいて、あのtaskは常に○○をチェックさせておく、というように、各taskを独立動作させて仕事を割り振ります。
例えば…パケットデータを格納するqueueがあって、
- そのqueueにデータが入るのをチェックするtask
- queueからパケットデータを取り出して中身を表示するtask
をコーディングしてみたいと思います。無限ループはforever構文を使います。
#本当は1つのtaskに処理を統合できますが、ここではあえて2つに分けています
--- test.sv ---
module test;
class packet_class;
byte header;
bit [15:0] payload_q[$];
function new (byte header_data, int payload_num);
header = header_data;
for(int i=0; i<payload_num; i++)begin
payload_q.push_back($random);
end
endfunction
endclass
packet_class packet_q[$];
event packet_check_e;
task task_a; /// queueのデータ待ち。emptyじゃなかったら、event packet_check_eを発行
forever begin
while(packet_q.size()==0)begin
#10;
end
#10 -> packet_check_e;
end
endtask
task task_b;
packet_class packet;
int count;
count = 0;
forever begin
@packet_check_e;
packet = packet_q.pop_front();
count++;
$display("== %0d ================================",count);
$display(" header : %02xh", packet.header);
for(int i=0; i<packet.payload_q.size(); i++)begin
$display(" payload[%0d] : %04xh", i,packet.payload_q[i]);
end
#10;
end
endtask
initial begin
packet_class packet;
fork
task_a;
task_b;
join_none
#10;
packet = new(8'h00,4);
packet_q.push_back(packet);
packet = new(8'h01,6);
packet_q.push_back(packet);
packet = new(8'h02,8);
packet_q.push_back(packet);
packet = new(8'h03,10);
packet_q.push_back(packet);
#100 $finish;
end
endmodule
--- 実行結果 ---
# == 1 ================================
# header : 00h
# payload[0] : 3524h
# payload[1] : 5e81h
# payload[2] : d609h
# payload[3] : 5663h
# == 2 ================================
# header : 01h
# payload[0] : 7b0dh
# payload[1] : 998dh
# payload[2] : 8465h
# payload[3] : 5212h
# payload[4] : e301h
# payload[5] : cd0dh
# == 3 ================================
# header : 02h
# payload[0] : f176h
# payload[1] : cd3dh
# payload[2] : 57edh
# payload[3] : f78ch
# payload[4] : e9f9h
# payload[5] : 24c6h
# payload[6] : 84c5h
# payload[7] : d2aah
# == 4 ================================
# header : 03h
# payload[0] : f7e5h
# payload[1] : 7277h
# payload[2] : d612h
# payload[3] : db8fh
# payload[4] : 69f2h
# payload[5] : 96ceh
# payload[6] : 7ae8h
# payload[7] : 4ec5h
# payload[8] : 495ch
# payload[9] : 28bdh