zynq vipを利用したテストベンチ

47
Zynq VIPを利用した テストベンチ @Vengineer 2017/08/26 SystemVerilogによる テストベンチ実践会

Upload: mr-vengineer

Post on 23-Jan-2018

977 views

Category:

Devices & Hardware


3 download

TRANSCRIPT

Page 1: Zynq VIPを利用したテストベンチ

Zynq VIPを利用したテストベンチ

@Vengineer

2017/08/26

SystemVerilogによるテストベンチ実践会

Page 2: Zynq VIPを利用したテストベンチ

ブログ : Vengineerの戯言http://blogs.yahoo.co.jp/verification_engineer

Twitter : @Vengineer

FPGAマガジン (No.16/17/18) FPGAコミュニティのススメ、探索記http://fpga.cqpub.co.jp/

自己紹介

SlideShare https://www.slideshare.net/ssuser479fa3

Page 3: Zynq VIPを利用したテストベンチ

SystemVerilog

Page 4: Zynq VIPを利用したテストベンチ

IEEE 1800-2012

IEEE Standard for SystemVerilogUnified Hardware Design, Specification, and Verification Languagehttps://standards.ieee.org/findstds/standard/1800-2012.html

・無償でダウンロードできますよ

Page 5: Zynq VIPを利用したテストベンチ

書籍の表紙は、CQ出版社から引用しました。http://www.cqpub.co.jp/hanbai/books/36/36191l.jpg

SystemVerilog設計スタートアップ

第1部 イントロダクション 編第2部 構文 編第3部 アサーション 編第4部 シミュレーション演習 編第5部 モデリング 編第6部 VMM活用 編

定価3,672円(税込)2008年5月15日発行

http://www.cqpub.co.jp/hanbai/books/36/36191.htm

Page 6: Zynq VIPを利用したテストベンチ

書籍の表紙は、CQ出版社から引用しました。http://www.cqpub.co.jp/hanbai/books/36/36191l.jpg

SystemVerilog設計スタートアップ

Appendix SystemVerilogクロニクル

これは、是非、読んでもらいたい。

Verilog から SystemVerilogの歴史がわかります

(Verilog HDLではなく、Verilog)

http://www.cqpub.co.jp/hanbai/books/36/36191.htm

Page 7: Zynq VIPを利用したテストベンチ

Xilinx Vivado 2017.1&

Zynq VIP

Page 8: Zynq VIPを利用したテストベンチ

Vivado 2017.1の新機能

AR# 69031

Zynq-7000 All Programmable SoC VIP - リリース ノートおよび既知の問題

https://japan.xilinx.com/support/answers/69031.html

Zynq-7000 All Programmable SoC VIP は Processing System7 IP からのみアクセスできます。

Page 9: Zynq VIPを利用したテストベンチ

ドキュメント

Zynq-7000 All Programmable SoC Verification IP v1.0

https://www.xilinx.com/support/documentation/ip_documentation/processing_system7_vip/v1_0/ds940-zynq-vip.pdf

 Zynq VIPの主な機能

 ・AXIマスター (GP)  ・AXIスレーブ(HP) : OCM/DDR ・PLからの割り込み ・PSYCHIC内のレジスタアクセス

Page 10: Zynq VIPを利用したテストベンチ

引用:https://www.xilinx.com/support/documentation/ip_documentation/processing_system7_vip/v1_0/ds940-zynq-vip.pdf : 4頁

アーキテクチャ

Page 11: Zynq VIPを利用したテストベンチ

引用:https://www.xilinx.com/support/documentation/ip_documentation/processing_system7_vip/v1_0/ds940-zynq-vip.pdf : 4頁

テストベンチ

Test Program (API calls)

Page 12: Zynq VIPを利用したテストベンチ

Zynq VIP APIs

set_stop_on_error/set_debug_level_infofpga_soft_resetpre_load_mem_from_file/pre_load_memread_interrupt/wait_interruptwrite_from_file/read_to_filewrite_data/read_datawrite_burst/write_burst_concurrentread_burst/read_register/read_register_mapset_slave_profile/wait_reg_updatepeek_mem_to_file/read_mem/write_mem

Page 13: Zynq VIPを利用したテストベンチ

PL部のリセット

fpga_soft_reset( [31:0] reset_ctrl ) 引数(reset_ctl)の値は、 PSのFPGA_RST_CTRLレジスタへの値 Address : 0xF8000240

U-Boot から Zynq の PLクロックとリセット信号を制御するhttp://qiita.com/ikwzm/items/3253940484591da84777

Bit 3 : FPGA3_out_RST (FCLKRESETN3)Bit 2 : FPGA2_out_RST (FCLKRESETN2)Bit 1 : FPGA1_out_RST (FCLKRESETN1)Bit 0 : FPGA0_out_RST (FCLKRESETN0)

Page 14: Zynq VIPを利用したテストベンチ

スレーブ(GP)へアクセス

read_data( [31:0] addr, [7:0] size, [1023:0] data ) 128バイトまでのリード転送 バーストタイプは、INCR ブロッキングでデータ転送後戻る

write_data( [31:0] addr, [7:0] size, [1023:0] data ) 128バイトまでのライト転送 バーストタイプは、INCR ブロッキングでデータ転送後戻る

Page 15: Zynq VIPを利用したテストベンチ

スレーブ(GP)へアクセス

read_from_file( [1023:0] file_name, [31:0] addr, rd_size ) 指定したファイル内のデータをライト転送する バーストタイプは、INCR ブロッキングでデータ転送後戻る

write_to_file( [1023:0] file_name, [31:0] addr, wr_size ) リード転送したデータを 指定したファイルにストアする バーストタイプは、INCR ブロッキングでデータ転送後戻る

Page 16: Zynq VIPを利用したテストベンチ

レジスタへアクセス

read_register( [31:0] addr, DATA ) アドレス(addr)のレジスタの値をリードする

read_register_map( [31:0] addr, size, DATA ) アドレス(addr)のレジスタの値を 最大2個までリードする

Page 17: Zynq VIPを利用したテストベンチ

メモリ(DDR/OCM)へアクセス

read_mem( [1023:0] data, [31:0] addr, no_of_bytes ) 128バイトまでのバックドアのリード転送

write_mem( [1023:0] data, [31:0] addr, no_of_bytes ) 128バイトまでのバックドアのライト転送

Page 18: Zynq VIPを利用したテストベンチ

メモリ(DDR/OCM)へアクセス

pre_load_from_file( [1023:0] file_name, [31:0] addr, no_of_bytes ) 指定したファイル内のデータを バックドアのライト転送する

peek_mem_to_file( [1023:0] file_name, [31:0] addr, no_of_bytes ) バックドアのリード転送したデータを 指定したファイルにそストアする

Page 19: Zynq VIPを利用したテストベンチ

メモリ(DDR/OCM)へアクセス

pre_load_mem( [1:0] data_type, [31:0] addr, no_of_bytes ) 引数(data_type)で指定したデータを 指定したアドレスに書き込む

 data_type 00 : ランダム 01 : 0 10 : 1

Page 20: Zynq VIPを利用したテストベンチ

割り込み処理

wait_interrupt( [3:0] irq, [15:0] irq_status ) 引数(irq)で指定した割り込みをモニターし、 割り込みが発生したら ステータスをirq_statusに返す 割り込みが発生するまでブロックする

read_interrupt( [15:0] irq_status ) 割り込みステータスをポーリングし、 その結果をirq_statusに返す ブロックしない

Page 21: Zynq VIPを利用したテストベンチ

QOS制御

set_arqos( NAME, [31:0] val ) NAMEで指定したポートのリードQOSを設定 set_awqos( NAME, [31:0] val ) NAMEで指定したポートのライトQOSを設定

NAME S_ AXI_GP0, S_AXI_GP1,  S_AXI_HP0, S_AXI_HP1, S_AXI_HP2,  S_AXI_HP3, S_AXI_ACP

Page 22: Zynq VIPを利用したテストベンチ

スレーブ制御

set_slave_profile( NAME, [1:0] latency ) NAMEで指定したスレーブポートの レイテンシーを設定する NAME S_ AXI_GP0, S_AXI_GP1,  S_AXI_HP0, S_AXI_HP1, S_AXI_HP2,  S_AXI_HP3, S_AXI_ACPLatency 00: Best case, 01: Average case, 10: Worst case, 11: Random

Page 23: Zynq VIPを利用したテストベンチ

モデル制御

set_stop_on_error( LEVEL ) 引数に1を指定すると、エラーが発生したら、 シミュレーションを止める デフォルトは、1 が設定されている set_debug_level_inf( LEVEL ) 引数に1を指定すると、 VIPからのデバッグ情報が表示される デフォルトは、1 が設定されている

Page 24: Zynq VIPを利用したテストベンチ

サンプルコード

Vivado 2017.1 の新機能8(Zynq-7000 VIP) @marsee101 さんのブログhttp://marsee101.blog19.fc2.com/blog-entry-3790.html

File => Export => Export Simulation にて、ファイルを生成する

% bash ./tb.sh

にて、シミュレーションが実行できる

Page 25: Zynq VIPを利用したテストベンチ

tb.shでやっていること

tb.sh は、bashスクリプト tb.sh [-help] run

check_args 引数のチェック-lib_map_path / -reset_run / -noclean_files

setup-lib_map_path / -reset_run / -noclean_files

compileVerilog HDL (xvlog) / VHDL (xvhdl)コンパイル

elaboatexelab でエラボレート

simulatexsim でバッチモード・シミュレーション

( -tclbatch )

Page 26: Zynq VIPを利用したテストベンチ

サンプルコードのテストベンチ

Zynq VIP

DUT

GP HP/ACP IRQ

Test Program

Page 27: Zynq VIPを利用したテストベンチ

テストベンチとテストプログラム

initial begin$display( “running the tb”);tb_ARESET = 1’b0;repeat(2)@(posedge tb_ACLK);tb_ARESET = 1’b1;@(posedge tb_ACLK);

repeat(5)@(posedge tb_ACLK);tb.xxx.fpga_soft_reset(32’h1);tb.xxx.fpga_soft_reset(32’h0);// ここまでがリセット処理

// ここからテストプログラムを開始end

Page 28: Zynq VIPを利用したテストベンチ

テストプログラム

 Zynq VIPのAPIを利用して、 テストプログラムを書く

 // 0x4120_0000に4バイトで0xFFFF_FFFFをライトする tb.xxx.write_data(32’h41200000,4, 32’hFFFFFFFF, resp);

 // 0x4000_0000に4バイトで0xDEADBEEFをライトする tb.xxx.write_data(32’h40000000,4, 32’hDEADBEEF, resp);

 // 0x4000_0000から4バイトをread_dataにリードする tb.xxx.read_data(32’h40000000,4, read_data, resp);

 各コマンドの最後の引数( resp )は、 トランザクションのステータス

Page 29: Zynq VIPを利用したテストベンチ

SystemVerilogDPI-C

Page 30: Zynq VIPを利用したテストベンチ

無償ツールで実践する「ハード・ソフト協調検証」

CQ出版組み込みネット(2009年12月)

 (1) ― SystemVerilogのDPI-C機能

 (2) ― テスト・プログラムはC言語で書く

 (3) ― Avalonインターフェースと検証用モデル

 (4) ― SystemVerilog側のDPI-Cの記述を作成する

 (5) ― テスト・プログラムの作成とBFMのコードの生成

 (6) ― 協調シミュレーションを実行する

 (7) ― DMAの割り込み機能を確かめられるようにする

 (8,最終回) ― シミュレータやコンパイラの入手方法

https://blogs.yahoo.co.jp/verification_engineer/folder/362592.html

Page 31: Zynq VIPを利用したテストベンチ

Software Driven Verification

テストプログラムはC言語で! SystemVerilog DPI-Cを使えば、こんなに便利に!

Verify2011資料 (2011年9月30日)

http://www.eda-express.com/verify2011/seminar.html

資料URL:

http://www.eda-express.com/verify2011/pdf/Verify2011_01.pdf

Page 32: Zynq VIPを利用したテストベンチ

Vivado xsimでは、できません

理由:DPI-Cのtask exportを   サポートしていない

Page 33: Zynq VIPを利用したテストベンチ

Intel ModelSimでも

トライしましたが、

32ビットアプリのため、

メモリ不足でFatal Error

Page 34: Zynq VIPを利用したテストベンチ

Zynq VIPのモデルで使用しているメモリ容量を少なくすることで、動きました。

それ以外にも

いろいろやりましたが。。。

Page 35: Zynq VIPを利用したテストベンチ

お高い QuestaSimなら

さっくと動きます

Page 36: Zynq VIPを利用したテストベンチ

Test Program と APIの関係

Zynq VIP APIs

User Design

GP HP/ACP IRQ

Test ProgramTop Testbench

・Test Program

・ModelZynq VIP

・DUTUser Design

Page 37: Zynq VIPを利用したテストベンチ

テストプログラムは、DPI-C経由

import "DPI-C" context task dpi_main();

initial begin$display( “running the tb”);tb_ARESET = 1’b0;repeat(2) @(posedge tb_ACLK);tb_ARESET = 1’b1;@(posedge tb_ACLK);repeat(5) @(posedge tb_ACLK);tb.xxx.fpga_soft_reset(32’h1);tb.xxx.fpga_soft_reset(32’h0);

dpi_main();end

Page 38: Zynq VIPを利用したテストベンチ

C言語でのテストプログラム

#include “vip_func.h”

int dpi_main( void ){ unsigned int addr = 0x00000054; unsigned int data = 0x0000005a, exp; vip_write32( addr, data ); vip_nop(10); vip_rea32 ( addr, &exp ); if( data != exp ){ printf("compare error : 0x%x != 0x%x\n", data, exp ); return 1; } return 0;}

Page 39: Zynq VIPを利用したテストベンチ

アクセス関数

vip_func.h (C言語用ヘッダーファイル)

void vip_read32 ( unsigned int addr, unsigned int *data );

void vip_write32( unsigned int addr, unsigned int data );

void vip_nop( int no );

Page 40: Zynq VIPを利用したテストベンチ

アクセス関数

SystemVerilogのテストベンチ側

 export "DPI-C" task vip_read32;

 export "DPI-C" task vip_write32;

 export "DPI-C" task vip_nop;

Page 41: Zynq VIPを利用したテストベンチ

アクセス関数 : vip_read32SystemVerilogのテストベンチ側

`define ZYNQ_VIP tb.xxx

 task vip_read32( input int unsigned addr, output int unsigned data );

  automatic reg [31:0] addr_b = addr;  automatic reg [31:0] data_b;

automatic reg resp;

  `ZYNQ_VIP.read_data( addr_b, 4, data_b, resp );data = data_b;

 endtask

Page 42: Zynq VIPを利用したテストベンチ

アクセス関数 : vip_write32SystemVerilogのテストベンチ側

`define ZYNQ_VIP tb.xxx

 task vip_write32( input int unsigned addr, input int unsigned data );

  automatic reg [31:0] addr_b = addr;  automatic reg [31:0] data_b = data;

automatic reg resp;

  `ZYNQ_VIP.write_data( addr_b, 4, data_b, resp ); endtask

Page 43: Zynq VIPを利用したテストベンチ

アクセス関数 : vip_nop

SystemVerilogのテストベンチ側

 task vip_nop( input int unsigned count );

  repeat(count) @( posedge tb_ACLK );

 endtask

Page 44: Zynq VIPを利用したテストベンチ

割り込み処理

C言語プログラム側

 void wait_for_interrupt( unsigned int *status );

  unsigned int status; .....

 wait_for_interrupt( &status ); pritf(“Interrupt = 0x%x\n”, status );

Page 45: Zynq VIPを利用したテストベンチ

割り込み処理

SystemVerilogのテストベンチ側

`define ZYNQ_VIP tb.xxx

 export "DPI-C" task wait_for_interrupt;

 task wait_for_interrupt( output int unsigned status );  bit [15:0] irq_status;    // Zynq VIPの wait_for_interrupt APIを呼ぶ  `ZYNQ_VIP.wait_for_interrupt( 0, irq_status );  status = {16’h0000, irq_status};

 endtask : wait_for_interrupt

Page 46: Zynq VIPを利用したテストベンチ

Design Solution Forum2017年10月13日(金)開催@新横浜

今年で4年目、毎年500名を越える来場者

来週月曜日 (8月28日)から申し込み開始

http://www.dsforum.jp/

「ディーブラーニングトラック」

「RISC-Vトラック」

それぞれ5講演の予定

Page 47: Zynq VIPを利用したテストベンチ

ありがとうございました

ブログ : Vengineerの戯言http://blogs.yahoo.co.jp/verification_engineer

Twitter : @Vengineer

勉強会主催 : Xilinx Zynq MPSoC (2016/02/20) Altera SDK for OpenCL (2016/06/10) Xilinx SDSoC (2017/01/28)

PYNQ祭り (2017/03/04)FPGAディープラーニング実践懇親会 (2017/05/20)AWS EC2 F1について、みんなでワイワイ調べる会

(2017/07/08)