成果報告SystemVerilogによるテストベンチ実践会(2017夏)のSystemVerilog勉強会は有意義でした。VIPとDPI-Cを使用して、テスト用に作成したCソースコードをそのままコードは変更しないで実機テストでも使用できる確認を取りました。成果物を誰でも実行できるように環境と整えたので公開します。動作環境は次のようになります。2017.2ここで実験した環境はgithubからcloneして、実行することができます。VIPとDPI-Cの動作確認を行うことが目的なので簡易的なプロジェクトです。FPGAの基本はLチカでしょう。対象のプロジェクトは図のようになります。GPIOの構成で、GPIOの出力はLEDに接続しています。今回のプロジェクトはZYBOで確認できるように環境を整えています。Zynqプロジェクトは次のように実行することで生成することができます。make.tcl実行するとZynq7000というフォルダを作成し、その配下に今回対象としているプロジェクト作成します。Zynq7000/Zynq7000.xprをVivadで開くとプロジェクトを確認することができます。本プロジェクトのピン定義ファイルコマンドを実行すると、シミュレーションを行うためのエクスポートをしますがそれは後述します。シミュレーション内容シミュレーションの内容は「ZynqのプロジェクトでアプリケーションからLEDを点灯させる」ことです。シミュレーションの構成としては下図のようになります。VIPが無い場合はAXIバスを使用したシミュレーションが行いにくいという欠点がありました。HDLのテストベンチでAXIバスにデータを書き込むというシミュレーションを行っていました。私はとりわけ、後者側で自前でバスマスターモデルを用意してシミュレーションをしていました。シミュレーションを行うためにシミュレーション用のプロジェクトを用意していました。VIPを使用するとシミュレーション用にプロジェクトを作成しなくても、下図のように本使用するプロジェクトでシミュレーションを行えるようになります。VIPを使用する最大の利点になります。HDLやVHDLなど、ハードウェア記述言語でシミュレーションする側を記述してシミュレーションを行います。DPI-Cをしようするちと下図のようにCソースコードで記述したテストアプリをそのまま使用して、シミュレーションを行うことが可能になります。DPI-Cを利用する利点は次の点が挙げられるでしょう。テストベンチの作成が容易になるアプリのテストベンチを作成するためにステートマシンを駆使する必要がなくなる本番データ使用したテストベンチの作成を行いやすくなる実機で使用するCアプリをそのままテストベンチに使用できる本運用のアプリでなくても、アプリでシミュレーションができればアプリ屋が確認するときのサンプル・コードになるのでアプリ屋との意思疎通が図りやすくなるシミュレーション環境シミュレーションを行うために次のソースを用意しました。テストアプリ(Cソースコード)これらのファイルの構成は大雑把にですが下図のようになります。シミュレーションの実行Zynqプロジェクトを生成した時に、すでにシミュレーション環境が整っています。Zynqプロジェクトを作成した時にexportsimというフォルダが同時作成されています。次のようにフォルダを移動するとtb_Zynq7000.shというファイルがあります。この時点ではtb_Zynq7000.svを組み込んでシミュレーションのトップ階層の準備が整っているだけで、テストベンチなどは組み込まれていません。ここで次のように実行するとシミュレーションを行うことができます。./tb_Zynq7000.shこの時点ではテストベンチが存在しないので次のようにエラー出力されます。quitここでエラーが出ているのはDPI-Cのコードを埋め込んでいるためです。テストベンチの追加DPI-Cを実行できるように./tb_Zynq7000.shを次のように修正します。-g}tb_Zynq7000.shを修正後、次のように実行します。./tb_Zynq7000.shそうすると次のように結果が表示されます。typical.これでシミュレーションが完了しました。最後の行のエラー情報は波形情報が出力されないというエラーなのでシミュレーション自体はこれで完了になります。シミュレーションの流れシミュレーションは下図のように流れます。SystemVerilog側からcFuncStart()関数が呼び出されます(tb_Zynq7000.svのx行目)。cFunStart()関数内のsvPlWriteでtb_Zynq7000.svのsvPlWriteファンクション(tb_Zynq7000.svのx行目)を実行します。svPlWriteファンクションでEnableが1になり、x〜x行目のalwaysで実行しているx行目のウェイトが解除され、AXIバスアクセスが実行されます。AXIバス書込みでAXI-GPIOにデータが書き込まれ、LEDが点灯します。次は実機で動作確認をしてしょう。今回の目的はテストアプリをそのまま使用して実機でテストすることであり、function.cは変更しないでZYBO上で動作検証を行います。そこで、tb_Zynq7000.svで呼び出したsvPlWriteファンクションのラッパーファイルを作成して、下図のような構成にします。これを実現するラッパーソースコードが次のコードになります。0;}今回はシミュレーションと実機確認を同じテストアプリ(Cソースアプリ)を使用して確認することなのでラッパーソースコードは簡易になっています。これを次のようにコンパイルします。main.oもちろん、これらのコンパイルはクロスコンパイルでなければいけません。私の場合は、ZYBO上のLinuxにgccをインストールしているのでZYBO上でコンパイルしました。これでFuncTestができあがるので次のように実行してみましょう。./FuncTestもちろん、ZYBO上でですよ。これで図のようにfunction.cを変更せずにLEDが点灯することを確認できました。シミュレーションで行ったことと同様の結果が同じテストコードを使用して確認できました。まとめ今回はCソースコードで記述したテストアプリを改変すること無く、シミュレーションと実機の両方で実行することが目的であったため定番のLチカで動作確認を行いました。VIPとDPI-Cの環境が整う前は次のように環境を整備してシミュレーションを行っていました。BFMの準備(AXIバスモデルの作成)画像データをHexデータに変換(変換アプリも作成)HexデータをAXIバスに書き込むテストベンチの作成(ステートマシンの作成)出力結果を表示するベンチの作成(ファイル出力するベンチの作成)出力結果を可視化するアプリの作成(画像ファイルに戻すアプリの作成)シミュレーション後、実機確認ではまた別のテストを行います。HDL用のHexデータを用意してシミュレーションをするなどの工数が一気に減って、次のように検証工数が削減されます。テストアプリの作成そして、実機でもそのまま使用することが出来るのです。