fc2ブログ

[vivado]linux-on-litex-vexriscvを試す

■参照先

https://github.com/litex-hub/linux-on-litex-vexriscv
 → 基本はこちらで進める。
https://gist.github.com/ibndias/6f44d1d55251324f5b873436ad290ab3
 → 一部のコマンドだけここを参考に。

■必要なもの ※ 必須ではないと思うが、自分が使ったもの
・ホストPC(INTEL CPU、メモリ12GB、Ubuntu 20.04.6)
・Digilent製Arty A7 100Tボード https://akizukidenshi.com/catalog/g/gM-13488/
・MicroUSBケーブル(FPGAボードとPC接続用)

■手順


スクリプト

スポンサーサイト



[vivado]schematicビューワが良い感じ

これまでQuartusの方ばかり使ってたが、Digilent社Arty A7ボードをいじるためにvivadoを使ってる。
回路を追いかけるために以前からRTL回路ビューワが欲しかったが、vivadoのSchematic機能良い感じ。

■Schematic起動方法

Vivado起動
 > Flow Navigator
 > SYNTHESIS > Run Synthesisを実行しておく。
 > SYNTHESIS > Schematicで起動

■UIが良い感じ

ASICツールに慣れてしまった身としては、出来る限り、Verdiと同じような使い勝手が望ましい。

配線へのハイライト機能: 右クリック > Highlight > 非常に良い
Zoom In: マウスドラッグ > 非常に良い
Zoom Out: defaultはCtrl + -(マイナス) > (defaultは×だが、ショートカットキー登録する事で)非常に良い

■Schematic ショートカットキー登録方法
vivado > Tools > Settings > Tool Settings > Shortcuts
 > All Actions > Main Menu > View > Zoom Out : ここでAddすればある程度自由にキー登録可能。例:3
 > All Actions > Schematic > Previous schematic : こちらも同様に好きなキーを登録する。例:4

これである程度回路を追いかける作業が楽になった。
Quartusの回路図ビューワよりも断然良いと感じる。

その他、tcl consoleで使えるpt_shellコマンドも多いように感じるし、どうもXilinxツールの方が魅力的に見えて来た。。

[vivado]TCLコマンド

■背景

オープンソースのCPUコアでLinuxブートのシミュレーションがしたい。
 ↓
RVSOCプロジェクトというものを見つけた。
https://www.arch.cs.titech.ac.jp/wk/rvsoc/doku.php

 ↓
置いてあるsrcデータzipをもってきて、Arty A7 100Tボード向けにvivadoでコンパイルしようとすると、論理合成(synth)は成功するが、実装(impl)では以下エラーが出た。

"[Place 30-370] An unconstrained Phaser instance has been found. Phaser instances and their associated IO logic must be LOC constrained to a legal site locations for placement to succeed. Check to see whether all core constraints were properly used or manually add LOC constraints for the following instance(s).

Unconstrained Phaser instance(s):
Inst 'phaser_out'"


 ↓
MIGで作られているDDR周りのI/O配置?でエラーが出ているように見える。
この対策を探していると、以下記事では、xdcで、INST "xxx" LOC=PHASER_OUT_PHY_X1Y13、
のようにLOC制約で配置先を明示してあげれば良いらしい(?)
https://support.xilinx.com/s/article/46617?language=ja
 ↓
どこで調べたか忘れてしまったが、以下のようにxdcに書くべきらしい。

set_property LOC PHASER_OUT_PHY_X0Y14 [get_cells c/dram_con/phaser_out_i_2 ]


 ↓
そもそもPHASER_OUT_PHY_X1Y2といった物理的な配置名をどうやって調べるのか?
 ↓
get_cellsとか、いろんなコマンドが使えるTCLコマンドを使えば、何か情報あるのでは?
 ↓
以下のpage13の表を見ると、OLOGIC_X1Y27とかの配置場所名はsite(サイト)と呼ぶらしい。
https://docs.xilinx.com/v/u/ja-JP/ug835-vivado-tcl-commands
 ↓
この辺のPDFを読んでると、get_sitesというコマンドがあった。
https://www.xilinx.com/content/dam/xilinx/support/documents/sw_manuals_j/xilinx2019_2/ug912-vivado-properties.pdf


■Vivado TCLコンソールメモ

1.vivado起動

2.画面下のTCL consoleで以下実行。

open_project C:/xxx/arty100t.xpr


これでプロジェクトが開かれた。(既に一度論理合成(synthesis)は成功してる状態)

3.画面下のtcl consoleで以下実行。

open_run -name arty100t synth_1



4.ここまでで回路データベースの探索が可能な状態になった。それでは実際にやってみる。

get_cells * -hier -filter "LOC =~ OLOGIC*"


これは成功して、該当するインスタンスパス名が表示された。

get_cells * -hier -filter "LOC =~ PHASER_OUT_PHY*"


しかし、これは見つからない。何か使い方が違うらしい。

5.この後、以下を実行したら、site名を出力してくれた。

get_sites PHASER_OUT_PHY*


PHASER_OUT_PHY_X0Y14 PHASER_OUT_PHY_X0Y15 PHASER_OUT_PHY_X0Y12 PHASER_OUT_PHY_X0Y13 PHASER_OUT_PHY_X0Y10 PHASER_OUT_PHY_X0Y11 PHASER_OUT_PHY_X1Y10 PHASER_OUT_PHY_X1Y11 PHASER_OUT_PHY_X0Y8 PHASER_OUT_PHY_X0Y9 PHASER_OUT_PHY_X1Y8 PHASER_OUT_PHY_X1Y9 PHASER_OUT_PHY_X0Y6 PHASER_OUT_PHY_X0Y7 PHASER_OUT_PHY_X1Y6 PHASER_OUT_PHY_X1Y7 PHASER_OUT_PHY_X0Y4 PHASER_OUT_PHY_X0Y5 PHASER_OUT_PHY_X1Y4 PHASER_OUT_PHY_X1Y5 PHASER_OUT_PHY_X0Y2 PHASER_OUT_PHY_X0Y3 PHASER_OUT_PHY_X0Y0 PHASER_OUT_PHY_X0Y1


Artix 7 100Tに存在するPHASR_OUT_PHY関連のSITE名リストが上記って事らしい。
ここまでは出来たが、実際当初のエラーを消すために、どこのSITE名をLOC指定するべきなのか、考え方がよくわからない。

6.試しに以下手順でxdcファイルへ追記してみたら、インプリメンテーションが成功した。

(1)get_sites PHY_CONTROL*
 → これでPHY_CONTROL関連のsite名が分かる。PHASER_OUT、PHY_CONTROL、PHASER_RE、PHASER_INでも同じやり方。

(2)get_cells -hier -filter {NAME =~ *phy_control*}
 → これでphy_controlが使用されているインスタンス名リストを確認する。

(3)xdcファイルへ制約を追記。以下は各種エラー対策した全ての追記内容。
上でも書いたけど、数あるsite名の中で、以下siteを指定してLOC制約にした根拠は無し。調べたsite名をてきとーに選んだだけ。

set_property LOC PHASER_OUT_PHY_X0Y14 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_out_i_2 ]
set_property LOC PHASER_OUT_PHY_X0Y15 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_out_i_2__2 ]
set_property LOC PHASER_OUT_PHY_X0Y12 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_out_i_3__0 ]
set_property LOC PHASER_OUT_PHY_X0Y13 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_out_i_3__2 ]
set_property LOC PHASER_OUT_PHY_X0Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_out_i_4 ]
set_property LOC PHASER_OUT_PHY_X0Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1 ]
set_property LOC PHASER_OUT_PHY_X1Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1__0 ]
set_property LOC PHASER_OUT_PHY_X1Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1__1 ]
set_property LOC PHASER_OUT_PHY_X0Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_1__2 ]
set_property LOC PHASER_OUT_PHY_X0Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_2__0 ]
set_property LOC PHASER_OUT_PHY_X1Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_2__1 ]
set_property LOC PHASER_OUT_PHY_X1Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_3 ]
set_property LOC PHASER_OUT_PHY_X0Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_3__1 ]
set_property LOC PHASER_OUT_PHY_X0Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/mb_wrlvl_inst.u_ddr_phy_wrlvl/phaser_out_i_4__0 ]
set_property LOC PHASER_OUT_PHY_X1Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_A.ddr_byte_lane_A/phaser_out]
set_property LOC PHASER_OUT_PHY_X1Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_B.ddr_byte_lane_B/phaser_out]
set_property LOC PHASER_OUT_PHY_X0Y4 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_C.ddr_byte_lane_C/phaser_out]
set_property LOC PHASER_OUT_PHY_X0Y5 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_D.ddr_byte_lane_D/phaser_out]

set_property LOC PHASER_IN_PHY_X0Y14 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_in_gen.phaser_in_i_2 ]
set_property LOC PHASER_IN_PHY_X0Y15 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/phaser_in_gen.phaser_in_i_2__0 ]
set_property LOC PHASER_IN_PHY_X0Y12 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_1 ]
set_property LOC PHASER_IN_PHY_X0Y13 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_10 ]
set_property LOC PHASER_IN_PHY_X0Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_10__0 ]
set_property LOC PHASER_IN_PHY_X0Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_11 ]
set_property LOC PHASER_IN_PHY_X1Y10 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_11__0 ]
set_property LOC PHASER_IN_PHY_X1Y11 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_1__0 ]
set_property LOC PHASER_IN_PHY_X0Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_3 ]
set_property LOC PHASER_IN_PHY_X0Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_3__0 ]
set_property LOC PHASER_IN_PHY_X1Y8 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_4 ]
set_property LOC PHASER_IN_PHY_X1Y9 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_4__0 ]
set_property LOC PHASER_IN_PHY_X0Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_6 ]
set_property LOC PHASER_IN_PHY_X0Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_6__0 ]
set_property LOC PHASER_IN_PHY_X1Y6 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_7 ]
set_property LOC PHASER_IN_PHY_X1Y7 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_7__0 ]
set_property LOC PHASER_IN_PHY_X0Y4 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_8 ]
set_property LOC PHASER_IN_PHY_X0Y5 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_8__0 ]
set_property LOC PHASER_IN_PHY_X1Y4 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_9 ]
set_property LOC PHASER_IN_PHY_X1Y5 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/ddr_phy_rdlvl_gen.u_ddr_phy_rdlvl/phaser_in_gen.phaser_in_i_9__0 ]
set_property LOC PHASER_IN_PHY_X0Y2 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_in_gen.phaser_in_i_5 ]
set_property LOC PHASER_IN_PHY_X0Y3 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_calib_top/dqsfind_calib_left.u_ddr_phy_dqs_found_cal_hr/phaser_in_gen.phaser_in_i_5__0 ]
set_property LOC PHASER_IN_PHY_X0Y0 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_C.ddr_byte_lane_C/phaser_in_gen.phaser_in]
set_property LOC PHASER_IN_PHY_X0Y1 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/ddr_byte_lane_D.ddr_byte_lane_D/phaser_in_gen.phaser_in]

set_property LOC PHASER_REF_X0Y3 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_ddr3_infrastructure/phaser_ref_i_i_1 ]
set_property LOC PHASER_REF_X0Y2 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/phaser_ref_i]

set_property LOC PHY_CONTROL_X0Y3 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_ddr3_infrastructure/phy_control_i_i_1 ]
set_property LOC PHY_CONTROL_X0Y2 [get_cells c/dram_con/dram/dram/dram_con_witout_cache/dc/mig/u_mig_7series_0_mig/u_memc_ui_top_std/mem_intfc0/ddr_phy_top0/u_ddr_mc_phy_wrapper/u_ddr_mc_phy/ddr_phy_4lanes_0.u_ddr_phy_4lanes/phy_control_i]



(4)run implementation実行

[vivado]メモ

Tclコマンド

llength [all_registers -rise_clock clk]clk立上り駆動レジスタ数の表示
check_timing -ver -file rep.ch_timing.txtcheck_timing結果をファイル出力
report_timing -delay max -file rep.max.txtsetupタイミングレポートをファイル出力
report_timing -delay min -file rep.min.txtholdタイミングレポートをファイル出力





Tclフロー

Digilent社ZYBO revBで、TCLスクリプトで操作してみた。

Vivado 2017.4起動
 > TclコンソールでプロジェクトDIRへ移動。
    例えば、cd work/zybo/hoge/
 > Tclコンソールで source zybo.tcl を実行。

これで、Vivado起動した状態から、ZYBOへの.bitプログラムまで自動で行える。
サンプル回路は単なるLEDチカチカ。

<zybo.tclの内容>


close_project -quiet

set outputDir .
#---------------------------------------------------------
# read rtl
#---------------------------------------------------------
read_verilog cnt.v

#---------------------------------------------------------
# synthesis
#---------------------------------------------------------
synth_design -top cnt -part xc7z010clg400-1
report_timing_summary -file $outputDir/post_synth_timing_summary.rpt
report_utilization -file $outputDir/post_synth_util.rpt

set_property -dict [list PACKAGE_PIN {L16} IOSTANDARD {LVCMOS33}] [get_ports clk ] ; # oscillator

set_property -dict [list PACKAGE_PIN {Y16} IOSTANDARD {LVCMOS33}] [get_ports reset ] ; # button 1
# set_property -dict [list PACKAGE_PIN {V16} IOSTANDARD {LVCMOS33}] [get_ports ] ; # button 2
# set_property -dict [list PACKAGE_PIN {P16} IOSTANDARD {LVCMOS33}] [get_ports ] ; # button 3
# set_property -dict [list PACKAGE_PIN {R18} IOSTANDARD {LVCMOS33}] [get_ports ] ; # button 4

set_property -dict [list PACKAGE_PIN {D18} IOSTANDARD {LVCMOS33}] [get_ports led[0] ] ; # LED 1
set_property -dict [list PACKAGE_PIN {G14} IOSTANDARD {LVCMOS33}] [get_ports led[1] ] ; # LED 2
set_property -dict [list PACKAGE_PIN {M15} IOSTANDARD {LVCMOS33}] [get_ports led[2] ] ; # LED 3
set_property -dict [list PACKAGE_PIN {M14} IOSTANDARD {LVCMOS33}] [get_ports led[3] ] ; # LED 4

#---------------------------------------------------------
# timing constraint
#---------------------------------------------------------
create_clock -period 20 [get_ports clk ]

#---------------------------------------------------------
# place
#---------------------------------------------------------
opt_design
place_design
report_clock_utilization -file $outputDir/clock_util.rpt

#---------------------------------------------------------
# opt after place
#---------------------------------------------------------
if {[get_property SLACK [get_timing_paths -max_paths 1 -nworst 1 -setup]] < 0} {
puts "Found setup timing violations => running physical optimization"
phys_opt_design
}
report_utilization -file $outputDir/post_place_util.rpt
report_timing_summary -file $outputDir/post_place_timing_summary.rpt

#---------------------------------------------------------
# route
#---------------------------------------------------------
route_design
#write_checkpoint -force $outputDir/post_route.dcp
report_route_status -file $outputDir/post_route_status.rpt
report_timing_summary -file $outputDir/post_route_timing_summary.rpt
report_power -file $outputDir/post_route_power.rpt
report_drc -file $outputDir/post_imp_drc.rpt
write_verilog -force $outputDir/cnt_impl_netlist.v -mode timesim -sdf_anno true

#---------------------------------------------------------
# generate bitstream
#---------------------------------------------------------
write_bitstream -force $outputDir/cnt.bit


#---------------------------------------------------------
# program
#---------------------------------------------------------
open_hw
connect_hw_server

open_hw_target {localhost:3121/xilinx_tcf/Digilent/210279A78FE1A}
#INFO: [Labtoolstcl 44-466] Opening hw_target localhost:3121/xilinx_tcf/Digilent/210279A78FE1A
current_hw_device [get_hw_devices xc7z010_1]
refresh_hw_device -update_hw_probes false [lindex [get_hw_devices xc7z010_1] 0]
#INFO: [Labtools 27-1434] Device xc7z010 (JTAG device index = 1) is programmed with a design that has no supported debug core(s) in it.

# INFO: [Labtools 27-2285] Connecting to hw_server url TCP:localhost:3121
set_property PROBES.FILE {} [get_hw_devices xc7z010_1]
set_property FULL_PROBES.FILE {} [get_hw_devices xc7z010_1]
set_property PROGRAM.FILE {C:/user/work/zybo/ether/ether.runs/impl_1/cnt.bit} [get_hw_devices xc7z010_1]
program_hw_devices [get_hw_devices xc7z010_1]
# INFO: [Labtools 27-3164] End of startup status: HIGH
refresh_hw_device [lindex [get_hw_devices xc7z010_1] 0]






Kintex-7  xc7k160tffg676-2

7 Series FPGAs Packaging and Pinout
https://www.xilinx.com/support/documentation/user_guides/ug475_7Series_Pkg_Pinout.pdf




作業フォルダのデフォルト位置変更

デスクトップのアイコン「Vivado 2017.4」
 > 右クリック > プロパティ
 > 作業フォルダー

旧: %APPDATA%\Xilinx\Vivado
新: C:\user


に変更した。
これでアイコンから起動した際、Tcl consoleでpwdすると、カレントフォルダがC:\userになってる。





Device ManagerがunconnectedでProgramできない
Auto Connectしてもすぐにdisconnectされる。
ZYBOの電源をOFF -> ONしたら、Auto Connectでconnectされるようになり、Program Deviceのリンクも表示された。

[vivado]ZYBO(1)

https://github.com/Digilent/vivado-boards/archive/master.zip

ここからダウンロードしたzipを解凍し、その中のnewフォルダ以下のデータを以下にコピーする。
C:\Xilinx\Vivado\2017.4\data\boards\board_files

カレンダー
02 | 2024/03 | 04
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード