2012年02月23日

Lattice Diamond メモ

MachXO2 の論理合成をするには、Lattice Diamond というツールを使う。

使いこなしているとは到底言えないレベルだが、使い方とか分かったことを忘れないようにメモしていこうと思う。

テーマの選択

    ついでなので、どうやって 使うかを順に説明しておこうかと思う。サンプルとして何を作るかについては、乗算回路にしようと思う。32bit の CPU も作ってみたいのだが、乗算器のない MachXO2 でどれぐらいの規模になるのか見ておきたいのが理由。ちなみに MachXO2 は、LUT4 の代わりに 2b x 2b 乗算器にできる。単純な LUT4 よりは規模を縮小できそうな機能がある。

プロジエクトの生成

    "Start Page" という タブに Open とか New があるので、New をクリック。
    ダイアログが現れるので、例えば

      Project:
      Name: diamond_test1
      Location: D:/diamond/diamond_test1
      Implementation:
      Name: xo2
      Location: D:/diamond/diamond_test1/xo2

    と入力してみる。Next の ソースの追加はスキップ して "Select Device" で LCMXO2-7000ZE-1FTG256C になるように入力する。そうすると 左側の "File List" は次のようになる。

      実際に動かす場合、MachXO2 Breaout ボードなら、LCMX2-1200ZE-1TG144C を選ぶのだが、今回は、入出力を全部ポート に割り当てると 必要ポートが多すぎで Map できないケースが出る。動かすつもりもないので、大きな規模のものに変更。

      ちなみに、後で変更できるので、間違っても気にしなくて良い。



    この時点で作成されたファイルは、diamond_test1 をカレントディレクトリとして

      xo2/diamond_test1_xo2_summary.html
      diamond_test1.lpf
      diamond_test1.ldf
      Strategy1.sty
      diamond_test1.pty


ソースコードの追加

    "Input Files" を右クリックして、ソースコードを追加していく。新規ファイルは New を選ぶ。のでトップレベルから。

      module mult_test (
      input [31:0] DataA
      , input [31:0] DataB
      , input Clock, ClkEn, Aclr
      , output [63:0] Result
      );

      wire [63:0] Result;

      `define USE_PMI
      `ifdef USE_PMI
      pmi_mult #(.pmi_additional_pipeline(0)
      , .pmi_dataa_width(32)
      , .pmi_datab_width(32)
      ) MU (.DataA(DataA[31:0])
      , .DataB(DataB[31:0])
      , .Clock(1'b0)
      , .ClkEn(1'b1)
      , .Aclr(1'b0)
      , .Result(Result[63:0])
      );
      `else
      assign Result = DataA * DataB;
      `endif
      endmodule

    この内容を mult_test_pmi.v で生成すると、"Input Files" に xo2/source/mult_test_pmi.v が追加される。

    さて、pmi というのは、Parameterized Module Instantiation の略で、プリミティブのようなもの。ただし、定義したファイルを 追加しないといけない。

    Diamond をインストールするディレクトリは、lscc/diamond/1.4 のような階層になっているが、そこから pmi_mult.v を検索すると ...

    ./examples/MachXOBoard-SWDemo/Demo_MachXO2_Control_SoC/LatticeMico8_v3_1_Verilog/models/pmi/pmi_mult.v
    ./ispfpga/verilog/data/pmi/pmi_mult.v
    ./cae_library/simulation/verilog/pmi/pmi_mult.v

    の 3 つが見つかる。ispfpga と cae_library/simulation の 2 つは同じもので最新版。examples/MachXOBoard-SWDemo/Demo_MachXO2_Control_SoC に Mico8 が付属するのだが、最新版ではなく、pmi_mult.v も少し古い。(Mico8 自体を最新版にしても pmi は古い)

    ispfpga のやつを Add することにしよう。"Exsiting File" で 追加するのだが、"Copy file to ..." のチェックボックスにチェックする。

論理合成

    `define USE_PMI をコメントにして合成してみる。

    "Process" のタブを選んで実行していくと次のような画面になる。
    (実際に動かす場合は、JEDEC file にチェックして作成する。その後は、Tools の Programmer で)



    出来たところで、Map の Design Summary を見てみると次のようになった。

    Design Summary
    Number of registers: 0
    PFU registers: 0
    PIO registers: 0
    Number of SLICEs: 581 out of 3432 (17%)
    SLICEs(logic/ROM): 581 out of 858 (68%)
    SLICEs(logic/ROM/RAM): 0 out of 2574 (0%)
    As RAM: 0 out of 2574 (0%)
    As Logic/ROM: 0 out of 2574 (0%)
    Number of logic LUT4s: 36
    Number of distributed RAM: 0 (0 LUT4s)
    Number of ripple logic: 563 (1126 LUT4s)
    Number of shift registers: 0
    Total number of LUT4s: 1162
    Number of PIO sites used: 128 out of 207 (62%)

    581 スライスも使っている。1200ZE なら全部で 640 スライスしかないから、これでは使い物にならない。

    次に `define USE_PMI を有効にして再度 合成してみる。

    Design Summary
    Number of registers: 0
    PFU registers: 0
    PIO registers: 0
    Number of SLICEs: 64 out of 3432 (2%)
    SLICEs(logic/ROM): 64 out of 858 (7%)
    SLICEs(logic/ROM/RAM): 0 out of 2574 (0%)
    As RAM: 0 out of 2574 (0%)
    As Logic/ROM: 0 out of 2574 (0%)
    Number of logic LUT4s: 64
    Number of distributed RAM: 0 (0 LUT4s)
    Number of ripple logic: 0 (0 LUT4s)
    Number of shift registers: 0
    Total number of LUT4s: 64
    Number of PIO sites used: 64 out of 207 (31%)

    64 スライスと規模が小さいのだが、PIO を 64 しか使っていない。どうも 16bit 乗算までで .pmi_dataX_width になにを書いても良いというわけではないようだ。失敗。

    失敗はしたが、16bit 乗算はどうも 64 LUT らしい。2b x 2b が 1LUT なら 4b x 4b が 4LUT 、8b x 8b が 16LUT となって 16b x 16b は 64LUT 。そうであれば、うまく作れれば 32b x 32b は 256 LUT 。ただし今のところうまく作れない。

    実際にうまく作れたとしても、1 クロックで 32bit 乗算をするのが現実的なのかどうか... やはり 乗算器がある FPGA に乗り換えるのが現実的に思える。MachXO2 で、なんとかするとしても テストぐらいにしておいた方が無難そうだ。

      MachXO2 Breakout ボードは気軽に使えて便利なのだ。使えるものなら使いたい。TQFP 144 の 1200ZE と 7000ZE ならピンコンパチだと思うので、載せ替えが可能なはず。載せ替え出来れば 回路的には余裕。ただ性能が出せないので、テストぐらいしか使えないと思う。テストなら無理して 最適化する必要もないし、すなおなコードで十分。

    大体分かったので、今回はこれぐらいにしておこう。

プロジェクトのtarball

    ところで、一旦 合成すると非常に多数のファイルが作成される。Make clean 相当のことをして 再現するのに最低限のファイルのみにして tarball にしたいのだが、どうしたら良いのだろう?
    一応 *.* xo2/source xo2/*.html でファイルを指定すると ...

      Strategy1.sty
      diamond_test1.ldf
      diamond_test1.lpf
      diamond_test1.pty
      xo2/source/
      xo2/source/mult_test_pmi.v
      xo2/source/pmi_mult.v
      xo2/diamond_test1_xo2_mrp.html
      xo2/diamond_test1_xo2_pad.html
      xo2/diamond_test1_xo2_par.html
      xo2/diamond_test1_xo2_summary.html
      xo2/diamond_test1_xo2_synplify.html

    これを違うディレクトリにもっていって Project を Open することは出来た。

    ただし、Input Files は、再指定しないといけない。( xo2/source にあるファイルを全指定するので、楽ではある)。あと、html ファイルは、summary 以外 report では、見ることができない。ブラウザなどで見ないといけないのだが、最後の状態が残っているので セーブする意味はあるだろう。

      追記:
      reportview.xml も 作成されていたので、これも セーブ。あと xo2/*.prf (Preference File) もセーブすれば良いみたい。


    ところで、Implementation とは何だろう? プロジェクトに対して右クリックで "New Implementation" を Add できるから 、いくつもの バージョンを持てるようだ。ただ、lpf とかは共有しているから 『同じハードウェアに対するもの』 というのが前提らしい。

    さらに言うと、同じトップディレクトリに 多数のプロジェクトを置いたらどうなるのだろう?

    Strategy1.sty は共有されるが、一応は置くことができる。Implementation を同じにしても プロジェクト名+Implementation で主なファイルが作られているから 整合性は問題なさそう。

    こういうことを前提にして、どうプロジェクトを組み立てたら良いか考えてみよう。

プロジェクトの構成

    いま、MachXO Breakout ボード と MachXO2 Breakout の 2 つのボードを持っている。それぞれに対して、rtavr の バリエーションがいくつか考えられる。(ただし ソースコードは共有)。また、全然違うソースのテスト用コードがある。

    ひとつの Top ディレクトリに 構成していくとするならどうしたら良いか。今の案を書いてみる。

    • まず、Top に rtavr と rtavr_tools のソースコードを展開する。いくつかの例外を除いて、この ソースコードを Copy せずに 使うことにする。

    • 例外とは、Include するファイル。rtavr だと rtavr_defs.v , rtavr_common.v , rom_data.mem の 3 つ。これらは、Implementation/source にコピーして使う。

        注意) Include するパスは、ソースを Add する前に 定義しておかないと面倒なことになる。Implementation名の Properties で 指定しておく。

        あと、ソースと同じディレクトリにあるファイルの方が優先されるので、都合が悪い場合は、ソースの方もコピー指定が必要。

    • プロジェクト名は、ボード名を元にしたものにする。この先に Implementation をぶらさげる。( Implementation はボード名が違えば 別名になるようにする。)

    とりあえず ...

    (Project) (Implementation)
    MachXO2_Breakout --- rtavr_isp_xo2
    +- test_hdl_xo2

    MachXO_Breakout --- rtavr_isp_xo
    +- test_hdl_xo

    こういう風に構成できるようにしてみよう。



    お、なんかできた。Implementation は、いずれか1つを Active にして使うようだ。

    ソース(rtavr-0.9.5.tar.gz , rtavr_tools-0.6.tar.gz) を除いて tarball にしてみたところ 4MB になった。これを違うマシンの パスが違うディレクトリに作成しなおしても 大丈夫のようだ。

    ただ、調子に乗って Implementation を作ってしまうと tarball が どんどん大きくなってしまう。

      プロジェクト名.*
      reportview.xml
      Strategy1.sty
      インプリテーション名/*.prf
      インプリテーション名/*.html
      インプリテーション名/source

    だけをセーブすると 100KB 程度と随分小さくなった。再ビルドも出来るみたいだし、プロジェクトのバックアップは これのみにしよう。

  • rtavr_diamond-sample.zip (2012/2/25 更新)

    プロジェクトのサンプルを ここに置いておく。(動かすためのものではなく、論理合成の確認用として) 今の最新版の rtavr と rtavr_tools も入れてある。

Warningのチェック

    例えば rtavr_isp_xo2 を合成すると Synthesis Design だけでも 相当な Waring が出る。これをチェックすることにした。

    まず、連鎖的に Waring になるものがある。とりあえずそれを除いて整理してみる。

      s/".*\\rtavr-0.9.5\\/"/
      /enable tied to GND/d
      /Undriven input .*, tying to 0/d
      /Found undriven nets .*, mapper will optimize them/d

    こんな sed スクリプトで、何種類かのものを削除。あとファイルのパスが長すぎるので 相対パスに変換。


      @W: MT420 |Found inferred clock xo2_isp|CLK0_OUT_inferred_clock with period 1000.00ns. Please declare a user-defined clock on object "n:CLK0_OUT"


    クロックの定義が必要らしい。JTM08_007(Spreadsheet ViewでのConstraint設定),JTM08_010(タイミング制約および検証に関する注意事項) を読んでも正直良く分からない。

      とりあえず、PLL 出力で位相差がある場合は、ちゃんと計算してくれることは分かった。ただ、この Warning が出るということは、周波数は計算してくれないようだ。全部に 同じ周波数を設定してやれば良いのだろうか?

      さて、CLK0_OUT_inferred_clock とは何だろう? コード上は、CLK0_OUTで 余計なサフィックスは付いていない。しかも、"n:CLK0_OUT" という別の名前が出ている。これで随分混乱している。

      いろいろやってみると、Spreadsheet View を使うと設定したものを 制約ファイル(lpf) に書いてくれる。あと、Synplity Pro と LSE では、設定が違うようだ。

      ちなみに、Spreadsheet View は、Translate Design が終わらないと設定変更できない。また、制約ファイル(lpf)は、 # でコメントを書けるようだ。

    なにをやっても埒があかない。ひょっとして、制約は基本 LSE 用であって、Synplity Pro 向けでは制限があるのかも。

      追記: JTM08_005(SynthesisのStrategy設定と制約記述) の 30p あたりから説明があった。少し分かってきているが、当面 LSE を使うつもり。

    クロックに関係する他の Warning で要チェックなもの。

      @W: MT462 :"soc\rtavr_rom_4p.v":110:16:110:67|Net RTAVR.ROM.CLK_B appears to be an unidentified clock source. Assuming default frequency.
      @W: MT462 :"soc\rtavr_rom_4p.v":156:18:156:31|Net RTAVR.ROM.CLK_L appears to be an unidentified clock source. Assuming default frequency.
      @W: MT462 :"soc\rtavr_sram.v":80:20:80:57|Net RTAVR.RAM.CLK_90_270 appears to be an unidentified clock source. Assuming default frequency.

    これらは、特殊なことをしているので、クロックとして認識されてしまう。READ と WRITE でタイミングを変えたり、 1クロックに 2 回アクセスしていたりする。

      @W: CG532 :"isp_sample\isp.v":215:4:215:10|Initial statement will only initialize memories through the usage of $readmemh and $readmemb. Everything else is ignored
      @W: CG532 :"soc\rtavr_rom_4p.v":283:2:283:8|Initial statement will only initialize memories through the usage of $readmemh and $readmemb. Everything else is ignored

    rom では、$readmemh 使っているのだが、まだ出る。rom_data.mem のサイズが違うのかとも思ったが合っていた。要調査。

    isp では、initial 文を register の初期値に使っていた。

    reg r_cs = 1'b0;

    の記述方法で書き換えると消えはする。

      @W: FX474 |User specified initial value found in some of the sequential elements in the design. Applying an initial value to a register may not deliver the best synthesis results. For example, registers with initial values may be preserved and retiming/pipelining may not be performed. To improve synthesis results you may want to remove the register initialization from the RTL code

    この諭すような、Waring は何なのだろう? とりあえずパス。

    これでもまだ多数の Warining が残る。だが、かなりの部分は規模を減らすオプションの結果。

      `define IOR_SPHBITS 2 // SPH bits 1-8 (-15 slices)

    例えば、スタックポインタの上位ビットを定数化するオプションを入れると ...

      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[2] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[3] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[4] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[5] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[6] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[7] is always 0, o
      ptimizing ...
      @W: CL279 :"soc\rtavr_ior_ps.v":403:4:403:9|Pruning register bits 7 to 2 of r_sp
      h[7:0]
      @W: CL246 :"soc\rtavr_ior_ps.v":56:18:56:22|Input port bits 15 to 10 of SP_IN[15
      :0] are unused

    これだけの Warning になるのだ。この手のものは、フル機能にすることでのみ Waring が消える。

    面倒だが、上の sed スクリプトを増強して、分かっているものを消していくのも手か。


      s/".*\\rtavr-0.9.5\\/"/
      /enable tied to GND/d
      /Undriven input .*, tying to 0/d
      /Found undriven nets .*, mapper will optimize them/d
      /rtavr_ior_ps.*Pruning .* r_sph/d
      /rtavr_ior_ps.*Register bit r_sph.[0-7]. is always 0, optimizing/d
      /rtavr_ior_ps.*Input port bits [0-9]* to [0-9]* of SP_IN.[0-9:]*. are unused/d
      /rtavr_ior_usart.*Pruning bit [0-9]* of rx_ps.* -- not in use/d
      /rtavr_ior_usart.*Pruning bit [0-9]* of tx_ps.* -- not in use/d
      /rtavr_ior_usart.*Pruning bits [0-9]* to .* rx_data.* -- not in use/d
      /rtavr_ior_usart.*Pruning bit [0-9]* of tx_data.* -- not in use/d
      /rtavr_ior_usart.*Pruning register bit 1 of r_count_max_x/d
      /rtavr_ior_usart.*Pruning register rx_parity/d
      /rtavr_ior_usart.*Register bit UPE is always ., optimizing/d
      /rtavr_ior_usart.*Register bit r_count_max_x.1. is always ., optimizing/d
      /rtavr_ior_usart.*Removing register 'RXB8' because/d
      /rtavr_ior_usart.*Removing register 'TXB8' because/d
      /rtavr_ior_usart.*Input WE_ubrrl is unused/d
      /rtavr_ior_usart.*Input WE_ucsrc is unused/d
      /rtavr_ior_usart.*Input WE_ubrrh is unused/d
      /rtavr_ior_usart.*Input XCK_IN is unused/d
      /rtavr_ior_usart.*Input XCK_DDR is unused/d
      /rtavr_ior_timer0.*Pruning register bit.* of r_prescaler/d
      /rtavr_ior_timer0.*Input WE_ocr0b is unused/d
      /rtavr_ior_timer0.*Input WE_ocr0a is unused/d
      /rtavr_ior_timer0.*Input WE_tccr0a is unused/d
      /rtavr_ior_port.*Input WE_pin is unused/d
      /rtavr_ior_port.*Input DI_pin is unused/d
      /rtavr_ior_spi.*Input SS_DDR is unused/d
      /rtavr_ior_spi.*Input MISO_IN is unused/d
      /rtavr_ior_spi.*Pruning register r_count_en/d
      /rtavr_ior_spi.*Pruning register r_ps/d
      /rtavr_ior_spi.*Input WE_spsr is unused/d
      /rtavr_rom_4p.*Pruning bit.* of r_addrb/d
      /rtavr_rom_4p.*Input port bit.* of ADDRA.* is unused/d
      /rtavr_rom_4p.*Input port bit.* of ADDRB.* is unused/d
      /rtavr_rom_4p.*Input OEA is unused/d
      /rtavr_s1_decode.*Pruning register r_wdr/d
      /rtavr_sram.*Pruning bit.* of r_addrb/d
      /rtavr_sram.*Input port bit.* of ADDRB/d


    十分ではないが、だいぶ見やすくなった。

      @W: CL157 :"soc\rtavr_ior_ms.v":71:18:71:20|*Output DDR has undriven bits -- simulation mismatch possible.
      @W: CL157 :"soc\rtavr_ior_ms.v":72:18:72:21|*Output PORT has undriven bits -- simulation mismatch possible.
      @W: CL246 :"soc\rtavr_ior_ms.v":73:18:73:20|Input port bits 15 to 0 of PIN[23:0] are unused
      @W: CL118 :"soc\rtavr_rom_4p.v":163:1:163:2|Latch generated from always block for signal r_doa[15:0]; possible missing assignment in an if or case statement.

    残ったのには、こんなものがある。チェックしていかないと。

    上 3 行の port 関係だが、

    // external I/O
    , output [23:0] DDR
    , output [23:0] PORT
    , input [23:0] PIN

    パラメータにこういう定義をしておいて、PORTC/PORTB/PORTA に割り当てている。PORTB/PORTA を有効にしていないので、ビット 15 - 0 が未定義のまま。上位レイヤーも 未定義な bit は使わない。

    これでも良いかということにしたのだが、論理合成では問題ないものの、Active-HDL でまずいかも ... ということか。
    下のやつは、これ。

    `ifdef ROM_USE_LATCH
    `ifdef SYS_DRIVEN_CLK4PH
    wire CLK_L = CLK_180 | OEB;
    `else
    wire CLK_L = CLK | OEB;
    `endif

    always @(ROM_DO_AB or CLK_L)
    begin
    if(~CLK_L) r_doa <= ROM_DO_AB;
    end
    assign DOA = r_doa;
    `else

    ROM_USE_LATCH というローカル define を有効にしていて、正に ラッチを作ろうとしている。遅延の最適化がそうした理由だった。まぁ目的どおりだから良いのかな?

LSEに切り替え

    デフォルトが Synplify Pro だったので、そちらがお薦めなのかと思って使っていたが、残念なことに良くわからない。 Tools に Synplify Pro for lattice なんてのがあって、これを立ち上げると、Diamond と同じような window が出てくる。Synplify Pro 専用の制約ファイル(sdc)なんてのもあるようだし、上記の "n:CLK0_OUT" とかは、その制約ファイルで使うものらしい。

    お気軽に使うのなら、LSE の方が良さそうに思えてきたので、合成ツールを 切り替えることにした。


      Preference Summary

      FREQUENCY NET "CLK_INT" 2.080000 MHz (0 errors)
      FREQUENCY NET "CLK_IN0" 24.000000 MHz (0 errors)

      FREQUENCY NET "CLK0_OUT" 33.000000 MHz (4096 errors)
      4096 items scored, 4096 timing errors detected.
      Warning: 12.772MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK90_OUT" 33.000000 MHz (1024 errors)
      2395 items scored, 1024 timing errors detected.
      Warning: 14.775MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK180_OUT" 33.000000 MHz (1726 errors)
      4096 items scored, 1726 timing errors detected.
      Warning: 15.232MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK270_OUT" 33.000000 MHz (737 errors)
      4096 items scored, 737 timing errors detected.
      Warning: 19.077MHz is the maximum frequency for this preference.

      FREQUENCY PORT "EXTOSC" 24.000000 MHz (0 errors)
      Report: 150.150MHz is the maximum frequency for this preference.

      PERIOD PORT "TOP_TCK" 0.100000 nS (1 errors)
      0 items scored, 1 timing error detected.

    LSE を使ったらクロックの設定が認識された。33 MHz にしてみたが、それは無理そうだということも分かった。まぁ HE と中身が同じなら 4 グレードレベル程度まではオーバクロック出来そうな気もするが。

    ちなみに Strategies を Space に変更した上で、GPR_16 を有効にして スペースを稼ぐ設定にしたから最遅
    という条件。

      "CLK0_OUT": 18.491MHz is the maximum frequency

      4 グレードの HC でやってみたらこうなった。ざっと 1.5 倍か。

      strategies を Strategy1 に戻し、GPR_16 も無効にすると 20 MHz ぐらい。

      FREQUENCY NET "CLK0_OUT" 22.000000 MHz (0 errors)
      Report: 25.938MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK90_OUT" 22.000000 MHz (0 errors)
      Report: 28.073MHz is the maximum frequency for this preference.

      REQUENCY NET "CLK180_OUT" 22.000000 MHz (0 errors)
      Report: 32.356MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK270_OUT" 22.000000 MHz (0 errors)
      Report: 29.255MHz is the maximum frequency for this preference.

      さらに、22 MHz で制約を変更すると 25.9 MHz 。

rtavr_diamond-sample.zip(2012/2/25 更新) を試す

    大分脱線してしまったが、すぐ試せるものをリリースできるかどうかは、重要だ。それにクロックも。どれぐらいで動くものなのか知らないと動かすのが難しい。

    さて、上記のものを展開して、MachxO2_Breakout.ldf を open すると test_hdl_xo2 がターゲットの インプリメンテーションになっている。

    project の JEDEC File にチェックを付け、ダブルクリックをすると ... なにやら出来上がる。

    で、programmer で書き込みしようとすると、xcf ファイルがないと言われてエラーになる。この場合は、Scan 実行すると xcf ファイルが生成されて オペレーションが出来るようになる。(Check XCF File だったかも)

    動かしてみると ... LED0/1 と LED 2-5 が 1 秒毎ぐらいで点滅し、LED 2-5 の点滅が遅れて ずれるために光が流れるような動きをする。これが予定通りの動き。

    warning について

    沢山 warning が出るのだが、

      OSCH 'osc_internal' has mismatching FREQUENCY preference value of 2.08 MHz and NOM_FREQ value of 24.18 MHz.

    まず気になるのはこれ。24.18 MHz だと 1 秒ぐらいの点滅間隔なので、コードに書いた NOM_FREQ が有効のようだ。

    2.08 MHz というのは、デフォルトで勝手に設定される。Spread sheet View の Timing Preferences で NET "CLK" を modify するか、制約ファイル(lsf)に

    FREQUENCY NET "CLK" 24.180000 MHz ;

    を追加するかすれば、直るはず。


      ERROR - <E0055> Port 'TXD' is unconnected.
      ERROR - <E0055> Port 'RXD' is unconnected.

    なんてエラーが出る場合がある。これは、rtavr と同じ制約ファイルを使っているため。# でコメントすれば一応は出なくなる。ただ、インプリメンテーションを変更する毎にいちいち編集はしてられない。

    さて、

      WARNING - trce: Output clock frequency on pin CLKOP of pll is 12.0 MHz, whichwith divider 16, requires internal VCO frequency to be 192.0 MHz ( 12.0 MHz x 16), outside VCO valid range [400, 800] MHz.

    この手の warning がやたら出てうるさい。


      FREQUENCY NET "CLK" 24.180000 MHz ;
      FREQUENCY NET "CLK_IN0" 24.000000 MHz ;
      FREQUENCY NET "CLK0_OUT" 24.000000 MHz ;
      FREQUENCY NET "CLK90_OUT" 24.000000 MHz ;
      FREQUENCY NET "CLK180_OUT" 24.000000 MHz ;
      FREQUENCY NET "CLK270_OUT" 24.000000 MHz ;
      FREQUENCY PORT "EXTOSC" 24.000000 MHz ;
      FREQUENCY PORT "TOP_TCK" 0.100000 MHz ;

    まずは、制約ファイル。一応近い値にしてやる。これだけだと 400 MHz 以下なので、too_test.v の

    , .CLKOP_DIV(32)
    , .CLKOS_DIV(32)
    , .CLKOS2_DIV(32)
    , .CLKOS3_DIV(32)

    CLKOP_DIV 等の値を全部 2 倍の 32 にすると 見事消えてくれる。

    これで、Warning は随分見やすくなる。

      WARNING - synthesis: logical net 'TXD' has no load
      WARNING - synthesis: input pad net 'TXD' has no legal load
      :
      WARNING - map: input pad net 'TXD' has no legal load
      WARNING - map: input pad net 'RTS' has no legal load
      WARNING - map: input pad net 'DTR' has no legal load
      WARNING - map: input pad net 'RXD' has no legal load
      WARNING - map: input pad net 'CTS' has no legal load
      WARNING - map: IO buffer missing for top level port TXD...logic will be discarde
      d.
      :

    これは、top モジュールの引数に書いてあるのに使っていないため。エラーになることはないので無視。

      WARNING - synthesis: logical net 'clk_count1_113_add_4_1/CI' has no driver
      WARNING - synthesis: logical net 'clk_count1_113_add_4_1/S0' has no load
      WARNING - synthesis: logical net 'clk_count2_114_add_4_25/CO' has no load

    これは、加算器のキャリー関係。明示的に記述もしてないし、勝手に作られて、勝手に消される。これも無視。/CI /CO /S0 /S1 あたりが対象。

    こうやって直していくのは良いのだが ... インプリメンテーションを変更した時どうするのが良いのだろう?

    lpf ファイルは、複数持てる。で、インプリメンテーション同様に 1 つをアクティブにするという使いかたをする。よく分からなかったのだが、JTM08_002(プロジェクト管理) 29p あたりに書いてあった。

付録

    どこでどんなファイルを使っているか、抜けはあると思うがまとめてみた。

    synpwrap: Synthesize Design (Synplify Pro)
    MachXO2_Breakout_test_hdl_xo2_synplify.tcl
    MachXO2_Breakout_test_hdl_xo2.srf
    synlog/MachXO2_Breakout_test_hdl_xo2_premap.srr
    synlog/MachXO2_Breakout_test_hdl_xo2_fpga_mapper.srr
    MachXO2_Breakout_test_hdl_xo2.srm

    edif2ngd:
    MachXO2_Breakout_test_hdl_xo2.edi
    MachXO2_Breakout_test_hdl_xo2.ngo

    ngdbuild:
    MachXO2_Breakout_test_hdl_xo2.ngo
    MachXO2_Breakout_test_hdl_xo2.ngd

    synthesis: Sythesize Design (LSE)
    MachXO2_Breakout_test_hdl_xo2_lattice.synproj
    MachXO2_Breakout_test_hdl_xo2.ngd

    map: Map Design
    MachXO2_Breakout_test_hdl_xo2.ngd
    MachXO2_Breakout_test_hdl_xo2_map.ncd
    MachXO2_Breakout_test_hdl_xo2.prf
    MachXO2_Breakout_test_hdl_xo2.mrp

    mpartrce:
    MachXO2_Breakout_test_hdl_xo2.p2t
    MachXO2_Breakout_test_hdl_xo2.p3t

    MachXO2_Breakout_test_hdl_xo2.pt
    MachXO2_Breakout_test_hdl_xo2_map.ncd
    MachXO2_Breakout_test_hdl_xo2.ncd

    par: Place & Route Design
    MachXO2_Breakout_test_hdl_xo2.p2t
    MachXO2_Breakout_test_hdl_xo2_map.ncd
    MachXO2_Breakout_test_hdl_xo2.dir
    MachXO2_Breakout_test_hdl_xo2.prf

    # Dumping design to file MachXO2_Breakout_test_hdl_xo2.dir/5_1.ncd.

    trce: Place & Route Trace
    MachXO2_Breakout_test_hdl_xo2.pt
    MachXO2_Breakout_test_hdl_xo2.twr
    MachXO2_Breakout_test_hdl_xo2.ncd
    MachXO2_Breakout_test_hdl_xo2.prf

    iotiming: I/O Timing Analysis
    MachXO2_Breakout_test_hdl_xo2.ncd
    MachXO2_Breakout_test_hdl_xo2.prf

    bitgen: Export Files (JEDEC File)
    MachXO2_Breakout_test_hdl_xo2.t2b
    MachXO2_Breakout_test_hdl_xo2.ncd
    MachXO2_Breakout_test_hdl_xo2.prf (Preference File)
    MachXO2_Breakout_test_hdl_xo2.jed

参考資料

  • Lattice Diamond 1.3 マニュアル

    JTM08_001 インストールとライセンス設定
    JTM08_002 プロジェクト管理
    JTM08_003 GUIのカスタマイズと環境設定
    JTM08_004 デザインフローとRun Mangerによる並列処理
    JTM08_005 SynthesisのStrategy設定と制約記述
    JTM08_006 Translate DesignのStrategy設定と注意点
    JTM08_007 Spreadsheet ViewでのConstraint設定
    JTM08_008 Package Viewによるピンアサイン
    JTM08_010 タイミング制約および検証に関する注意事項
    JTM01_009 SSO Analyzerユーザーマニュアル
    JTM08_012 Map DesignのStrategy設定と注意事項
    JTM08_015 Map Traceとシミュレーション
    JTM08_013 Place & Route DesignのStrategy設定と注意事項
    JTM08_016 Place & Route TraceとI/O Timing Analysis
    JTM05_001 Power Calculatorユーザマニュアル
    JTM08_018 シミュレーション・ユーザガイド
    JTM08_014 書き込みデータ生成


  • file:///C:/lscc/diamond/1.4/docs/webhelp/eng/start_page.htm オフラインドキュメント(1.4)
posted by すz at 23:48| Comment(0) | TrackBack(0) | MachXO2
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/54121195
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック