FC2カウンター FPGAの部屋 2009年06月09日
FC2ブログ

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

FPGAの部屋

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

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプリメント2(弱音を吐く編)

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのインプメントをしているのだが、Virtex-4と違ってSpartan-3Aだと200MHz動作、DDR2-400は厳しいみたい。
クリティカルパスをとりあえずFFでぶった切ってきたのだけれど、そろそろモグラたたきになってしまったようだ(こっちをケアしても、あっちがだめ)。
今のところ、クリティカルパスは6.920ns。5nsが目標なのでまだまだだ。
Spa3A_STKit_DDR2_imp_7_090608.png

Syntesize-XSTのプロパティのKeep HierarchyはNoになっている。

しかし、なひたふさんは”Spartan3E+DDR2メモリで400Mbps”ということなので凄い。。。少しタイミングエラーは出ているということだったが、200MHzで動作させるのは難易度が高い。
Spatan-3Aもデータシートによると”DDR/DDR2 SDRAMを最大で333Mbpsまでサポート”だそうなので、これで行くと166MHzということだな。そこまでは行けそうかな?これもスピードグレードが-5かもしれないし、どうだろうか?

とりあえず、だいぶ回路を変更してしまったので、もう一度シミュレーションで動作するかどうかを調べて、PlanAheadによるフロアプランでどのくらい改善できるかを見てみようと思う。
  1. 2009年06月09日 18:34 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:0

MAPエラー(ERROR:Pack:1664とERROR:Pack:1665)の回避方法

今日もウイルス性胃腸炎でお休みです。でも、今朝はおかゆを少し食べられました。

さて、体力がないので、ちょっとずづDDR2 SDRAMコントローラのバーストテストのインプリメントをしているのだが、MAPでERROR:Pack:1664とERROR:Pack:1665が出てMAPプロセスを完了できないという問題が発生してしまった。
Spa3A_STKit_DDR2_imp_4_090608.png

ddr2_dq<0>に関するエラーの全文を下に示す。

ERROR:Pack:1664 - A dual data rate register could not be packed into an I/O componet as required. The SET/RESET signal usage of dual data rate register symbol "ddr2_sdram_cont_inst/read_write_io_inst/ddr2_cont_iob_inst/DQ_IOB_INST[0].dq_io_pad_inst/ODDR2_TRI" conflicts with another register in the I/O component.
Please examine the connectivity and attributes of all registers in the I/O
component involving pad net "ddr2_dq<0>".
ERROR:Pack:1665 - A dual data rate register could not be packed into an I/O component as required. Please try constraining the dual data rate register "ddr2_sdram_cont_inst/read_write_io_inst/ddr2_cont_iob_inst/DQ_IOB_INST[0].dq_io_pad_inst/ODDR2_TRI" together with a valid pad or buffer symbol.


ERROR:Pack:1664でSET/RESET信号がコンフリクトしていると言っているけど、これはあわせてあるはずなんだけど。。。
dq_io_pad.v のソースを下に示す。

// IO padの形にVerilog-HDLファイルを作る。後でフロアプランする時に使いやすくするため// トライステート用のDDRをインスタンシエーションしてある
// DQ用
// DQの入力用のFFは使用しないで直接AFIFOの入力に入れる。

`default_nettype none
`timescale 1ns / 1ps

module dq_io_pad (
    input    wire    input_clk,    // 入力用クロック
    input    wire    clk,        // 出力用、及び汎用クロック
    input    wire    clk90,        // 90度位相のクロック
    input    wire    reset,
    inout    wire    io_pad,        // IO PAD入出力
    output    wire    dq_data_from_io,    // DQのデータ(IOBのFFは使用しない)
    input    wire    tri_ddr_ce_to_io,    // トライステート用DDRレジスタのCE
    input    wire    tri_ddr_d0_to_io,    // トライステート用DDRレジスタのD0
    input    wire    tri_ddr_d1_to_io,    // トライステート用DDRレジスタのD1
    input    wire    data_ddr_ce_to_io,    // データ用DDRレジスタのCE
    input    wire    data_ddr_d0_to_io,    // データ用DDRレジスタのD0
    input    wire    data_ddr_d1_to_io    // データ用DDRレジスタのD1    
);
    wire input_clkx;
    wire clkx;
    wire tri_out;
    // wire from_io_pad;
    wire to_io_pad;
    wire clk270;
    
    assign input_clkx = ~input_clk;
    assign clkx = ~clk;
    assign clk270 = ~clk90;
    
    ODDR2 #(
        .DDR_ALIGNMENT("NONE"),
        .SRTYPE("ASYNC")
    ) ODDR2_TRI(
        .Q(tri_out),
        .C0(clk270),
        .C1(clk90),
        .CE(tri_ddr_ce_to_io),
        .D0(tri_ddr_d0_to_io),
        .D1(tri_ddr_d1_to_io),
        .R(1'b0),
        .S(reset)
    );
    
    ODDR2 #(
        .DDR_ALIGNMENT("NONE"),
        .SRTYPE("SYNC")
    ) ODDR2_DATA(
        .Q(to_io_pad),
        .C0(clk270),
        .C1(clk90),
        .CE(data_ddr_ce_to_io),
        .D0(data_ddr_d0_to_io),
        .D1(data_ddr_d1_to_io),
        .R(1'b0),
        .S(reset)
    );
    
    IOBUF IOBUF_DQ(
        .O(dq_data_from_io),
        .IO(io_pad),
        .I(to_io_pad),
        .T(tri_out)
    );
        
endmodule


そういえば”Spartan3A Starter KitのDDR2 SDRAMコントローラIOテストモジュール公開”で公開したテストモジュールもほとんど同じ形なのにインプリメントできているのはなぜだろう?
違いを見てみると、違いはSyntesize-XSTのプロパティのKeep HierarchyがNoかYesかの違いだった。
Spa3A_STKit_DDR2_imp_5_090608.png

Yesにしてもう一度MAPを実行すると、エラーなく終了した。
Spa3A_STKit_DDR2_imp_6_090608.png

いろいろ忘れているものや動作クロックを落とさないとだめだったが、一応、Place & Routeまで通った。

やはり、XSTの階層保持がYesでないと、ODDR2も最適化されてしまうのだろうか?Yesでもそれらしいウォーニングが出ていたようだが、Place & Routeまで通った。もしかして、ODDR2の前までのネットをKeepすればNoでも大丈夫とか?そのうち必要があったらやってみることにする。

この辺の情報を持っている方がいらしたら教えてください。

追記:
Keep HierarchyがYesだと、動作周波数が100MHz程度になってしまいます。とりあえずsoftに変更しました。それでも今のところ、クリティカルパスは6.5nsです。

追記2:
Keep HierarchyがNoでも各モジュールごとにKEEP_HIERARCHY属性を付けることができた。moduleの頭に(* KEEP_HIERARCHY = "TRUE" *)を付ければOKだった。

(* KEEP_HIERARCHY = "TRUE" *)module dq_io_pad (

  1. 2009年06月09日 09:18 |
  2. FPGAのトラブル
  3. | トラックバック:0
  4. | コメント:0