FIFO(キュー)のビヘイビアモデル

SystemVerilogを使ったビヘイビアレベルのFIFOの実装方法です。詳細は、SystemVerilog 3.1a LRMの4.14を参照してください。

FIFOの宣言

  int fifo0[$]; // 深さを指定しないFIFO
  int fifo1[$:255]; // 深さ256のFIFO

データの格納方法

FIFOの一番後ろにデータを一つ追加する場合は、下記のように書きます。

  fifo = {fifo, val}; // 一番後ろに"val"を格納

もしくは、メソッドを使って下記のようにも書けます。

  fifo.push_back(val); // 一番後ろに"val"を格納

データの取り出し方法

FIFOの先頭から一つ取り出す場合は、下記のように書きます

  val = fifo[0]; // 先頭のデータを"val"に代入
  fifo = fifo[1:$]; // 先頭を消す

もしくは、メソッドを使って下記のようにも書けます。

  val = fifo.pop_front( ); // 先頭のデータを取り出して"val"に代入

サンプルコード

module queue;
  int fifo[$]; // FIFOの宣言
  
  initial begin
    // データを追加
    fifo.push_back(1111); // 1回目のデータ追加
    fifo.push_back(2222); // 2回目のデータ追加
    fifo.push_back(3333); // 3回目のデータ追加

    // データを取り出す
    $display("%d", fifo.pop_front());
    $display("%d", fifo.pop_front());
    $display("%d", fifo.pop_front());
  end
endmodule

実行結果

#        1111
#        2222
#        3333