7 |
RISC-Vプロセッサの設計 (12) |
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されたときというように読めますが、後で条件を調査します。