FPGAの非同期FIFO
拙作のJellyでも非同期FIFOを用意しているが、こちら などを参考にさせていただくと、FPGAでの非同期の扱いは奥深いことがわかる。
そこで、XILINXの coregen で生成した非同期FIFOのネットリストを解析してみた。
ターゲットは XC6VLX75T-2FF484 として、DistributedRAMで幅1bit深さ16での生成。
ざっとネット名から推論する限りライトポインタとリードポインタをそれぞれグレイコード化してやり取りしている一般的なFIFOに見受けられる。
まず、netgenでverilog化
【wr_clk側 4bitグレイコードの0bit目】
FDC #(
.INIT ( 1'b0 ))
\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_pntr_gc_0 (
.C(wr_clk),
.CLR(wr_rst),
.D(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/WR_PNTR[0]_WR_PNTR[1]_XOR_3_o ),
.Q(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<0> [0])
);
【rd_clk側 ダブルFF 1段目】
FDC #(
.INIT ( 1'b0 ))
\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/gsync_stage[1].rd_stg_inst/Q_0 (
.C(rd_clk),
.CLR(rd_rst),
.D(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<0> [0]),
.Q(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<1> [0])
【rd_clk側 ダブルFF 2段目】
FDC #(
.INIT ( 1'b0 ))
\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/gsync_stage[2].rd_stg_inst/Q_0 (
.C(rd_clk),
.CLR(rd_rst),
.D(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<1> [0]),
.Q(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<2> [0])
);
【rd_clk側 ダブルFF後論理へ (トリプルFFではない)】
LUT4 #(
.INIT ( 16'h6996 ))
\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_pntr_gc_asreg_last[3]_reduce_xor_81_xo<0>1 (
.I0(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<2> [0]),
.I1(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<2> [1]),
.I2(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<2> [2]),
.I3(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_q<2> [3]),
.O(\U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/wr_pntr_gc_asreg_last[3]_reduce_xor_8_o )
);
pcfファイルなどを見る限りに
でもって、FPGAエディタで覗く。
ダブルFFは隣に並んでいるが、ルーティングが見た目に遠いような。メタステーブル対策これでいいのか???
ちなみに500MHz overの制約で合成してみたんだがタイミングMETしている模様。
« ANTLR勉強中 | トップページ | TOP500更新 »
「FPGA」カテゴリの記事
- LUT-Networkの蒸留とMobileNet風構成とセマンティックセグメンテーション(2020.03.09)
- LUT-Networkの蒸留(Distillation)について(2019.12.29)
- FPGAでのDNN(Deep Neural Network)の整理(LUT-Netまとめ)(2019.12.15)
- LUT-NetのFPGAリソースについて(2019.12.08)
- MNIST認識のリアルタイム動作環境更新(2019.09.02)
この記事へのコメントは終了しました。
コメント