スケーラブルなクラウドベースのCI/CD HDL検証環境

Azure、VUnit、Riviera-PROによる検証ワークフローの強化

Michał Barczak, Application Engineer at Aldec
Like(0)  Comments  (0)

検証はデジタル設計の基盤であり、FPGAおよびSoC設計の高い信頼性と機能的正確性を確保します。Azureのスケーラブルなクラウドコンピューティング、オープンソースのユニットテスト機能であるVUnit、そして高性能シミュレーションエンジンであるRiviera-PROを統合することで、開発者はシミュレーションのワークフローと環境に革命を起こすことができます。この強力な3つを組み合わせることで、昨今の複雑なプロジェクト要求に合わせてカスタマイズされた、最新かつ効率的で協調的なユニットテストアプローチが実現します。この強力な3つのツールは、現代の複雑なプロジェクト要求に応えるために設計された、モダンで効率的かつ協業的なユニットテストのアプローチを提供します。

このブログでは、これらのツールを連携させることで得られる主なメリットについて説明します。このテーマをより深く理解するために、デモンストレーションの詳細を解説していきます。まず、私たちが扱っている内容を確認しましょう。

 

ツールを理解しよう

Azure: スケーラブルなクラウドコンピューティング

Azureクラウドプラットフォームは業界をリードするデータ機能を備え、開発者がクラウド、ハイブリッド、エッジ環境を強化し、新しいソリューションを実現できるよう設計されています。お好みのツールとフレームワークを使用して、アプリケーションの構築、実行、テスト、管理を行うことができます。

Azureの主要なメリット

  • グローバルなスケーラビリティ: Azureの広範なデータセンターネットワークは、あらゆる規模のワークロードをサポートします。
  • 強化されたセキュリティ: 多層的な保護により、コンプライアンスとデータ整合性を確保します。
  • コスト効率: 従量課金制と自動スケーリングにより、運用コストを削減します。
  • ハイブリッド環境のシームレスな運用: ハイブリッドクラウド向けに設計されたサービスによる統合と管理環境を提供します。
  • フレキシビリティ: Azureは多様な言語、ツール、フレームワークをサポートします。
  • リビジョン管理: Azureはソースコードのリビジョン管理を提供します。

 

VUnit: オープンソース検証フレームワーク

VUnitは、VHDLおよびSystemVerilog向けのオープンソースのユニットテストフレームワークです。自動化と継続的インテグレーション(CI)機能により
HDL検証を簡素化し、「早期かつ頻繁なテスト」アプローチを実現します。

 

VUnitの主要なメリット

  • 費用対効果: 無料で利用できるため、あらゆる規模のチームやプロジェクトで利用可能です。
  • コミュニティ主導: 世界中のコントリビューターが定期的なアップデートを通じて機能強化に貢献しています。
  • シームレスな統合: CI/CDパイプラインやRiviera-PROなどのシミュレーションツールとスムーズに連携します。
  • 豊富な機能: 並列テスト実行、アサーションライブラリ、ロギングフレームワーク、カスタマイズ可能なワークフローなどが含まれています。

詳細については、アルデックのウェブサイトにあるVUnitに関するブログをご参照ください。

 

Riviera-PRO: 高度なシミュレーションとデバッグ

アルデックのRiviera-PROは、以下によりVUnitの機能を強化します:

  • 高性能シミュレーション: VHDL/SystemVerilog/SystemCの混合言語対応
  • 高度なデバッグ: 直感的なGUI、波形ビューア/解析、マクロスクリプト機能
  • インクリメントコンパイル: 更新されたファイルのみを再コンパイルすることで時間を節約します。
  • スケーラブルな実行: 複数のインスタンスで並列にVUnitテストケースを実行します。
  • カバレッジ: 直感的なカバレッジ結果ビューアでHDL構造およびファンクショナルカバレッジを実現します。

Riviera-PROの詳細については、ウェブサイトをご覧ください。

 

点と点をつなぐ:Azure、VUnitおよびRiviera-PRO

なぜこれらのツールを組み合わせるのか?

Azureのクラウドコンピューティングリソース、VUnitのテスト機能およびRiviera-PROの高度なシミュレーション機能を組み合わせることで、以下のことが可能になります:

  • スケーラビリティ: Azureを活用して複数のコンピューティングインスタンスでVUnitのテストベンチを実行し、手動による介入なしでより迅速な結果を得ることができます。
  • 自動化: VUnitはテスト実行を自動化します。YAMLベースの構成でテストと成果物を管理できます。
  • 正確性: Riviera-PROは高度なデバッグとシミュレーション機能を提供します。
  • より速い結果: コストを増やすことなく、結果を得ることができます。20個のコンピューティングインスタンスを1日稼働させるコストは、1台のローカルマシンを20日間稼働させるコストと同じです。

 

サンプルプロジェクト:Azure、VUnitおよびRiviera-PROの実践デモ

この実践的なデモンストレーションでは、Azure、VUnitおよびRiviera-PROがテスト実行の効率化、カバレッジ解析の改善、スケーラブルなクラウドベースのワークフローの活用することで、検証ワークフローをどのように強化するかを示します。トピックスの理解を深めるため、プロジェクトフローを図1に示します。

 

図 1. プロジェクトフロー

 

このフローチャートは、Azure DevOps、VUnitおよびRiviera-PROの統合して、自動テストとカバレッジ解析を行うプロセスを要約したものです。

  1. Azure DevOpsリポジトリ: ソースファイル、テストベンチファイル、スクリプト(例:run.py)、構成を記述するYAMLファイルおよびパイプラインの記述が含まれています。
  2. パイプライン実行: YAML構成に基づいてワークフローを実行します。
  3. テストとカバレッジ解析: run.pyスクリプトがVUnitテストを実行し、acdb.doがacdbファイルをマージしてカバレッジレポートを生成します。
  4. コンバージョンプロセス: The coverage report is imported and converted to Cobertura format.
  5. 出力物: VUnitテストの結果とカバレッジレポートを生成します。

 

環境設定

このデモプロジェクトファイルは、アルデックのGitHubリポジトリにホストされています。これらのファイルはアルデックのVUnitブログシリーズを基に作成されており、追加機能を紹介するための機能強化が行われています。重要な更新点として、run.pyスクリプト内でCONTRIBUTION環境変数を宣言したことで、ユーザーはユーザー定義のグループにテスト作業を集中させることができます。

 

# Ask for contribution tests or all tests
CONTRIBUTION='0'
if "CONTRIBUTION" in os.environ:
CONTRIBUTION=os.environ["CONTRIBUTION"]
if CONTRIBUTION=='1':
print("Following contribution tests will be conducted:")

Azureでは、環境変数はYAMLファイル(後述)で設定できます。この例では、環境変数「CONTRIBUTION」により、開発者は特定のテストのみを実行できます。パイプライン実行時に各ジョブに対して異なる環境変数を設定する可能性があります。GUI経由でパイプラインを実行する際、パイプライン内のジョブごとに環境変数に任意の値を割り当てることができます。

 

図 2. パイプライン実行中に環境変数の値を選択する

 

Azure Pipelines Agentをインストールした仮想マシン (VM) の設定とDockerイメージのアップロード

デモを実行するには、Azure用にDockerイメージを設定する必要があります。このプロセスはRiviera-PROでDockerコンテナを準備する手順と類似していますが、Python、VUnit_HDLおよびCoberturaのアドオンのインストールことも含まれています。DockerイメージがビルドされたらAzure Container Registryにアップロードします。

 

その後、Azure Pipelines AgentをインストールしたVMを設定します。エージェントの設定は手動または自動のいずれかを選択できます。設定が完了すると、図3に示されたものと類似した構成になります。

 

図 3. エージェントをインストールしたVMの設定とDockerイメージのアップロード後の画面

 

Azure DevOpsへのファイルのアップロード

Azure DevOpsのリポジトリにファイルをアップロードするには、まずコンテナレジストリとエージェントをインストールしたVMが準備されていることを確認します。既存のGitHubリポジトリをインポートするか、Azure DevOpsで新しいリポジトリを作成することができます。ファイルがアップロードされると、プロジェクトは図4に示されているレイアウトのようになります。

 

図 4. Azure DevOpsリポジトリにアップロードされたファイル

 

YAMLを使用したAzure Pipelinesの構成

Azure Pipelinesは、継続的インテグレーション (CI) と継続的デリバリー (CD) を組み合わせ、コードをテスト、ビルド、および任意の宛先にデリバリーします。Azure DevOpsパイプラインは、コードコミット、プルリクエストまたはスケジュールされたトリガーなど、さまざまな種類のトリガーをサポートしています。

パイプラインを管理するには、構成用のYAMLファイルが必要です。サンプルプロジェクトのGitHubリポジトリにYAMLファイルサンプルが格納されており、以下のスニペットにはYAMLサンプルファイルが含まれています。

 

trigger:
- master

parameters:
- name: CONTRIBUTION
displayName: "Run only contribution tests"
type: string
default: 0
values:
- 0
- 1
- name: VUNIT_P
displayName: "VUNIT parallel jobs"
type: string
default: 1
- name: tests_jobs
type: object
default:
- job_name: 'run_tests_1'
tests: 'lib.tb_enc_generics.*'
- job_name: 'run_tests_2'
tests: 'lib.tb_enc_hardcoded.*'

jobs:
- ${{ each tests_job in parameters.tests_jobs }} :
- template: templates/run_tests_jobs.yml
parameters:
job_name: ${{ tests_job.job_name }}
tests: ${{ tests_job.tests }}
contribution: ${{ parameters.CONTRIBUTION }}
vunit_p: ${{ parameters.VUNIT_P }}

- job: publish_coverage
pool:
name: Default

container:
image: aldecdemo.azurecr.io/aldec/riviera-pro:vunit
endpoint: aldec-demo-acr-connection

dependsOn:
- ${{ each tests_job in parameters.tests_jobs }} :
- ${{ tests_job.job_name }}

steps:
- ${{ each tests_job in parameters.tests_jobs }} :
- task: DownloadPipelineArtifact@2
displayName: 'Download artifact ${{ tests_job.job_name }}_acdb'
inputs:
buildType: current
artifactName: ${{ tests_job.job_name }}_acdb
targetPath: '$(Build.SourcesDirectory)'

- script: vsim -c -do acdb.do
displayName: 'Merge acdb and generate coverage report'
workingDirectory: 'vunit/aes-encryption'

- script: |
acdb2xml -i acdb/results.acdb -o acdb/results.xml
python3 ucdb2cobertura.py --units -i acdb/results.xml -o acdb/cobertura.xml
displayName: 'Convert coverage to cobertura format'
workingDirectory: 'vunit/aes-encryption'

- task: PublishPipelineArtifact@1
inputs:
targetPath: 'vunit/aes-encryption/acdb'
artifactName: Coverage

- task: UseDotNet@2
displayName: 'Use .NET Core sdk 7.0.x'
inputs:
version: 7.0.x

- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: 'vunit/aes-encryption/acdb/cobertura.xml'
pathToSources: 'vunit/aes-encryption/vunit_out/test_output'

 

説明のため、ここでは主要な機能の一部のみを取り上げて紹介します。完全な仕様については、こちらを参照してください。このデモプロジェクトで使用されている定義済みのazure-pipelines.ymlは、以下のセクションで構成されています:

  • trigger - commit/push時にパイプラインを実行するトリガーとなるブランチを指定します。
  • parameters - このセクションでは、パイプラインの実行をパラメーター化するために使用できる変数のリストを作成できます。この例では、2つの値を持つ文字列型のパラメーターが1つだけあります。これは「Pipeline Run」ページでコンボボックスとしてレンダリングされ、選択された値は環境変数として保存されます。
  • jobsagentによって実行されるステップのコレクションです。この例では3つのジョブが作成されています。そのうち2つはrun_tests_jobs.ymlファイルで宣言されたテンプレートに基づいており、特定のVUnitテストケースを並列実行する役割を担います。3つ目のジョブ「publish_coverage」は、他の2つのジョブからアーティファクトをダウンロードし、ラインカバレッジを実施し、カバレッジ結果をCobertura形式で公開します。
  • poolキーワードは、パイプラインのジョブで使用するプールを指定します。プール仕様には、ジョブの実行戦略に関する情報も保持されています。
  • container - Dockerコンテナの設定(イメージ名やサービスエンドポイントなど)が含まれています。
  • dependsOn - 異なるステージやジョブ間の依存関係を指定します。
  • steps - OSシェルで順次実行される定義済みtaskscriptコマンドのリストです。

パイプラインの実行

パイプラインを作成した後、それを実行してデモを実行します。AzureとRiviera-PROの統合により、カバレッジメトリクスの生成とテストプランのランキングが可能になり、Riviera-PROのグラフィカルユーザーインターフェースまたはウェブブラウザで詳細な結果が表示されます。図5は、これらの結果の一例を示しています。特別なacdb.doマクロファイルを使用することで、ランダムなVUnitテスト名が定義済みの名前に変換され、ユーザーが実行したテストを正確に識別できるようにします。

 

図 5. VUnitテストからのテストプランランキングとカバレッジメトリクスの結果

 

ワークフローはクラウドのコンピューティングパワーを活用するために簡単にスケールアップ可能できます。Azureのインフラストラクチャは、2つのレベルでスケーラビリティを実現します。まず、ジョブレベルでのスケーラビリティが実現され、ジョブを並列実行することが可能になります。第二に単一の仮想マシン内で複数のスレッドでVUnitテストケースを同時に実行することでスケーラビリティが実現されます。このプロセスによりテスト時間とコストが削減されます。この機能を有効にするにはAzure DevOpsで並列テストを実行のため、複数のRiviera-PROライセンスシートとジョブを設定する必要があります。少なくとも1回実行されたパイプラインにアクセスすると、結果を表示する特定のタブが表示されます。「Test」タブには、VUnitテストの結果が表示されます。AzureとVUnitの統合によって達成され改善された結果を図6に示します。この特定のケースでは、すべてのテストに合格しました。各テストの名前をクリックすると詳細を確認できます。

 

図 6. VUnit テストの結果

 

「Code Coverage」タブでは、ユーザーは事前にCobertura形式でエクスポートされたカバレッジデータにアクセスできます。これにより、結果を標準化して視覚的に表示できるようになります。この機能はアルデックのRiviera-PROシミュレータのカバレッジ機能を利用して、それらをCobertura形式に変換することで実現されています。この機能は図7に示されています。ユーザーは、各ファイルのコードカバレッジ結果を詳細に確認することができます。この例では、詳細なラインカバレッジ結果を示しています。

 

図 7. カバレッジ結果をCobertura形式で表示

 

このサンプルデザインにおける成果

このサンプルでは、Azure、VUnitおよびRiviera-PROの統合により、検証ワークフローがどのように大幅な改善されるかを示しています。具体的には以下の点が挙げられます:

  • 統合されたカバレッジ: 堅牢な検証を保証する包括的なカバレッジメトリクスを、アルデックのCobertura形式で視覚化します。
  • テストプランとランキング: Riviera-PROにより、コード変更への影響に基づいてテストの優先順位付けとランキングが可能です。
  • VUnitによる迅速なフィードバック: VUnitの自動化機能を活用して、迅速な実行と結果の取得を実現します。
  • スケーラブルなクラウドワークフロー: Azureを活用した並列処理と費用対効果の高いリソース管理を実現します。

 

既知の制約

メリットは大きいですが、既存の制約事項を認識しておくことは重要です:

  • シミュレーターライセンス: Azureの各ジョブ毎にRiviera-PRO専用ライセンスが必要です。
  • ジョブ数の制限: Azureはアカウントあたり並列ジョブが20個までに制限されています。

結論

Azure、VUnitおよびRiviera-PROの統合は、クラウドコンピューティング、オープンソースのイノベーション、高度なシミュレーションの最高の組み合わせであり検証ワークフローの未来を象徴しています。この強力な3つの組み合わせは、最新かつ自動化されスケーラブルな検証プロセスを実現し、テスト時間を大幅に短縮し、リソース管理を最適化します。

 

この構成を採用することで、チームは検証ワークフローの品質を向上させながら、協調的ででグローバルにアクセス可能な環境をサポートできます。Azureは比類ないスケーラビリティを提供し、VUnitのオープンソースフレームワークはイノベーション、自動化、カスタマイズを促進します。Riviera-PROは、これらのツールを高度なシミュレーションとデバッグ機能で補完し、詳細で信頼性の高い検証プロセスを保証します。

 

この構成を採用することで、チームは検証ワークフローの品質を向上させながら、協調的ででグローバルにアクセス可能な環境をサポートできます。Azureは比類ないスケーラビリティを提供し、VUnitのオープンソースフレームワークはイノベーション、自動化、カスタマイズを促進します。Riviera-PROは、これらのツールを高度なシミュレーションとデバッグ機能で補完し、詳細で信頼性の高い検証プロセスを保証します。.

 

参考文献

Michał Barczak is an Application Engineer at Aldec, specializing in RTAX/RTSX adaptors. He joined the team in 2022 and possesses a strong background in verification methodologies such as UVM, OSVVM, and UVVM. With expertise in PCIe technology, BFM simulations, and automotive applications, Michał brings a wealth of experience to his role. He holds a Master of Science degree in Microelectronic Engineering from Gdańsk University of Technology in Poland. Outside of work, Michał harbors a dream of one day traveling to the moon, despite his fear of heights.

  • Products:
  • Active-HDL
  • FPGAデザイン・シミュレーション,
  • Riviera-PRO
  • アドバンスベリフィケーション

Comments

Ask Us a Question
x
Ask Us a Question
x
Captcha ImageReload Captcha
Incorrect data entered.
Thank you! Your question has been submitted. Please allow 1-3 business days for someone to respond to your question.
Internal error occurred. Your question was not submitted. Please contact us using Feedback form.
We use cookies to ensure we give you the best user experience and to provide you with content we believe will be of relevance to you. If you continue to use our site, you consent to our use of cookies. A detailed overview on the use of cookies and other website information is located in our Privacy Policy.