無償ツールで実践する「ハード・ソフト協調検証」(7) ―― DMAの割り込み機能を確かめられるようにする
●テスト用のDMAを追加する
次に,割り込みのテストを行うためにDMAを追加します.「Memories and Memory Control」の下の「DMA」の下にある「DMA Controller」を選択し,[Add]ボタンをクリックします(図32).
すると,図33のようなウィンドウが表示されるので,[Finish]ボタンをクリックします.
図34のように,右側にdmaが追加されます.
ここで,dma_0のread_masterとwrite_masterをmemoryのs1に,dma_0のcontrol_port_slaveをcpuのavalon_masterに接続します(図35).
最後にdma_0のcontrol_port_slaveのBaseアドレスを「0x00000000」から「0x10000000」に変更し(図36),[Generate]ボタンをクリックし,HDLファイルを生成します.
●シミュレーションの準備を行う
テストベンチをCPUモデルに変更したので,setup_dpi_sim.doファイルの
vlog -sv prog/tb_prog.sv ;
の部分を
vlog -sv +define+DPI_C+DEBUG+ ../avalon_cpu.sv ;
に変更します.
●テスト・プログラムを用意する
DMA Controllerのテスト・プログラムをリスト14に示します.
int test_dma( void ) addr = 0x00000000; addr = DMA_WRITE_REG; addr = DMA_LENGTH_REG; wait_for_interrupt( &irq ); test_dma(); |
ソース・アドレスのメモリを初期化したあと,DMA ControllerのReadレジスタ(DMA_READ_REG),Writeレジスタ(DMA_WRITE_REG),Lengthレジスタ(DMA_LENGTH_REG),Controlレジスタ(DMA_CONTROL_REG)の順に設定し,DMAを起動します.
wait_for_interrupt関数で割り込み待ちを行い,そのあとでStatusレジスタ(DMA_STATUS_REG)をチェックし,ディスティネーション・アドレスのメモリの内容をチョックしています.
ポイントはwait_for_interrupt関数の部分です.ここで割り込みを待ちます.
HDLファイルのコンパイル,C言語のテスト・プログラムのコンパイル,およびシミュレーションは割り込み機能がないCPUの場合と同じです.シミュレーション結果は図37のようになります.
# bfm_write32 : addr = 0x00000000, data = 0x12345678 # bfm_write32 : addr = 0x00000004, data = 0x12345678 # bfm_write32 : addr = 0x00000008, data = 0x12345678 # bfm_write32 : addr = 0x0000000c, data = 0x12345678 # bfm_write32 : addr = 0x00000010, data = 0x12345678 # bfm_write32 : addr = 0x00000014, data = 0x12345678 # bfm_write32 : addr = 0x00000018, data = 0x12345678 # bfm_write32 : addr = 0x0000001c, data = 0x12345678 # bfm_write32 : addr = 0x00000020, data = 0x12345678 # bfm_write32 : addr = 0x00000024, data = 0x12345678 # bfm_write32 : addr = 0x00000028, data = 0x12345678 # bfm_write32 : addr = 0x0000002c, data = 0x12345678 # bfm_write32 : addr = 0x00000030, data = 0x12345678 # bfm_write32 : addr = 0x00000034, data = 0x12345678 # bfm_write32 : addr = 0x00000038, data = 0x12345678 # bfm_write32 : addr = 0x0000003c, data = 0x12345678 # bfm_write32 : addr = 0x10000004, data = 0x00000000 # bfm_write32 : addr = 0x10000008, data = 0x00000800 # bfm_write32 : addr = 0x1000000c, data = 0x00000040 # bfm_write32 : addr = 0x10000018, data = 0x0000009c # Interrput = 0x1 # bfm_read32 : addr = 0x10000000, data = 0x00000011 # bfm_write32 : addr = 0x10000000, data = 0x00000011 # bfm_read32 : addr = 0x00001000, data = 0x12345678 # bfm_read32 : addr = 0x00001004, data = 0x12345678 # bfm_read32 : addr = 0x00001008, data = 0x12345678 # bfm_read32 : addr = 0x0000100c, data = 0x12345678 # bfm_read32 : addr = 0x00001010, data = 0x12345678 # bfm_read32 : addr = 0x00001014, data = 0x12345678 # bfm_read32 : addr = 0x00001018, data = 0x12345678 # bfm_read32 : addr = 0x0000101c, data = 0x12345678 # bfm_read32 : addr = 0x00001020, data = 0x12345678 # bfm_read32 : addr = 0x00001024, data = 0x12345678 # bfm_read32 : addr = 0x00001028, data = 0x12345678 # bfm_read32 : addr = 0x0000102c, data = 0x12345678 # bfm_read32 : addr = 0x00001030, data = 0x12345678 # bfm_read32 : addr = 0x00001034, data = 0x12345678 # bfm_read32 : addr = 0x00001038, data = 0x12345678 # bfm_read32 : addr = 0x0000103c, data = 0x12345678 # ** Note: Data structure takes 6553768 bytes of memory # Process time 1.22 seconds # $finish : ../avalon_cpu.sv(101) # Time: 3590 ns Iteration: 0 Instance: /test_bench/DUT/the_cpu/cpu |
「Interrupt = 0x1」の部分が,wait_for_interrupt関数で割り込みが発生したことを示しています.波形の画面を使って,CPUモデルのポートをモニタすることでDMAからの割り込みを確認することもできます.
CPUモデルを割り込みに対応させたことにより,DMAのステータス・レジスタにおいて,ポーリングではなく割り込みによって転送の終了を確認できるようになりました.
====
19.他のBFMに適用する(PCI,PCI Express,AMBAなど)
SOPC Builderは,Avalon 関連だけでなく,PCIやPCI Express(PCIe)などのIPコアもサポートしています.SOPC BuilderでこれらのIPコアを使った場合,SOPC Builderが生成するVerilog HDLコードに,関連するインターフェースのBFMを使ったテストベンチが含まれています.Avalon BFMのDPI-C対応と同じ作業をこれらのBFMに施せば,C言語によるテスト・プログラムを書けます.
また,SOPC BuilderのIPコアでなくても,BFMを提供しているものならば同じような方法でDPI-C対応を行い,C言語によるテスト・プログラムを書けます.システムLSIのオンチップ・バスとして一般的なAMBA(AXI,AHB,APB)やOCP(Open Core Protocol)などについても,BFMさえあれば同じことが行えます.ぜひトライしてみてください.
(第8回,最終回へ続く)
Verification Enginnerの戯言
http://blogs.yahoo.co.jp/verification_engineer