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; endendmodule
--- 実行結果 ---
# == 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