zynq vipを利用したテストベンチ
Post on 23-Jan-2018
977 Views
Preview:
TRANSCRIPT
Zynq VIPを利用したテストベンチ
@Vengineer
2017/08/26
SystemVerilogによるテストベンチ実践会
ブログ : 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
SystemVerilog
IEEE 1800-2012
IEEE Standard for SystemVerilogUnified Hardware Design, Specification, and Verification Languagehttps://standards.ieee.org/findstds/standard/1800-2012.html
・無償でダウンロードできますよ
書籍の表紙は、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
書籍の表紙は、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
Xilinx Vivado 2017.1&
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 からのみアクセスできます。
ドキュメント
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内のレジスタアクセス
引用:https://www.xilinx.com/support/documentation/ip_documentation/processing_system7_vip/v1_0/ds940-zynq-vip.pdf : 4頁
アーキテクチャ
引用:https://www.xilinx.com/support/documentation/ip_documentation/processing_system7_vip/v1_0/ds940-zynq-vip.pdf : 4頁
テストベンチ
Test Program (API calls)
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
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)
スレーブ(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 ブロッキングでデータ転送後戻る
スレーブ(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 ブロッキングでデータ転送後戻る
レジスタへアクセス
read_register( [31:0] addr, DATA ) アドレス(addr)のレジスタの値をリードする
read_register_map( [31:0] addr, size, DATA ) アドレス(addr)のレジスタの値を 最大2個までリードする
メモリ(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バイトまでのバックドアのライト転送
メモリ(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 ) バックドアのリード転送したデータを 指定したファイルにそストアする
メモリ(DDR/OCM)へアクセス
pre_load_mem( [1:0] data_type, [31:0] addr, no_of_bytes ) 引数(data_type)で指定したデータを 指定したアドレスに書き込む
data_type 00 : ランダム 01 : 0 10 : 1
割り込み処理
wait_interrupt( [3:0] irq, [15:0] irq_status ) 引数(irq)で指定した割り込みをモニターし、 割り込みが発生したら ステータスをirq_statusに返す 割り込みが発生するまでブロックする
read_interrupt( [15:0] irq_status ) 割り込みステータスをポーリングし、 その結果をirq_statusに返す ブロックしない
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
スレーブ制御
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
モデル制御
set_stop_on_error( LEVEL ) 引数に1を指定すると、エラーが発生したら、 シミュレーションを止める デフォルトは、1 が設定されている set_debug_level_inf( LEVEL ) 引数に1を指定すると、 VIPからのデバッグ情報が表示される デフォルトは、1 が設定されている
サンプルコード
Vivado 2017.1 の新機能8(Zynq-7000 VIP) @marsee101 さんのブログhttp://marsee101.blog19.fc2.com/blog-entry-3790.html
File => Export => Export Simulation にて、ファイルを生成する
% bash ./tb.sh
にて、シミュレーションが実行できる
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 )
サンプルコードのテストベンチ
Zynq VIP
DUT
GP HP/ACP IRQ
Test Program
テストベンチとテストプログラム
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
テストプログラム
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 )は、 トランザクションのステータス
SystemVerilogDPI-C
無償ツールで実践する「ハード・ソフト協調検証」
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
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
Vivado xsimでは、できません
理由:DPI-Cのtask exportを サポートしていない
Intel ModelSimでも
トライしましたが、
32ビットアプリのため、
メモリ不足でFatal Error
Zynq VIPのモデルで使用しているメモリ容量を少なくすることで、動きました。
それ以外にも
いろいろやりましたが。。。
お高い QuestaSimなら
さっくと動きます
Test Program と APIの関係
Zynq VIP APIs
User Design
GP HP/ACP IRQ
Test ProgramTop Testbench
・Test Program
・ModelZynq VIP
・DUTUser Design
テストプログラムは、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
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;}
アクセス関数
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 );
アクセス関数
SystemVerilogのテストベンチ側
export "DPI-C" task vip_read32;
export "DPI-C" task vip_write32;
export "DPI-C" task vip_nop;
アクセス関数 : 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
アクセス関数 : 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
アクセス関数 : vip_nop
SystemVerilogのテストベンチ側
task vip_nop( input int unsigned count );
repeat(count) @( posedge tb_ACLK );
endtask
割り込み処理
C言語プログラム側
void wait_for_interrupt( unsigned int *status );
unsigned int status; .....
wait_for_interrupt( &status ); pritf(“Interrupt = 0x%x\n”, status );
割り込み処理
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
Design Solution Forum2017年10月13日(金)開催@新横浜
今年で4年目、毎年500名を越える来場者
来週月曜日 (8月28日)から申し込み開始
http://www.dsforum.jp/
「ディーブラーニングトラック」
「RISC-Vトラック」
それぞれ5講演の予定
ありがとうございました
ブログ : 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)
top related