Posts Issued on December 7, 2022

posted by sakurai on December 7, 2022 #565

verilogシミュレーション

verilogのソースを覗いてみると、FIFO2というモジュールがインスタンスされていました。ソースの一部を示します。

// submodule ifs
FIFO2 #(.width(32'd32), .guarded(32'd1)) ifs(.RST(RST_N),
                                       .CLK(CLK),
                                        .D_IN(ifs$D_IN),
                                        .ENQ(ifs$ENQ),
                                        .DEQ(ifs$DEQ),
                                        .CLR(ifs$CLR),
                                        .D_OUT(ifs$D_OUT),
                                        .FULL_N(ifs$FULL_N),
                                        .EMPTY_N(ifs$EMPTY_N));

ライブラリ中のFIFO2($BLUESPECDIR/Verilog/FIFO2.v)のソースを見ると、中心部分は以下のようになっており、レジスタ2段によるFIFOです。

  data0_reg  <= `BSV_ASSIGNMENT_DELAY
                {width{d0di}} & D_IN | {width{d0d1}} & data1_reg | {width{d0h}} & data0_reg ;
  data1_reg <= `BSV_ASSIGNMENT_DELAY
               d1di ? D_IN : data1_reg ;

ただし、FIFOなので、2段とはいってもレイテンシが必ず2サイクルになるわけではありません。First-In, First-Outなので、1段目に入れたものをデキューしようとすると、そのまま1段目から供給するロジックとなっています。上記のように、data0は入力か、1段目か、0段目の選択となっており、data1が入力か1段目の選択となっています。

assign                 D_OUT = data0_reg ;

であることから、data0が出力側レジスタであることがわかります。一方、data1がD_INを入力とする場合は、d1diという信号がTrueの時であり、その論理は、

wire                   d1di = ENQ & empty_reg ;

となっています。これはFIFOがemtpy(負論理なので)でなく、かつENQされたときというように読めますが、後で条件を調査します。


左矢前のブログ 次のブログ右矢