メインコンテンツへスキップ
見出し画像

Ross 最初の一歩 令和8年10月6日(火)

    AMD Rossを使って、ループエンジニアリングができるか試す。

    画像
    まずは Get Started

    結論、できそう!(まだ最後までやれてない💦)

    私のLaptopの環境はWindows11、
    VSCodeのTerminal(Git-Bash)から、Opencode(LLM : Muse Spark 1.3 Free)をCLIで起動して使います。
    メーカー製ツールは、Vivado/Vitis 2026.1 Basicを、評価ボードは、Zybo Z7-20を使います。


    STEP0 : Vivado MCP Serverを設定する

    Vivado MCP Server(Windows版)をダウンロードして、任意のフォルダ(私はC:/AMDDesignTools/ross/bin/)へコピーする。

    画像
    Downloadページへのリンク
    画像
    ダウンロードするには事前にアカウント登録が必要

    VSCodeでTerminal(Git-Bash)を開き、~/.bashrcを編集する。

    $ cd
    $ vi .bashrc
    
    [ 下記を追加 ]
    
    # Xilinx ツール群のパス設定
    export XILINX_VIVADO="/c/AMDDesignTools/2026.1/Vivado"
    export XILINX_VITIS="/c/AMDDesignTools/2026.1/Vitis"
    
    # PATHの追加(Windowsのパス形式ではなく、Git BashのUnix形式で指定)
    export PATH="$XILINX_VIVADO/bin:$XILINX_VITIS/bin:$PATH"
    
    # MCPサーバー実行ファイルのパスを追加
    export PATH="/c/AMDDesignTools/ross/bin/:$PATH"
    
    alias xsdb='xsdb.bat'
    
    [ 保存し終了 ]
    
    $ source .bashrc
    
    [ パスが通っているかの確認 ]
    
    $ vivado  -version
    
    vivado v2026.1 (64-bit)
    Tool Version Limit: 2026.06
    SW Build 6511674 on Tue Jun 16 11:02:23 MDT 2026
    IP Build 6504888 on Tue Jun 09 09:05:25 MDT 2026
    SharedData Build 6501428 on Mon Jun 08 17:34:18 MDT 2026
    Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
    Copyright 2022-2026 Advanced Micro Devices, Inc. All Rights Reserved.
    
    
    $ vitis -v
    
    ****** Xilinx Vitis Development Environment
    ****** Vitis v2026.1 (64-bit)
    ****** SW Build 6511674 on 2026-06-16-13:14:45
        ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
        ** Copyright 2022-2026 Advanced Micro Devices, Inc. All Rights Reserved.
    
    $ xsdb
    
    ****** System Debugger (XSDB) v2026.1
      **** Build date : May 29 2026-14:58:42
        ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
        ** Copyright 2022-2026 Advanced Micro Devices, Inc. All Rights Reserved.
    
    
    xsdb% exit
    exit

    OpencodeのConfigファイル

    ~/.config/opencode/opencode.jsonc

    に、前記でダウンロードしたMCPサーバー実行ファイルのバスや変数を追加する。今まで書き換えたことは一度もなく、下記だけだったものに

    {
      "$schema": "https://opencode.ai/config.json"
    }

    下記のように追加。

    {
      "$schema": "https://opencode.ai/config.json",
      "mcp": {
        "amd-vivado-vitis-mcp": {
          "type": "local",
          "command": ["C:/AMDDesignTools/ross/bin/vivado-mcp-server-windows-amd64-2026.9.1.exe", "--stdio-bridge"],
          "args": [],
          "environment": {
            "XILINX_VIVADO": "C:/AMDDesignTools/2026.1/Vivado",
            "XILINX_VITIS": "C:/AMDDesignTools/2026.1/Vitis",
            "PATH": "C:/AMDDesignTools/2026.1/Vivado/bin;C:/AMDDesignTools/2026.1/Vitis/bin;%PATH%"
          }
        }
      }
    }
    

    念のため、VSCode、Git-Bash、Opencodeを起動しなおします。

    STEP1 : MCP Serverとの疎通を確認させる

    Agentに、MCP Serverが正しく設定されているか、確認させます。

    現在、あなたのMCPツールとして amd-vivado-vitis-mcp が正常にロードされていますか?
    利用可能なAMDツール環境(VivadoパスやVitisパス)を正しく認識できているか教えてください。

    正常にロードできているみたい。

    画像
    Agentに確認させるのが手っ取り早い

    STEP2 : 実機をJTAGスキャンさせる

    LaptopにZybo Z7をUSBケーブルで接続し電源オンしておいて、もうひとつTerminal(Git-Bash)を開いてhw_serverを起動しておきます。
    (Agentが起動してくれる筈だけど念のため)

    $ hw_server
    
    ****** Xilinx hw_server v2026.1
      **** Build date : May 29 2026 at 14:55:19
        ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
        ** Copyright 2022-2026 Advanced Micro Devices, Inc. All Rights Reserved.
    
    INFO: hw_server application started
    INFO: Use Ctrl-C to exit hw_server application
    
    INFO: To connect to this hw_server instance use url: TCP:yka2ki_lenovo00:3121

    Agentが、このhw_serverを経由して、Zybo Z7ボードにアクセスします。

    実機ボードがJTAG接続されています。バックグラウンドで xsdb を起動し、
    connect コマンドでローカルのハードウェアサーバーに接続した上で、
    現在JTAGチェーン上で検出されているターゲットデバイス(TAPやプロセッサコア)の一覧を
    取得して表示してください。

    おっ、ボードにアクセスしに来てる

    画像
    具体的なコマンドを既に知っているみたい

    おっ、できた。

    画像
    ちゃんと接続できてる

    ここまで出来たら、ループエンジニアリングもいけるなこれは!


    STEP3 : Vivadoデザインを生成させる

    どんなデザインを生成するのか興味深々なので、ざっくり仕様のまま指示してみる。

    ターゲットデバイスが ZyboZ7-20 (Zynq-7000: xc7z020clg400-1) であることを確認しました。
    以下の手順を自律的に実行してください。
    
    1.HDLコードの生成:
     AXI4-Liteスレーブインターフェース経由でプロセッサ(Cortex-A9)から
     制御可能な「SPIマスタIP」のVerilog HDLコードを生成してください。
     SPIはMode 0(CPOL=0, CPHA=0)に対応させ、 送信データレジスタ、受信データレジスタ、
     ステータスレジスタ(送信完了フラグ等)を実装してください。
    
    2.Vivadoプロジェクトの作成と統合:
    
     新規のVivadoプロジェクト zybo_spi_project を作成し、
     生成したVerilogファイルをプロジェクトに追加してください。
    
    3.ブロックデザインの構築:
    
     IP Integratorでブロックデザインを作成し、ZYNQ7 Processing System を配置して
     Zybo Z7用の基本的な「Preset(周辺ペリフェラルやDDR設定)」を適用してください。
     さらに、作成したSPIマスタIPをブロックデザインに追加し、
     ZynqのM_AXI_GP0ポートと自動接続(Connection Automation)を行ってください。
    
    4.外部ポートの引き出し:
    
     SPIの4線(MISO, MOSI, SCLK, SS)を外部ポート(Pmodポートなどへの接続用)として
     ピンアウトしてください。
    
    5.ラッパー生成と論理合成:
    
     ブロックデザインのHDLラッパーを生成し、論理合成(Synthesis)を実行して
     エラーが出ないか確認してください。

    ローカルにインストールしてあるZybo Z7のボード情報を、探しきれなかったのかもしれない。

    画像
    汎用的な設定のままで生成した模様

    補足と念のためにサンプルを伝えて再トライさせ

    Digilentボード定義は部分的にインストール済であり、"Zybo Z7-20"を選択することが可能です。
    "C:\temp\ross\test0_proj\project_1"の"Zybo Z7-20"を使ったサンプルデザインを参考にして
    改めて"zybo_spi_project2"を作成し、
    論理合成(Synthesis)を実行してエラーが出ないか確認してください。

    すこし時間がかかったが問題なく完了。

    画像
    プロンプトはきちんと書くことだな

    Vivadoデザインを覗いてみると

    画像
    自分のクセとの違いがよくわかる

    RTLコードは、ロジックは横に置いておいて、インデントや先頭文字の位置の揃え方等見た目が綺麗。

    `timescale 1ns / 1ps
    // SPI Master with AXI4-Lite slave interface, Mode 0 (CPOL=0, CPHA=0)
    // Registers (32-bit, byte address):
    //  0x00 TX_DATA : [7:0] transmit byte (RW). Write starts? No, start via CTRL.
    //  0x04 RX_DATA : [7:0] received byte (RO)
    //  0x08 STATUS  : bit0 busy, bit1 done (tx complete, sticky until next start or clear), bit2 rx_valid
    //  0x0C CTRL    : bit0 start (write 1 to start transfer when not busy), bit1 done_clear (write 1 to clear done/rx_valid)
    // SCLK idle 0. MOSI changes on falling edge, MISO sampled on rising edge. MSB first.
    // SS_N active low during transfer, high when idle.
    
    module spi_master_axilite #(
        parameter integer C_S_AXI_DATA_WIDTH = 32,
        parameter integer C_S_AXI_ADDR_WIDTH = 4,
        parameter integer CLK_DIV = 49  // SCLK ~= ACLK / (2*(CLK_DIV+1)). 100MHz -> ~1MHz
    )(
        // AXI4-Lite slave
        (* X_INTERFACE_INFO = "xilinx.com:signal:clock:1.0 S_AXI_ACLK CLK" *)
        (* X_INTERFACE_PARAMETER = "XIL_INTERFACENAME S_AXI_ACLK, ASSOCIATED_BUSIF S_AXI, FREQ_HZ 100000000, PHASE 0.0, CLK_DOMAIN design_1_processing_system7_0_0_FCLK_CLK0" *)
        input  wire                          s_axi_aclk,
        (* X_INTERFACE_INFO = "xilinx.com:signal:reset:1.0 S_AXI_ARESETN RST" *)
    
    ~割愛~
    
    endmodule

    見た目が綺麗ということは、不具合も少ないということ。(自論)


    STEP4 : べメタルアプリまで生成させる

    良いところまで来ているので、ベアメタルアプリまで作らせる。

    論理合成の正常完了を確認しました。引き続き、以下の手順を自律的に実行してください。
    
    1. ビットストリームの生成
    
     現在のプロジェクトの配置配線(Implementation)を実行し、FPGAに書き込むための最終的な
     ビットストリームファイル(.bit)を生成してください。完了したら、ハードウェア情報を含む
     design_1_wrapper.xsa ファイルをエクスポートしてください。
    
    2. Vitisベアメタルプロジェクトの作成
    
     エクスポートした .xsa ファイルをベースに、Vitisのスタンドアロン(ベアメタル)環境用の
     プラットフォームプロジェクトおよびアプリケーションプロジェクトを自動作成してください。
     ターゲットコアは ps7_cortexa9_0 とします。
    
    3. C言語制御ドライバー・メインソフトの生成
    
     Rossが独自実装した spi_master_axilite IPのベースアドレス(xparameters.h に定義される
     アドレス)を自動検出してください。
     そのアドレスの制御レジスタ(送信レジスタ、ステータスレジスタ等)を直接制御して、
     ダミーデータ(例: 0x5A, 0xA5)をSPI送信し、
     受信データを読み出すベアメタルC言語ソースコード(main.c)を作成してください。
    
    4. アプリケーションのビルド
    
     作成したソースコードを含めてVitis上でコンパイルを実行し、
     実機ロード用のバイナリ(.elf)を生成してください。

    さくっと、コード生成とビルドまで完了。

    画像
    ソフトウェアの生成は速い

    STEP5 : 実機 Zybo Z7-20 で実行させてみる

    最後に、実機での動作確認をやらせてみる。

    ビットファイルおよびベアメタルアプリケーション(ELFファイル)のビルド完了を確認しました。
    現在、Zybo Z7ボードがJTAGで接続され、
    hw_server がローカル(localhost:3121)で稼働しています。
    以下の実機検証手順を xsdb を介して自律的に実行してください。
    
    1. ターゲットの確保とリセット
    
     xsdb でターゲットデバイスに接続し、
     ARM Cortex-A9 MPCore #0 (ターゲットID 2)を選択してプロセッサをリセット
     (rst -processor または rst -cores)してください。
    
    2. Zynqの初期化 (ps7_init)
    
     Vitisプロジェクト内にある ps7_init.tcl をソースし、
     ps7_init および ps7_post_config コマンドを実行して、
     Zybo Z7のDDRメモリやクロック設定等の初期化を行ってください。
    
    3. FPGA(PL部)のプログラム
    
     生成されたビットストリームファイル(.bit)を
     FPGA(xc7z020)にダウンロード(fpga コマンド)してください。
    
    4. ソフトウェアのダウンロードと実行
    
     Cortex-A9 #0 にビルド済みのベアメタルELFファイルをダウンロード
     (dow コマンド)してください。
     まずはプログラムの先頭(main)にブレークポイントを設定し、
     そこまで実行を進めて停止させてください。
    
    5. レジスタ確認と実行
    
     main で停止した状態で、
     SPIのベースアドレス(0x40000000 付近)のステータスレジスタ(SPI_BASE + 0x08)の値を
     mrd コマンドで読み出して表示し、初期状態が正常(BUSYでないこと)か確認してください。
     確認後、プログラムを再開(con)させ、最後まで実行してください。
    
     ボードのシリアル出力(UART)に期待通りのログが出力されたかどうかも教えてください。

    Zybo Z7のLEDが点灯し、実機での動作が始まったことがわかる。

    画像
    実機での動作確認もできることがわかった

    Agentが、シリアル出力も観測できるのか念のため

    シリアル出力も、期待どおりですか?
    画像
    シリアル出力も観測できている

    STEP6 : ILA波形を採らせてみる

    序に、ILA(内蔵ロジアナ)波形を採らせてみる。

    実機でベアメタルアプリケーションが完走したことを確認しました。
    次のステップとして、SPI通信の内部信号を物理的に観測するため、
    ハードウェア設計にILAを追加し、実機波形キャプチャを行ってください。
    以下の手順を自律的に実行してください。
    
    1. ブロックデザインへのILA IPの自動挿入:
    
     既存のVivadoプロジェクト zybo_spi_project を開き、
     ブロックデザインにILA IPを1基追加してください。
    
    2. 観測信号(プローブ)の接続:
    
     追加したILAのプローブポート(probe)に、
     独自作成したSPIマスタIP(spi_master_axilite)から外部へ引き出している
     SPIの4線(MISO, MOSI, SCLK, SS)および、
     内部のステータス信号(STS_BUSY, STS_DONE など)を接続してください。
     サンプリングクロックには、
     SPIマスタIPが動作しているAXIのクロック(FCLK_CLK0 など)を接続してください。
    
    3. ビットストリームの再生成:
    
     ブロックデザインの更新を保存し、HDLラッパーを更新した上で、
     論理合成(Synthesis)および配置配線(Implementation)を再度実行して、
     ILAデバッグデータが埋め込まれた新しいビットストリーム(.bit)と
     デバッグ定義ファイル(.ltx)を生成してください。
     完了したらハードウェア情報(.xsa)を再エクスポートしてください。
    
    4. xsdbを介した波形キャプチャの実行:
    
     hw_server が動作している実機に対して、新しいビットファイルをダウンロードしてください
     (この際、自動的に .ltx ファイルが読み込まれます)。
     ベアメタルのELFファイル(main.elf)をロードし、
     spi_xfer 関数が呼ばれる手前でブレークポイントをかけて停止させてください。
    
    5. トリガー設定と波形データの解析:
    
     xsdb のデバッグツール(または内部の hw_ili コマンド群)を使用して、
     「SPIマスタの転送が開始された瞬間(STS_BUSY または CTL_START が立ち上がった瞬間)」を
     トリガー条件として設定し、トリガー待機状態にしてください。
     プロセッサの実行を再開(con)させ、
     トリガーがヒットした後のキャプチャデータをRossで取得してください。
     取得した波形のクロックやデータラインの立ち上がりタイミングが、
     SPI Mode 0の仕様通りに動いているか検証し、結果を報告してください。

    RTLモジュールに対して、トリガー用のデバッグピンを追加しだした。
    これは事前に言っていなかったので仕方がない。

    画像
    デバッグ用ロジックはできるだけ少ない方が良い

    これもサクッと完了したけども

    画像
    なにやら注意点が

    指摘された注意事項の改善を依頼する。

    先ほどのILA波形キャプチャの解析および「MOSIの遷移タイミングが立ち上がりエッジ直後に集中
    しているため、厳密なMode 0にするためのRTL修正を推奨する」という設計レビューを確認しました。
    この指摘に基づき、以下の手順を自律的に実行して設計をブラッシュアップしてください。
    
    1. Verilog HDLコード(RTL)の修正:
    
     spi_master_axilite のソースコードを修正してください。
     MOSIのデータ遷移(ビットの切り替え)が、SCLKの立ち上がりエッジ直後ではなく、
     「SCLKの立ち下がりエッジ(Falling Edge)」に完全に同期して変化するように
     状態遷移や出力レジスタの更新タイミングを修正してください。
     これにより、立ち上がりエッジの時点でMOSIのデータが完全に安定している状態
     (厳密なSPI Mode 0)を作ってください。
    
    2. 論理合成・配置配線の再実行:
    
     修正したVerilogファイルをプロジェクトに適用し、Vivado上で再度、論理合成(Synthesis)
     および配置配線(Implementation)を実行して、
     新しいビットストリーム(.bit)とデバッグ定義ファイル(.ltx)を生成してください。
    
    3. 実機へのロードと再実行:
    
     hw_server を介して、修正版のビットファイルをFPGAにロードしてください。
     また、Vitisのベアメタルアプリケーション(main.elf)を再度ロードし、
     main で一時停止させてください。
    
    4. ILA波形による再検証:
    
     前回と同様に busy==1(または転送開始)をトリガー条件として設定し、
     プログラムを実行(con)させてSPI転送の波形を再キャプチャしてください。
     キャプチャしたデータ(ila_capture_v2.csv)を解析し、
     MOSIの遷移タイミングが意図通りSCLKの立ち下がりエッジに同期するように改善されたか、
     および 0x5A のデータが正しく送信されているかを検証して結果を報告してください。

    すこし時間がかかったけども解決。

    画像
    ブラッシュアップ完了

    というか、このサイクルを自分で回してくれれば、ループエンジニアリング成功なのです!

    画像
    ILAを追加したBlock Design
    画像
    ILA波形

    STEP7 : この先は

    ループエンジニアリングができそうなので、過去の、IMUセンサーを使ったデザインをベースにして、トライしてみる。

    あと、手を付けていない amd-doc-serach MCP Server や skills も、やっとかんといかんだろうなぁ。

    画像
    Vivado AI Extension ではなく Vivado MCP Server を選んだので個別にインストール

    skillsは、いままで避けて通っていたAgent Skillsのことかな💦

    docの方は、MCP Serverの定義を追加するだけで良さそう。

    画像
    AI Client毎に設定例があってわかりやすい

    メーカーが公開している膨大なドキュメント(データーシート、ユーザーガイド、サンプルデザイン、回答集、フォーラム記事等)から、必要な情報を見付け出すのがコレまた大変で、コツを掴むまでに経験が必要。その手助けになるのか試してみたいところ。

    まぁ何とかなるでしょ(楽観)!

     
     
    半導体・組込み開発業界の技術畑に身をおいて40年が経ち、ふと我に返って、今の自分に何ができるのか見つめ直しながら、手当たり次第に思いついたことに手をつける、やりたくなったことはやってみる、思い立ったが吉日のほぼ自己満の日記です。なんの脈絡もなくスキしますが、気にしないでください。

    あなたへのおすすめ