無償ツールで実践する「ハード・ソフト協調検証」(2) ―― テスト・プログラムはC言語で書く
4.C言語でテスト・プログラムを書いてみる
C言語によるテスト・プログラムの例を実際のコードを示しながら説明していきます.この例では,SystemVerilogコード内のメモリにC言語コードからアクセスするという非常に簡単なものです.
リスト1(a)にSystemVerilogコードを,リスト1(b)にC言語コードを示します.リスト1(a)のSystemVerilogコードでは,一つの連想メモリを定義しています.このメモリは符号なしのbyte型を持ち,サイズはint型です.この連想メモリへのアクセスは,SystemVerilogコード内の二つのタスク(read_mem_bus,write_mem_bus)によって行います.
リスト1 SystemVerilogコード内のメモリにC言語コードからアクセスする
(a) SystemVerilogコード
module test; import "DPI-C" task c_main(); initial begin $finish(2); //------------------------------------------------ //------------------------------------------------ byte unsigned memory[int]; //------------------------------------------------ task read_byte( input int unsigned addr, inout byte unsigned data ); $display("read_byte : addr = 0x%08h, data = 0x%02h", addr, data ); task write_byte( input int unsigned addr, input byte unsigned data ); endtask : write_byte endmodule : test |
(b) C言語コード
#include <stdio.h> void write_byte_bus( unsigned int addr, unsigned char data ); void read_byte_bus( unsigned int addr, unsigned char *data ); int c_main( void ) addr = 0x2000; write_byte_bus( addr, b_data ); |
図3にSystemVerilogコードとC言語コードの関係を示します.図3の左側がSystemVerilogコードで,右側がC言語コードになります.シミュレーションを開始すると,SystemVerilogコードのtestモジュール内のinitial文でC言語コードのc_main関数を呼び出します.そして,呼び出されたC言語コードのc_main関数の中でwrite_byte_bus関数およびread_byte_bus関数を呼び出すことで,SystemVerilogコードのwrire_byte_busタスクとread_byte_busタスクを呼び出します.c_main関数が終了すると,SystemVerilogコードに移行し,$finish(2)を実行してシミュレーションが終了します.
図3 SystemVerilogコードとC言語コードの関係