FC2カウンター FPGAの部屋 DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)

DDR2 SDRAMコントローラのインプリメントテスト(動作周波数の確保)で1つクリティカルパスをつぶしたが、まだ動作周波数を満足しない。
IOBのDDRレジスタを使う際に180度位相が異なったクロックでサンプルするので、周期の1/2になるところが痛い。
そのような場合は下の図のように、FF(フリップフロップ)が一番下で4つのファンアウトを持っていると、どうしてもルーティングが厳しくなる。
max_fanout_1_080201.png

IOBの位置が離れているときには、なおさらだ。
実際に最初にインプリメントしたときには、そうなっていた。
ソースファイルはこれ。

    always @ (posedge clk90) begin
        if (reset==1'b1) begin
            dqs_reset_2d <= 0;
            dqs_reset_3d <= 0;
            dqs_reset_d3d <= 0;
        end else begin
            dqs_reset_2d <= dqs_reset_1d;
            dqs_reset_3d <= dqs_reset_2d;
            dqs_reset_d3d <= dqs_reset_2d;
        end
    end


    // Instantiate DQS_N DDR registers(DQSと逆極性)
    generate
    genvar p;
        for (p=DDR2_DQS_DM_WIDTH-1; p>=0; p=p-1) begin: WRDATA_DQS_N
            FDDRRSE WRDATA_DDR2_DQS (
                .Q(dqs_n_out[p]),
                .D0(gnd),    // DQSとDO,D1が逆
                .D1(vcc),
                .C0(clk90),
                .C1(clk270),
                .CE(vcc),
                .R(dqs_reset_d3d[p]),
                .S(gnd)
            );
        end
    endgenerate


dqs_reset_d3d は90度クロックでサンプルされていて、FDDRRSEの同期リセット入力 (R) に入力されているので、クリティカルパスは2.5ns以下でなければならない。
下がTiming Analyzerのレポート。スラックが -0.820nsになっている。
max_fanout_3_080201.png

下がFPGA Editorの画面。ファンアウトが4なので、だいぶネットが伸びている。
max_fanout_4_080201.png

これでは、だめなので、なるべく下のようにツリー状にネットを分散していけば、リソースは食うがネットは短くなるはず。
max_fanout_2_080201.png

本当はそれを見越して、宣言部でIOBの分だけFFを宣言してあるのだが、XST(論理合成)で消されてしまう。
宣言部はこれ。

reg [DDR2_DQS_DM_WIDTH-1 : 0] dqs_reset_d3d;


これを、消されないように max_fanout ディレクティブを使用して、XSTに消さないようにお願いする。(本当はもうちょっと多くの信号を消されないようにmax_fanoutを設定している)

(* max_fanout="1" *) reg [DDR2_DQS_DM_WIDTH-1 : 0] dqs_reset_d3d;


これでインプリメントすると、負荷が分散されて制約が満足するようになった。(動作周波数の制約が満足できた)
これがTiming Analyzerのレポート。
max_fanout_5_080201.png

制約を満足している。
FPGA Editorで見てもファンアウトが1になって、距離も短くなっている。
max_fanout_6_080201.png

まだ、動作周波数の制約しかかけていないので、IOのセットアップ時間(tsu)、クロックからの出力時間 (tco) は考慮されていない。
少なくとも、主力用FFと出力のトライステートバッファのイネーブル信号用FFはIOBに入れないとtsuとtcoは満足できないと思う。まだ、それらのFFはすべてIOBに入っていない。IOBの物理的な構造を考慮してVerilogファイルを書かないとだめそうだ。
  1. 2008年02月01日 22:32 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:2

コメント

Synthesize のプロパティからXilinx Specific Options → Equivalent Register Removal のチェックをはずすと、最適化が抑止できたと思います。合成ツールがXST以外の場合は、合成ツールの設定とmapのオプションで同様のことをする必要があります。
  1. 2008/02/02(土) 21:57:59 |
  2. URL |
  3. なつたん #-
  4. [ 編集 ]

なつたんさん、こんばんは。
教えていただいてありがとうございます。勉強になりました。
ですが、私はこのオプションはONでよいのです。
FFをまとめてもらって、一回インプリメントした後で、クリティカルパスになっているFFだけを複製し、リソースの最小化を目指しています。
  1. 2008/02/02(土) 23:09:26 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/728-7d3ed95a
この記事にトラックバックする(FC2ブログユーザー)