無償ツールで実践する「ハード・ソフト協調検証」(3) ―― Avalonインターフェースと検証用モデル
無償のSystemVerilog対応シミュレータと無償のFPGA用オンチップ・バス・モデルを用いて,ハードウェア・ソフトウェア協調検証の一手法について解説する連載の第3回である.今回はC言語によるテスト・プログラムの例(PCIバス)と,本連載の中で使用するAltera社の開発ツール,およびAvalonインターフェースの概要を説明する.本連載では,Avalonインターフェースの検証用バス・ファンクショナル・モデル(Avalon BFM)を利用して,Avalonインターフェース対応のIPコアを検証できる環境を構築する.(編集部)
技術解説シリーズ「無償ツールで実践する『ハード・ソフト協調検証』」 第1回 SystemVerilogのDPI-C機能 第2回 テスト・プログラムはC言語で書く |
5.バス・レベル検証における活用事例
ここまでで,DPI-Cを利用したC言語によるテスト・プログラムの作成の基本について説明しました.ここからは,バス・レベルの検証環境におけるC言語によるテスト・プログラムを,図4のようなPCI バス・レベルの検証環境を例に説明します.
リスト3にPCIバス・レベルのテスト・プログラムの例を示します.テスト・プログラムは,moduleではなくprogramを使って記述しています.programを使うことにより,DUT(実装コード)とのレース状態を回避することができます(なお,本連載で使用するModelSim Altera Edition Starterはprogram記述をサポートしていない).
program pci_cpu( pci_interface bus, input logic CLK, input logic RST ); bit [31:0] addr, data, exp; initial begin addr = 32'h0000_1000; bus.write_mem( addr, size, exp ); if( data != exp ) endprogram : pci_cpu |
programでは,moduleとは違ってalways文を使用することはできないので,initial文内にテスト・プログラムを記述します.program内では複数個のinitial文を記述できますが,動作を理解しやすくするために一つのinitial文のみを使用することをお勧めします.
リスト3では,アドレス(32'h0000_1000)に4バイトでデータ(32'h0011_2233)をライトし,同じアドレスから4バイトのデータをリードし,比較しています.この例をDPI-Cを使って書き直すと,リスト4(a)のようになります.連載第2回のリスト1(a)で示したように,import宣言でC言語コードの関数の宣言を行っています.C言語コード内でSystemVerilogコードのtaskを呼ぶので,import宣言はtaskになります.export宣言ではC言語コード内で使用するtask(write_mem_bus,read_mem_bus)を宣言しています.
initial文では,C言語コードの関数(c_main)を呼び出すだけです.export宣言したwrite_mem_bus,およびread_mem_busはリスト4(a)と同じように,バス・インターフェース(bus)へのアクセス関数を呼び出すだけです.ただし,引き数のaddrとdataは32 ビットのbit 型からint 型に変更しました.リスト4(b)にC 言語コードを示します.
program pci_cpu( pci_interface bus, input logic CLK, input logic RST ); import "DPI-C" task c_main(); export "DPI-C" task write_mem_bus; initial begin c_main; end task write_mem_bus( input int addr, input int size, input int data ); task read_mem_bus( input int addr, input int size, output int data ); endprogram : pci_cpu |
#include <stdio.h> int c_main() addr = 0x00001000; write_mem_bus( addr, size, exp ); if( data != exp ) return 0; |
c_main関数内では,リスト4(a)のSystemVerilogコードと同じようにアドレス(0x00001000)に4バイトでデータ(0x00112233)をライトし,同じアドレスから4バイトのデータをリードし,比較しています.DPI-Cを使うと,このようにSystemVerilogコードとC言語コード,すなわち2種類のコードが必要になります.
しかし,テスト・プログラムの内容を変更しても,SystemVerilogコードを変更する必要はありません.変更するのはC言語コードのみです.C言語コードはシミュレーション実行時にロードするので,シミュレーションごとにSystemVerilogコードのコンパイル,およびエラボレーションを実行する必要はありません.C言語コードにラッパ関数を使った場合のコードをリスト5(a)~リスト5(c)に示します.
#include "sv_export.h" read_mem_bus( addr, size, &data ); |
void write_mem( int addr, int size, int data ); int read_mem( int addr, int size, int &data ); |
#include <stdio.h> int c_main() addr = 0x00001000; write_mem( addr, size, exp ); if( data != exp ) |
次節以降では,Altera社が提供している開発ツール「SOPC Builder」の中で利用できるAvalonインターフェースのBFM(検証用のバス・ファンクショナル・モデル)について,DPI-Cを使ってC言語からテスト・プログラムを利用する方法を紹介します.まずは,SOPC Builder,Avalonインターフェース,Avalon BFMについて説明します.