Home Ai2/1chipSim

Ai2/1chipSim

1ChipSimulation

AiIPcore仕様を満足したAiアクセラレータは1Chipシミュレーションで事前検証できます。

1chipSim環境概要

 
2021.11.19	/AiTwo/RefSYS/ReleaseAiTwo/1chipSIM/PowerOn/02
(PoN_v02)	5.6.簡易print機能1軽量版16進変換(sprintf代替)の説明追加
		6.1.概要図表更新
		6.6.周辺IFでDMACを使用する場合の引数詳細
			・8ch→4chの変更に合わせて本文更新
			・表記の修正付録
		A:割り込みハンドラ割り付け表更新(DMAC0割込み要因4~7を削減)
2021.11.17	機能9.MetaWare RASCALデバックは本バージョンでは未サポートです。
2021.11.09 	初版 for RTL PowerOn

過去の変更内容

1.1 1chip構成

1chip検証環境では、下記のように暗号化回路、ブラックボックス、検証モデルで構成しています。
拠点協力社様のAiIPコアはブラックボックスとなっており、そこに拠点協力社様で連結してSimulationを実行します。

1.2 ディレクトリ構成

下記にAiIP0X directoryと本Simulation 環境のDirectory構造を示します。
今後のRTL_PoN2やDF0にも対応しています。階層が少し深くなりますがご対応の程宜しくお願いいたします。
参照ファイル表記は、相対パスで願います。(拠点提供IPコアは除く)

検証環境関連

AiTwoSoCPF/sim/env			検証環境置き場
AiTwoSoCPF/sim/env/bin/			バッチファイル置き場
AiTwoSoCPF/sim/env/model/		検証用モデル置き場
AiTwoSoCPF/sim/env/model/simtop.v	SIM用TOPモジュール
AiTwoSoCPF/sim/env/csrc/		検証用Cプログラム基本環境
AiTwoSoCPF/sim/env/embarc/		embARC(embarc-osp)置き場
AiTwoSoCPF/sim/env/zsim/		検証実行環境テンプレート

SIM実行関連

AiTwoSoCPF/sim/1chip/			SIM実行ディレクトリ
AiTwoSoCPF/sim/1chip/zsim_simenv	検証実行環境(mkEnv.cshで作成したもの)
AiTwoSoCPF/sim/1chip/pat/		テストケース置き場
AiTwoSoCPF/sim/1chip/pat/base/		テストケーステンプレート
AiTwoSoCPF/sim/1chip/pat/pat001/	テストケース(mkPat.cshで作成したもの)

デザイン関連

AiTwoSoCPF/design/rtl/			SoCPlatForm RTL置き場

1.3 テストケースの構成

テストケースは、”sim/1chip/pat/テストケース名/” の下に格納されています。
テストケースとして、ハード制御用(Verilog)とソフト制御用(C言語)の2つを記述することでシミュレーションを実行できる環境となっています。
各ファイルの主な用途は下記のとおりです。

種類		ファイル名		詳細
-------------+-------------------------+--------------------------------------------
ハード制御	main_scenario.v		CPUのプログラムで表せない以下の機能の設定等を行う		
(Verilog)				・CLK初期設定
					・波形ファイル出力設定
					・SCOREBOARD、チェッカ設定
					・外部端子制御
					・内部回路force     etc.

ソフト制御	arc/cpu.c		各種レジスタ設定はCプログラムによるCPU制御で行う。
(C言語)
Ai-Two用

ソフト制御	host/cpu.c		各種レジスタ設定はCプログラムによるCPU制御で行う
(C言語)
HOST用	

シミュレーション環境では、下記のように処理が実行されます。

1.4 Ai-Oneからの変更点


2. 実行環境準備

2.1 実行環境コピー

リリースディレクトリから実行環境をコピーして準備する。

   /AiTwo/RefSYS/ReleaseAiTwo/1chipSIM/[ReleaseVer]/[subVer]/AiTwoSoCPF
例:/AiTwo/RefSYS/ReleaseAiTwo/1chipSIM/PowerOn/02/AiTwoSoCPF
※[ReleaseVer]、[subVer]は最新リリース状況をご確認ください。

/AiTwo/AiIP0x/1chipsim/02_03 $ cp –a /AiTwo/RefSYS/ReleaseAiTwo/1chipSIM/PowerOn/02/AiTwoSoCPF ./
/AiTwo/AiIP0x/1chipsim/02_03 $ cd AiTwoSoCPF/sim/1chip/

2.2 LSFキュー設定

LSFを使用する場合は指定します。

AiTwoSoCPF/sim/1chip $ ./setq.csh q

2.3 テストケース作成

テストケーステンプレートから、新規テストケースを作成。

AiTwoSoCPF/sim/1chip $./mkPat.csh pat001
※pat001は任意の名前、pat/pat001/が生成されます。

2.4 ワークディレクトリ作成

AiTwoSoCPF/sim/1chip $./mkEnv.csh  pat001 -configure
※pat001はテストケースの名前、zsim_pat001/ が生成されます。

2.5 テスト実行

AiTwoSoCPF/sim/1chip $ cd zsim_pat001/ 
AiTwoSoCPF/sim/1chip/zsim_pat001 $ ./go_sim.csh -t pat001 -use_qspi_model -use_memc_model # 実行結果例-1はこれで実行。高速QSPI MEMC #最初はこれで実行し実行環境をチェックしてください。
AiTwoSoCPF/sim/1chip/zsim_pat001 $ ./go_sim.csh –t pat001 -lsf       # 通常の実行方法(LSFを使用する)(default) # 実行結果例−2
AiTwoSoCPF/sim/1chip/zsim_pat001 $ ./go_sim.csh –t pat001 -local     # 通常の実行方法(ローカルマシンを使用する)

※pat001 は上で指定した任意の名前。
※その他のオプションは3.6も参照してください。
※正常に動作しない場合は、Error(“*E“)、Warning(“*W“) を確認する。
※サンプル環境で実行できることが確認できたら、所望のテストケースを準備して本検証を進めてください。
※実行例-1は14[KHz] 実行例-2は2.6[KHz]です。実行環境チェックは実行例-1を使用してください。

実行結果例-1
AiTwoSoCPF/sim/1chip/zsim_pat001 $ ./go_sim.csh -t pat001 -use_qspi_model -use_memc_model
	:
[162549.000[ns]]	CPU0 executing func/symbol : _s3_clear_bss                                                   
[341193.000[ns]]	CPU0 executing func/symbol : base_user_main0                                                 
===== Mem Load pat/dat0, start:0x00000000, size:0x00000010, type:hex 344638.000[ns]
PASS
PASS
PASS
PASS
===== Mem Dump dump_000, start:0x00000000, size:0x00000010, type:hex 353158.000[ns]
-- done
REG0 value = 0x00000000 
REG1 value = 0x00000020 
REG2 value = 0x00000000 
REG3 value = 0x00000000 
DEBUG_PRINT : ID[R000] DATA[0x00000000] : time[365518.075[ns]]
DEBUG_PRINT : ID[R001] DATA[0x00000020] : time[366798.075[ns]]
DEBUG_PRINT : ID[R002] DATA[0x00000000] : time[368038.075[ns]]
DEBUG_PRINT : ID[R003] DATA[0x00000000] : time[369278.075[ns]]
[369295.000[ns]]	CPU0 executing func/symbol : _exit_halt                                                      
----------------------------------------------------------------------------
            -----------------------
            -- CPU NORMAL FINISH --
            -----------------------
  CPU core0/1 HALTED. : ./../../env/model/top/cpu_common_inc.v(129)
       If you do not want to finish this case
           then please set +not_stop_by_halt to go_sim.csh script.
----------------------------------------------------------------------------
sim freq = 14.812[kHz]
Simulation complete via $finish(1) at time 370366075 PS + 0
/AiTwo/AiIP0X/incoming/user0101/1chipsim/0X/AiTwoSoCPF/sim/env/model/top/cpu_common_inc.v:136 		$finish;
xcelium> exit
TOOL:	xrun(64)	20.03-s009: Exiting on Nov 19, 2021 at 20:36:09 JST  (total: 00:01:20)
実行結果例−2
AiTwoSoCPF/sim/1chip/zsim_pat001 $  ./go_sim.csh –t pat001
  [15766902.000[ns] ns] Data are going to be output: c2. [Read Memory. Address 00026bf (byte 191 of page 38, subsector 2 sector 0)] 0 0
  [15766966.000[ns] ns] Data are going to be output: 06. [Read Memory. Address 00026c0 (byte 192 of page 38, subsector 2 sector 0)] 0 0
DEBUG_PRINT : ID[R000] DATA[0x00000000] : time[15767878.075[ns]]

DEBUG_PRINT : ID[R001] DATA[0x00000020] : time[15769158.075[ns]]
DEBUG_PRINT : ID[R002] DATA[0x00000000] : time[15770398.075[ns]]
[15771526.000[ns] ns] COMMAND DECODED: Quad Output Read , withAddr=00000001, with2Addr=00000000, with4Addr=00000000, cmdcode=6b
[15771526.000[ns] ns] 1.COMMAND RECOGNIZED: Quad Output Read. Address expected ...
[15771526.000[ns] ns] COMMAND DECODED: Quad Output Read , withAddr=00000001, with2Addr=00000000, with4Addr=00000000, cmdcode=6b
[15771526.000[ns] ns] 1.COMMAND RECOGNIZED: Quad Output Read. Address expected ...
DEBUG_PRINT : ID[R003] DATA[0x00000000] : time[15771638.075[ns]]

	:
  [15794294.000[ns] ns] Data are going to be output: 10. [Read Memory. Address 000023e (byte 62 of page 2, subsector 0 sector 0)] 0 0
  [15794358.000[ns] ns] Data are going to be output: 00. [Read Memory. Address 000023f (byte 63 of page 2, subsector 0 sector 0)] 0 0
  [15794422.000[ns] ns] Data are going to be output: 25. [Read Memory. Address 0000240 (byte 64 of page 2, subsector 0 sector 0)] 0 0
----------------------------------------------------------------------------
            -----------------------
            -- CPU NORMAL FINISH --
            -----------------------
  CPU core0/1 HALTED. : ./../../env/model/top/cpu_common_inc.v(129)
       If you do not want to finish this case
           then please set +not_stop_by_halt to go_sim.csh script.
----------------------------------------------------------------------------
sim freq = 2.644[kHz]
Simulation complete via $finish(1) at time 15795466075 PS + 0
/AiTwo/AiIP0X/incoming/user0101/1chipsim/0X/AiTwoSoCPF/sim/env/model/top/cpu_common_inc.v:136 $finish;
xcelium> exit
TOOL:	xrun(64)	20.03-s009: Exiting on Nov 20, 2021 at 09:35:55 JST  (total: 01:40:46)

2.6 FAQ

1) cpu.c、モジュール名にパターン名を入れる。pat0001_user_main0
xxx FATAL : not found main(), user_main0(), pat001_user_main0() and pat001() in cpu.c : pat001

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/cpu.c

int base_user_main0(void) ==> int pat001_user_main0(void)

2)AiTwoSoCPF.fに、AiIP0x.fは-f接頭辞をつける。
xrun: *E,FMUK: The type of the file (./../../AiIP0x/rtl/AiIP0x.f) could not be determined.

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi ../../../design/rtl/AiTwoSoCPF/AiTwoSoCPF.f

./../../AiIP0x/rtl/AiIP0x.f ==> -f ./../../AiIP0x/rtl/AiIP0x.f

3) AiIP0x.fに、IncludeDirectoryを追加する。
xrun: *E,VLGERR: An error occurred during parsing.  Review the log file for errors with the code *E and fix those identified problems to proceed.  Exiting with code (status 1).
vi xrun.log
xmvlog: *E,COFILX (../../AiIP0x/rtl/top/module_include.sv,3|30): cannot open include file 'module_include_pkg.sv'.

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi ../../AiIP0x/rtl/AiIP0x.f

../../AiIP0x/rtl/top/module_include.sv
+incdir+../../AiIP0x/rtl/common   <== include directoryを指定する。

4)AiIP0x.fに、メモリwrapperセルを追加する。
xmelab: *E,CUVMUR (sim/AiIP0x/rtl/sadulsph4s2p256x256m4b1w0c1p0d0t1s10_bus_wrapper.v,123|42): instance 'simtop.DUT@AiTwoSoCPF.u_AiIP0x@AiIP0x.moduleAb@AiIP0x_top.moduleB@moduleA.....'sadulsph4s2p2048x256m4b2w0c1p0d0t1s10' is unresolved in 'worklib.sadulsph4s2p256x256m4b1w0c1p0d0t1s10_wrapper:v'.
xrun: *E,ELBERR: Error during elaboration (status 1), exiting.

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi ../../AiIP02/rtl/AiIP0x.f

/apps/aidl/ip_snps_dsgn/duet_mem/v31/DP11/sadulsph4s2p2048x256m4b2w0c1p0d0t1s10/sadulsph4s2p2048x256m4b2w0c1p0d0t1s10_fast_func.v
/apps/aidl/ip_snps_dsgn/duet_mem/v31/SP11L/sad2lsph4s1p1024x312m4b1w1c1p0d0t1s10/sad2lsph4s1p1024x312m4b1w1c1p0d0t1s10_fast_func.v

5)pat/main_scenario.v に波形出力設定する。
AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/main_scenario.v
//------------------------------------------------------------------------------
// wave setting
//------------------------------------------------------------------------------
    initial begin
        if($test$plusargs("wave_off"))begin
            // nop

        end else begin
`ifdef    PCIE_MDL_ON
//            // HOST PCIeのリンクアップ待ち
//            @(posedge `PCIEMODEL.u_PCIE.PCIE0.rdlh_link_up);
`endif
            $shm_open("wave");
            $shm_probe(`TOP, "as");
//            $shm_probe(`TOP, "atf");
//            $shm_probe(`DUT, "a");
//            $shm_probe(`CPU,    "as");
//            $shm_probe(`CMEM,    "as");
//            $shm_probe(`SYSC,    "as");
//            $shm_probe(`CPG,    "as");
//            $shm_probe(`PFC,    "as");
//            $shm_probe(`DBG,    "as");
//            $shm_probe(`PCIE,    "as");
//            $shm_probe(`MEMC,    "as");        // これをONにするとSimulation時間が長くなります
//
//            $shm_probe(`AiIP01A,    "as");
//            $shm_probe(`AiIP01B,    "as");
//            $shm_probe(`AiIP02,    "as");
//            $shm_probe(`AiIP03,    "as");
        end
    end

3. 実行環境変更

3.1 読込デザイン変更

シミュレーション時に読み込むRTLは、design/rtl/AiTwoSoCPF/AiTwoSoCPF.f に記載されています。
デフォルトでは、各社独自IPのRTLはBlackBox(AiIPxx_bb.v)となっていますので、御社のIPデザインについて、実体RTLを読み込むように修正をお願いします。
ファイルリスト例

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi ../../../design/rtl/AiTwoSoCPF/AiTwoSoCPF.f

// IP0XX
//  //-f ${IPPATH}/AiIP0XX/rtl/AiIP0XX.f
${RTLPATH}/common/bbox/AiIP0XX_bb.v

//--------------------------
// IP0YY
-f ./../../AiIP0YY/rtl/AiIP0YY.f			<== -fをつけてください。
// ${RTLPATH}/common/bbox/AiIP0YY_bb.v

//--------------------------
// IP0ZZ
//  //-f ${IPPATH}/AiIP0ZZ/rtl/AiIP0ZZ.f
${RTLPATH}/common/bbox/AiIP0ZZ_bb.v

修正例:RTLファイルとSimulation用モデルファイルが別れている場合。

 
AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi ../../../design/rtl/AiTwoSoCPF/AiTwoSoCPF.f

// IP0X
//  //-f ${IPPATH}/AiIP0X/rtl/AiIP0X.f
//  ${RTLPATH}/common/bbox/AiIP0X_bb.v
 -f ../../AiIP0X/rtl/AiIP0X.f
 -f ../../AiIP0X/rtl/AiIP0X_sim.f

3.2 テストケースの編集

AiTwoSoCPF/sim/1chip/pat/テストケース名/ の下のmain_scenario.v(ハード制御用Verilogコード)と、arc/cpu.c(ソフト制御用Cコード)を編集します。
各ファイルの詳細については、次章以降で説明します。

3.3 シミュレーション実行

ファイルリストとテストケースが準備出来たら、テスト実行時と同様にバッチファイルを実行します。
※pat001 は環境構築時に指定した任意の名前。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ ./go_sim.csh -t pat001

3.4 Simulatorオプション

Simulatorへのオプションを追加したい場合、以下の様にgo_sim.cshに引数として追加します。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ ./go_sim.csh -t pat001 +incdir+../../AiIPXX/rtl/ +define+[Example]

3.5 Cコンパイラオプション

C プログラムのコンパイラへのオプションを追加したい場合以下の様にgo_sim.cshに-cpuoptに続く引数として追加します。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ ./go_sim.csh -t pat001 -cpuopt -I./pat/arc/include -cpuopt -DPAT001_TEST

3.6 go_sim.cshオプション

go_sim.cshには以下の様なオプションを指定することで処理を制御できます。

Option名	備考	内容
---------------+-------+------------------------------------------------------------
-t pat001		テストケース名を指定します。

-setq キュー名		-lsfオプション使用時(-local未指定時含む)に、現在のSIMだけ指定されたキューをセットします。
			通常はsetq.cshで指定したキューを使用します

-lsf 		default	LSFを使ってシミュレーションを実行します。

-local			ローカルマシンでシミュレーションをを実行します。

-cc			C programのコンパイルだけ実行して終了します。

-configure		patディレクトリへのリンク処理を行います。
			※pat/go_sim.csh を編集後実行する場合等に使用することを想定しています。

-use_pcie		外部 PCIe RC/EPモデルを接続します。
			PCIe転送を使ったテストケース用です。

-use_qspi_model		QSPIをメモリモデルにすることによりSimを高速化します。
			※サインオフ時、本オプションは指定しないでください。

-use_memc_model		MEMCをメモリモデルにすることによりSimを高速化します。
			※サインオフ時、本オプションは指定しないでください。

+wave_off		波形ダンプを行いません。
			"+" オプションであることに注意してください。

4. テストシナリオ編集

Verilogのテストシナリオ(main_scenario.v)編集します。
CPUのプログラムで表せないハード制御処理は、Verilogのテストシナリオに記載します。
main_scenario.vの記載例を以下で説明します。

4.1 TIMEOUT設定

無限ループ等でシミュレーションが終了しなかった時のためのTIMEOUT時間を設定しておきます。想定されるシミュレーション時間に合わせて適当な時間を設定してください(設定時間が短すぎると、シナリオが終わる前にTIMEOUTしてしまいます)。
設定値は、”1ms” のように単位を付けておくことを推奨します。(timescaleの影響を受けないようにするため)。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/main_scenario.v

//------------------------------------------------------------------------------
// forced finalize time
//------------------------------------------------------------------------------
// simulationの強制終了時間を設定š
`define TIMEOUT  1ms;

4.2 メインシナリオ

テストシナリオの大枠構成を記載します。
シナリオの詳細な内容は “testcase_main()” に記載し、ここでは基本構成の明示のみとすることを推奨します。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/main_scenario.v

//------------------------------------------------------------------------------
// main_scnario task for describe testcase flow.
//------------------------------------------------------------------------------
task    main_scenario();    : main_scenario
    // ここは基本的にtask呼出のみの記載
    // 実際のテスト内容はtestcase_main内に記載
    // testcase_main以降の構成はテスト毎に自由に構成可能
    testcase_main();

    $finish;
endtask // main_scenario

4.3 波形設定

SHM波形設定を記載します。通常は変更不要です。
(詳細仕様はXceliumのドキュメントを参考にしてください)

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/main_scenario.v

//------------------------------------------------------------------------------
// wave setting
//------------------------------------------------------------------------------
    initial begin
        if($test$plusargs("wave_off"))begin
            // nop
        end else begin
`ifdef  PCIE_MDL_ON
//          // HOST PCIeのリンクアップ待ち
//          @(posedge `PCIEMODEL.u_PCIE.PCIE0.rdlh_link_up);
`endif
            $shm_open("wave");
//          $shm_probe(`TOP, "as");
            $shm_probe(`TOP, "atf");
            $shm_probe(`DUT, "a");
            $shm_probe(`CPU,    "as");
//          $shm_probe(`SYSC,   "as");
//          $shm_probe(`CPG,    "as");
//          $shm_probe(`PFC,    "as");
//          $shm_probe(`DBG,    "as");
//          $shm_probe(`PCIE,   "as");
//          $shm_probe(`MEMC,   "as");    //これをONにするとSimulationの時間が長くなります。
//
//          $shm_probe(`AiIP01A,    "as");
//          $shm_probe(`AiIP01B,    "as");
            $shm_probe(`AiIP02, "as");
//          $shm_probe(`AiIP03, "as");
        end
    end

4.4 SCOAREBOARD・チェッカ

シミュレーション処理終了時に行うSCOREBOARDやチェッカを記載します。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/main_scenario.v

//------------------------------------------------------------------------------
// for check, socreboard
//------------------------------------------------------------------------------
    final begin
        //ここはsimulation実行後のチェックや、Scoreboard表示記載を想定
    end

4.5 クロック指定

外部入力クロックとPLLの逓倍設定を指定します。
通常は10MHzから変更不要です。
(変更する場合は、model/top/clkgen_inc.hの`defineを参考にしてください)

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/main_scenario.v

//------------------------------------------------------------------------------
// clock initial settings
//------------------------------------------------------------------------------
    initial begin
        // クロック初期設定や、外部端子設定など
        // external input clock settings
        SRCCLK0_TOGGLE_TIME = `FREQ_10MHz;
        `MULRATIO_PIN(0)    = `MULRATIO_10MHz;

        SRCCLK1_TOGGLE_TIME = `FREQ_10MHz;
        `MULRATIO_PIN(1)    = `MULRATIO_10MHz;

    end

4.6 テストシナリオ本体

テスト詳細をここに記載します。
フォーマット等に特に制限はありませんので、task等自由に記載してください。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/main_scenario.v

//------------------------------------------------------------------------------
// testcase main task
//------------------------------------------------------------------------------
task    testcase_main();
    // ここがテスト本体
    // CPUのプログラム以外の制御はここに記載
    // 外部端子制御もここ
        #20ms;

endtask // testcase_main

4.7 LSI外部端子制御

LSIの外部端子の接続は下記のような構成になっています。
入力専用端子の場合、PINNAMEに所望の信号を入力させてください。
出力専用端子の場合、PINNAMEの信号をモニタしてください。
入出力端子から信号を入力したい場合、e_PINNAME=1(primitiveをイネーブル)した上で、i_PINNAMEに所望の信号を入力させてください。
入出力端子からの出力信号を確認したい場合、e_PINNAME=0(primitiveをディセーブル)した上で、PINNAMEの信号をモニタしてください。
なお、CLK等の特殊な信号は、上記の構成になっていない場合があります。
一部の機能端子は、対向モデル(外付けメモリ等)が接続されている場合があります。

5. cpu.c編集

編集CPUによるソフト制御処理は、Cソース (arc/cpu.cで記載します。
cpu.cの記載例を以下で説明します。

5.1 base_user_main0変更

関数base_user_main0()の接頭辞を変更する。
mkPat.cshでテストを生成した場合、base_user_main0()関数が定義されています。
このbase部分をテストケース名に置き換えてください。
base_部分はcpPat.cshを使用した場合はコピー元のテストケース名になっています。
例えばテストケース名pat001の場合 pat001_user_main0()の様になります。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/cpu.c

#include "cpu.h"

int base_user_main0(void)	<== pat001_user_main0(void)に修正する。
{
  //----------------------------------------------------------------------------
  // reset release(don't modify this area)
  //----------------------------------------------------------------------------

5.2 リセット解除部

各ブロックのリセットを解除するためのレジスタ設定です。
通常はこのまま使用してください。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/cpu.c

  //----------------------------------------------------------------------------
  // reset release(don't modify this area)
  //----------------------------------------------------------------------------
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x0040 , 0x00000000);
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x0044 , 0x00000000);
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x0048 , 0x00000000);
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x004C , 0x00000000);
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x0050 , 0x00000000);
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x0054 , 0x00000000);
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x0058 , 0x00000000);
  REGW(AiOne_SYSC_BASE_ADDRESS + 0x005C , 0x00000000);

5.3 テストプログラム本体

テスト詳細をここに記載します。
フォーマット等に特に制限はありませんので、C言語の書式で自由に記載してください。
レジスタリード/ライト処理は、REGR/REGWマクロが利用可能です。
REGR/REGWマクロを使用しない場合は、(volatile unsigned int …)形式でアドレスを記述してください。
具体的な記述方法はAiTwoSoCPF/1chip/env/csrc/inc/common/macro.hのマクロ定義を参考にしてください。
各ブロックのベースアドレスは、NoC仕様書の1chipアドレスマップを参照してください。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/cpu.c

  //----------------------------------------------------------------------------
  // user program(example. please modify this code for your test)
  //----------------------------------------------------------------------------

  //----------------------------------------------------------------------------
  // example for register access
  //----------------------------------------------------------------------------
  unsigned int reg_rdata;

  REGR(AiOne_SYSC_BASE_ADDRESS + 0x02F4 , reg_rdata);

  if(reg_rdata!=0){
    REGW(AiOne_SYSC_BASE_ADDRESS + 0x02F0 , (reg_rdata & 0xFFFF0000));
  }

5.4 Cファイルリンク

5.4. arc/ディレクトリ以外のCファイルをリンクする場合、
現環境ではarcディレクトリのすべてのC/C++プログラムをコンパイルしリンクします。
また、対象となるファイル拡張子はそれぞれ.c/.cppとなります。
arc/ディレクトリ以外のプログラムをリンクしたい場合(arc/のさらに下階層含む)、arc/appl_makefile.mkに以下の記述を追加してください。
ここで指定したパスにあるすべてのC/C++ソースをコンパイルしてリンクします。
例えば、以下の例では arc/include 以下をコンパイル対象に追加します。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/appl_makefile.mk

# application source dirs
APPL_CSRC_DIR +=  $(PATPATH)/include
APPL_CXXSRC_DIR +=  $(PATPATH)/include

5.5 includeパス

includeするパスを追加したい場合(arc/のさらに下階層含む)、arc/appl_makefile.mkに以下の記述を追加してください。
例えば、以下の例では arc/include 以下をincludeパスに追加します。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/appl_makefile.mk

# application include dirs
APPL_INC_DIR += $(PATPATH)/include

5.6 簡易print機能1

Cプログラムのデバッグ用に、簡易的なprint機能を使用できます。
※KW(KeyWord)は4文字の文字列を指定してください。
(4文字以外はサポートしていません)

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/cpu.c

関数format
 debug_print(char*KW, int DATA)

実行結果
 DEBUG_PRINT : ID[REGO] DATA[0x00000001] : time [XXXX. XXX[ns]]

前半部分は、キーワードを固定値で記述した使用例です。
後半部分は、sprintfで汎用的に記述した使用例です。
※sprintfを使用するとSIM時間が長くなりますのでご注意ください。

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/cpu.c

  //----------------------------------------------------------------------------
  // example for debug_print()
  //----------------------------------------------------------------------------
  unsigned int r0;
  unsigned int r1;
  unsigned int r2;
  unsigned int r3;
  REGR(AiOne_SYSC_BASE_ADDRESS + 0x0090 , r0);
  REGR(AiOne_SYSC_BASE_ADDRESS + 0x0094 , r1);
  REGR(AiOne_SYSC_BASE_ADDRESS + 0x0098 , r2);
  REGR(AiOne_SYSC_BASE_ADDRESS + 0x009C , r3);
  debug_printf("REG0 value = 0x%08x \n", r0);
  debug_printf("REG1 value = 0x%08x \n", r1);
  debug_printf("REG2 value = 0x%08x \n", r2);
  debug_printf("REG3 value = 0x%08x \n", r3);
以下は、Ai-Oneのものを移植する場合はそのまま継続利用いただけます。

sprintfを使用するとCPU(HS38)のソフト処理が重くなるため、数値→16進文字列変換に特化させた軽量版関数を準備しました。
(sprintを使用した場合に比べて、半分ぐらいに軽くなります)
軽量版16進変換使用例
for (i=0;i<4;i++){
	REGR(AiOne_SYSC_BASE_ADDRESS + 0x0090 + i*4 , r0);
	hexstr4(id,i);
	debug_print(id, r0);
}

5.7 簡易print機能2

通常のprintfに相当するdebug_printf関数を使用できます。
debug_printfで出力できる文字は最大200文字の制限があります。
(200文字を超えるとCPUが暴走し例外でシミュレーションが終了しますので、使用に当たっては注意してください。)

AiTwoSoCPF/sim/1chip/zsim_pat001 $ vi pat/arc/cpu.c

  debug_printf("REG0 value = 0x%08x \n", r0);
  debug_printf("REG1 value = 0x%08x \n", r1);
  debug_printf("REG2 value = 0x%08x \n", r2);
  debug_printf("REG3 value = 0x%08x \n", r3);

5.8 割込み

5.8.1. 概要

ここではGPIO0の0番目の割り込みを例にして説明します。
また、参考用テストとして "pat/base_irq/" を用意しています。

5.8.2. 割り込み要因番号を確認する

後述の割り込み割り付け表(付録A)を参照し、割り込み要因番号、割り込みハンドラ名を確認してください。
※ここでは 割り込み要因番号#160 の 割り込みハンドラ名“gpio0_0_handler” を例にして説明します。

5.8.3. C sourceに割り込みハンドラを記述する

5.8.2で確認した割り込みハンドラに、以下の様に割り込みで実施すべき処理を記載してください。
例)(testcase:base_irqを例に説明)
※割り込みハンドラ内では、必ず該当割り込み要因をクリアしてください。
クリアしない場合無限に割り込みハンドラ処理が行われます。
※割り込みハンドラ名には接頭辞としてテストケース名を追加してください。

AiTwoSoCPF/sim/1chip/pat/base_irq $ vi arc/cpu.c

//------------------------------------------------------------------------------
// 割込処理†
//------------------------------------------------------------------------------
#define INTSTATUS   0x40
#define PORTA_EOI   0x4C

static void base_irq_gpio0_0_handler(void *ptr){
  state++;

  irq_wait_stop();
  REGW(AiOne_GPIO0_BASE_ADDRESS + PORTA_EOI , 0x1);

  {
    unsigned int rdata_n = 1;
    while(rdata_n != 0x0){
      REGR(AiOne_GPIO0_BASE_ADDRESS + INTSTATUS, rdata_n);

    }
  }
}

5.8.4. aitwo_int_handler_installマクロで割り込み関数を登録する

_user_main0関数内でaitwo_int_handle_installマクロを使用し、5.8.2で確認した割り込み要因番号と、5.8.3で作成した関数を指定してください。割り込み要因番号の代わりに "num_<割込みハンドラ名>" を使用することもできます。

AiTwoSoCPF/sim/1chip/pat/base_irq $ vi arc/cpu.c

  //----------------------------------------------------------------------------
  // set irq_handler
  //----------------------------------------------------------------------------
  aitwo_int_handler_install(num_gpio0_0_handler, base_irq_gpio0_0_handler);

5.8 CPU2core動作

RTL PowerOnでは使用できません。

5.9.1. 概要

2core用のテストパターンを作成する場合は、下記のコマンドでテンプレートを作成してください。
(2章の1core用標準コマンドとは異なります)
※pat001は任意の名前、pat/pat001/が生成されます。

./cpPat.csh base_2core pat001

2core版環境では、user_main0関数(core0用)とuser_main1関数(core1用)に分けて、Cプログラムを記述します。
LSI起動直後はcore0だけが動作開始します。core1を使用する場合は、user_main0関数から、invoke_core1関数を実行して起動する必要があります。
invoke_core1関数を呼び出したタイミングでcore1が起動開始し、前処理が完了するとuser_main1関数のプログラムが実行されます。
./mkPat.cshで作成した時と同様にuser_main0、 user_main1の関数名はdefaultではbase_2core_user_main0、base_2core_user_main1となっていますので、base_2coreの部分を関数名に変更してください。

5.9.2. 1core版Cプログラムからの移植ポイント

1core版の環境(標準環境)で作成済みCプログラムを2core版環境に移植したい場合、下記の点にご注意ください。
・core1を起動するために、_user_main0に"invoke_core1()" 関数の呼び出しを追加する。
・"_user_main1()" 関数を新しく定義する。
新規に_user_main1()関数を準備して、core1用プログラムを記載してください。

5.10 DRAMデータ Loader/Dumper

DRAMに初期データをロードしたり、DRAMのデータをファイルダンプしたりすることができます。
※注意
本関数はPCIEブロックの信号を強制的に乗っ取って実現していますので、PCIE0/PCIE1ブロックを通常動作させている状態では使用できません。

5.10.1. data_load

テキストファイルからDRAMへデータをロードします。
本関数はデータロード処理が完了するまでは次の処理に移りません。
処理時間はロードするデータサイズに依存します。
記述例)

data_load("dat0", 0, 0x10, 0)

上記呼び出しで、"pat/<テストケース名>/dat0" の内容を、DRAMのアドレス0番地から0x10Byte分だけ、PCIE0経由でロードします。

引数詳細 説明
第一引数 "ファイル名を指定します。
指定できる文字数は4文字限定です。
別途 ""pat/(テストケース名>/<本ファイル名) でロードするデータを用意してください。
データのフ>ォーマットについては後述します。"
第二引数 ロード開始アドレスを指定します
第三引数 ロードするサイズを指定します。
第四引数 信号を乗っ取るPCIEブロックを指定します。
0:PCIE0(EndPoint用)
1:PCIE1(RootComplex用)
※通常動作で使用していないPCIEブロックを指定してください。
(PCIEブロックを使用しない検証シナリオの場合どちらを指定しても構いません)
5.10.2. data_dump

DRAMからテキストファイルへデータをダンプします。
本関数はデータダンプ処理が完了するまでは次の処理に移りません。
処理時間はダンプするデータサイズに依存します。
下記呼び出しで、ファイル "zsim_<環境名> /dump_000" に、DRAMのアドレス0番地から0x10Byte分だけ、PCIE0経由でダンプします。
※赤字部分は、第一引数に同じ値を指定し本関数を複数回呼び出した場合は_000 -> _001 --> 002の様に自動的にincrementされた値に置き換わります。

data_dump("dump", 0, 0x10, 0)
引数詳細		説明		
-------------+----------------------------------------------------------------------
第一引数		ファイル名の接頭語を指定します。
		指定できる文字数は4文字限定です。

第二引数		ダンプ開始アドレスを指定します

第三引数		ダンプするサイズを指定します。

第四引数		信号を乗っ取るPCIEブロックを指定します。
		0:PCIE0(EndPoint用)
		1:PCIE1(RootComplex用)
		※通常動作で使用していないPCIEブロックを指定してください。(PCIEブロックを使用しない(-use_pcieを指定しない)テストケースの場合どちらを指定しても構いません)

5.10.3. データフォーマット

Loader使用時は以下のフォーマットのファイルをご用意ください。
・1データ/1Byte
・デリミタは改行、スペース、タブ文字
・hex形式 "0x"指定なし

例1) 改行区切り
pat/<テストケース名>/dat0

00
01
02
03
04
05
06
07

例2)スペース、改行区切り
pat/<テストシナリオ名>/dat0
なお、Dumperで出力されるファイルは、例1のフォーマットとなります。

00 01 02 03
04 05 06 07

5.10.4. data_load/data_dump制限事項

・開始アドレスは16Byteアラインとなるように指定してください(アドレスの下位4bitが0000であること)。

6. DMAC検証環境

6.1 概要

DMACを使用することで、メモリ-メモリ間、メモリ-周辺IF間、周辺IF-周辺IF間でDMA転送が可能です。
転送先、転送元ブロックによりAiTwoSoCPFに搭載されている2つのDMAC(DMAC0/DMAC1)を使い分けて下さい。
※各ブロックのベースアドレスは、NoC仕様書の1chipアドレスマップを参照してください。

6.2 サンプル環境

サンプル環境の構成
以下のサンプル環境(テストケース)を用意しています。

AiTwoSoCPF/sim/1chip/pat/base_dmac_000 $ 

テストケース概要
・DRAM-DRAM間のDMA転送
・DMAC0-Master0port,DMAC0-Master1port,DMAC1の3種類で実施
・転送サイズ設定はそれぞれ以下の通り。
DMAC0-Master0/1port:
1beats*1回、32beats*1回、16beats*3回の3通り。
DMAC1:
1beats*1回、16beats*1回、8beats*3回の3通り。

本FWでは関数に与える引数を変更することで、転送先/転送元アドレス、転送量などを設定することが出来ます。詳しくは6.4の説明欄を参照ください。
サンプル環境のディレクトリには以下のファイルがあります。
6.3に記載の方法で実行環境に組み込んでいただくことで、DMACを使用することが出来ます。

AiTwoSoCPF/sim/1chip/pat/base_dmac_000 $ vi arc/cpu.c

ソフト制御用のCコードです。CPUからDMAC起動制御を行っています。
AiTwoSoCPF/sim/1chip/pat/base_dmac_000 $ vi SRCD

サンプル環境にてDMA転送を確認する際、転送元にあらかじめデータをロードするため使用するファイルです。
5.10.3に記載のデータフォーマットになっております。

6.3 実行方法

既存のパターンにDMAC転送処理を組み込む場合の手順を以下に示します。

6.3.1 cpu.cのDMAC起動したいところで、dmac0関数もしくはdmac1関数を呼び出してください。

(呼び出し時の引数については6.4を参照してください)

AiTwoSoCPF/sim/1chip $ ./mkPat.csh dmac001
AiTwoSoCPF/sim/1chip $ ./mkEnv.csh dmac001
AiTwoSoCPF/sim/1chip $ cd zsim_dmac001
AiTwoSoCPF/sim/1chip/zsim_dmac001 $ vi pat/arc/cpu.c

  1 #include "cpu.h"
  2 
  3 int dmac001_user_main0(void)
  4 {

 20   //----------------------------------------------------------------------------
 21   // user program(example. please modify this code for your test)
 22   //----------------------------------------------------------------------------
 23 
 24   //src_address_L,src_address_H,dst_address_L,dst_address_H,
 25   //block_num,block_size,t_func,
 26   //hs_dst_sel,hs_src_sel,axi_dst_sel,axi_src_sel,src_peri,dst_peri,ch_set,ch_prior
 27   //src_msize,dst_msize
 28 
 29  //data_load
 30   data_load("SRCD",0x01000000,0x1000,0);//data load
 31 
 32   //DMAC0-port0
 33   //CH1
 34 
 35   dmac0(0x01000000,0x00000000,0x00100000,0x00000000,
 36               0x000000001,0x00000000,0x0,
 37               0x1,0x1,0x0,0x0,0x0,0x0,0x1,0x1,
 38               0x0,0x0);
 39 
 40   data_dump ("D1ST",0x00100000,0x1000,0); //data dump

	dmac0 (src_address_L, src_address_H, dst_address_L, dst_address_H,
	block_num, block_size, t_func,
	hs_dst_sel, hs_src_sel, axi_dst_sel, axi_src_sel,
	src_peri, dst_peri, ch_set, ch_prior, src_msize, dst_msize);

6.3.2 シミュレーションを実行してください。
AiTwoSoCPF/sim/1chip/zsim_dmac001 $ ./go_sim.csh -t dmac001 
6.3.3 シミュレーション実行ログを確認してください。

DMACが起動すると、下記のようなログが出力されます。
DEBUG_PRINT:ID[ENDD] がDMA転送完了時のメッセージで、DATA[0x*]部分に転送完了した回数が表示されます。

6.4 DMAC起動関数詳細

DMACによるDMA転送を使用するために、dmac0関数とdmac1関数を準備しています。本関数の引数に、転送元/転送先アドレスや転送サイズなどを指定することで、所望の設定でDMA転送を行うことができます。
各引数の内容は下表のとおりです。なお、本項では基本的な使用方法として、DRAM-DRAM間の転送を想定した説明となっています。周辺IFとの転送を行う場合にはもう少し詳細な設定が必要となりますので、6.6に分けて説明します。

dmac0(	①src_address_L, ②src_address_H, ③dst_address_L,④dst_address_H,
	⑤block_num,⑥block_size, ⑦t_func,
	⑧hs_dst_sel,⑨hs_src_sel, ⑩axi_dst_sel,⑪axi_src_sel,
	⑫src_peri, ⑬dst_peri, ⑭ch_set, ⑮ch_prior, ⑯src_msize,⑰dst_msize);
引数詳細		説明		
---+------------------+-------------------------------------------------------------
①	src_address_L	転送元の下位32bitアドレスを設定
②	src_address_H	転送元の上位32bitアドレスを設定
③	dst_address_L	転送先の下位32bitアドレスを設定
④	dst_address_H	転送先の上位32bitアドレスを設定
⑤	block_num	転送する回数を指定
			転送サイズ設定に関する詳細は6.5を参照。
⑥	block_size	一回の転送で転送するデータ量
			転送サイズ設定に関する詳細は6.5を参照。
⑦	t_func		DRAM-DRAM間で転送する場合は0x0を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑧	hs_dst_sel	DRAM-DRAM間で転送する場合は0x1を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑨	hs_src_sel	DRAM-DRAM間で転送する場合は0x1を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑩	axi_dst_sel	転送先の使用portを設定
			転送先ブロックよって使用できるポートを選択してください(6.1を参照)。
			DMAC0の場合は0x0か0x1を選択、DMAC1の場合は0x0を設定すること。
⑪	axi_src_sel	転送元の使用portを設定
			転送元ブロックよって使用できるポートを選択してください(6.1を参照)。
			DMAC0の場合は0x0か0x1を選択、DMAC1の場合は0x0を設定すること。
⑫	src_peri	DRAM-DRAM間で転送する場合は0x0を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑬	dst_peri	DRAM-DRAM間で転送する場合は0x0を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑭	ch_set		DRAM-DRAM間で転送する場合は0x0を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑮	ch_prior	DRAM-DRAM間で転送する場合は0x0を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑯	src_msize	DRAM-DRAM間で転送する場合は0x0を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。
⑰	dst_msize	DRAM-DRAM間で転送する場合は0x0を設定すること。
			周辺IFを使用する場合の詳細設定は6.6を参照。

6.5 転送サイズ設定

転送サイズ設定の詳細説明
トータルの転送サイズは、block_numとblock_sizeで決まります。
DMAC0:block_num×(block_size+1)×32byte
DMAC1:block_num×(block_size+1)×8byte
なお、block_size設定の上限値は0xFFFF(DMAC0で2MB、DMAC1で0.5MB)となりますので、それ以上のサイズを転送する場合にはblock_numで分割する必要があります(割り切れる数値で分割してください)。

6.6 周辺IFDMAC引数

周辺IFでDMACを使用する場合の引数詳細
周辺IFブロックとのDMA転送でDMACを使用する場合の設定方法について説明します。周辺IFブロックには、DMACに対して転送リクエストの発行機能を持つブロックと、持たないブロックがあります

	
------------------------------+-----------------------------------------------------
転送リクエスト発行機能あり		SPIM0/1、SPIS、QSPI0、QSPI1、UART0/1/2

転送リクエスト発行機能なし		PCIE0/1、TIMER0/1、GPIO0/1、AiIPxx 

転送リクエストとは、周辺IF側で転送準備ができたことをトリガとしてDMA転送を開始するような制御方法です。周辺IFの転送リクエストを使用する場合は、転送リクエスト等に関する設定も考慮する必要があります。

転送リクエスト使用/未使用に関わらず考慮必要な設定
・ DMA転送する転送元/転送先の種類を選択する。
・ 周辺IF側のFIFOサイズに合わせて、適切な転送形式を設定する(対象ブロックはUARTのみ)。

転送リクエスト使用時に考慮必要な設定
・ DMACで受け付ける転送リクエストの発行ブロックを選択する。
DMAC0/1にはそれぞれ8それぞれ4つのチャンネルの持ち、チャンネル毎に転送リクエストを割り当てて、同時にリクエスト待ちすることができる(例:CH1=SPIM0、CH2=SPISと設定し、リクエストが来た方から転送を開始する)。また、同時にリクエストが発行された場合の優先度も決めることができる。

周辺IFを使用する場合の設定内容を以下に示します。

引数詳細		説明		
---+------------------+-------------------------------------------------------------
⑦	t_func		どのブロックで転送リクエストを発行するか、
			およびどのブロック間で転送するかを設定
			設定値	転送元	転送先	転送リクエスト発行ブロック
		       +------+--------+-------+------------------------------------
			0x0	メモリ	メモリ	DMAC
			0x1	メモリ	周辺IF	DMAC
			0x2	周辺IF	メモリ	DMAC
			0x3	周辺IF	周辺IF	DMAC
			0x4	周辺IF	メモリ	転送元周辺IF
			0x5	周辺IF	周辺IF	転送元周辺IF
			0x6	メモリ	周辺IF	転送先周辺IF
			0x7	周辺IF	周辺IF	転送先周辺IF

⑧	hs_dst_sel	転送先の転送開始方法の設定
			転送先リクエスト発行がDMACの時0x1、周辺IFのとき0x0を設定
			(t_funcの設定値が0x6~0x7の時は0x0を設定、それ以外では0x1を設定)
⑨	hs_src_sel	転送元の転送開始方法の設定
			転送元リクエスト発行がDMACの時0x1、周辺IFのとき0x0を設定
			(t_funcの設定値が0x4~0x5の時は0x0を設定、それ以外では0x1を設定)
⑫	src_peri	転送リクエストを発行する転送元周辺IFを選択する。
			⑦t_funcの設定値が0x4または0x5でない場合は0x0を設定すること

			値	DMAC#
		       +------+--------+--------------------------------------------
			0x0	DMAC0	SPIM0のRX信号 (SPIM0_DMAC0_RX_REQ_P, SPIM0_DMAC0_RX_SINGLE_P)
				DMAC1	UART0のRX信号 (UART0_DMAC1_RX_REQ_P, UART0_DMAC1_RX_SINGLE_P)
			0x1	DMAC0	SPIM1のRX信号 (SPIM1_DMAC0_RX_REQ_P, SPIM1_DMAC0_RX_SINGLE_P)	
				DMAC1	UART1のRX信号 (UART1_DMAC1_RX_REQ_P, UART1_DMAC1_RX_SINGLE_P)
			0x2	DMAC0	SPISのRX信号  (SPIS0_DMAC0_RX_REQ_P, SPIS0_DMAC0_RX_SINGLE_P)
				DMAC1	UART2のRX信号 (UART2_DMAC1_RX_REQ_P, UART2_DMAC1_RX_SINGLE_P)
			0x3	DMAC0	QSPI0のRX信号 (QSPI0_DMAC0_RX_REQ_P, QSPI0_DMAC0_RX_SINGLE_P)
				DMAC1	UART0のTX信号 (UART0_DMAC1_TX_REQ_P, UART0_DMAC1_TX_SINGLE_P)
			0x4	DMAC0	QSPI1のRX信号 (QSPI1_DMAC0_RX_REQ_P, QSPI1_DMAC0_RX_SINGLE_P)
				DMAC1	UART1のTX信号 (UART1_DMAC1_TX_REQ_P, UART1_DMAC1_TX_SINGLE_P)
			0x5	DMAC0	SPIM0のTX信号 (SPIM0_DMAC0_TX_REQ_P, SPIM0_DMAC0_TX_SINGLE_P)
				DMAC1	UART2のTX信号 (UART2_DMAC1_TX_REQ_P, UART2_DMAC1_TX_SINGLE_P)
			0x6	DMAC0	SPIM1のTX信号 (SPIM1_DMAC0_TX_REQ_P, SPIM1_DMAC0_TX_SINGLE_P)
				DMAC1	設定禁止
			0x7	DMAC0	SPISのTX信号 (SPIS0_DMAC0_TX_REQ_P, SPIS0_DMAC0_TX_SINGLE_P)
				DMAC1	設定禁止
			0x8	DMAC0	QSPI0のTX信号 (QSPI0_DMAC0_TX_REQ_P, QSPI0_DMAC0_TX_SINGLE_P)
				DMAC1	設定禁止
			0x9	DMAC0	QSPI1のTX信号 (QSPI1_DMAC0_TX_REQ_P, QSPI1_DMAC0_TX_SINGLE_P)	
				DMAC1	設定禁止

⑬	dst_peri	転送リクエストを発行する転送先周辺IFを選択する。
			⑦t_funcの設定値が0x6または0x7でない場合は0x0を設定すること
			設定値は⑫と同様(⑫の表を参照)。

⑭	ch_set		使用するCHを設定
			0x1~0x8までの8CHが使用可能0x1~0x4までの4CHが使用可能
			2つ以上の周辺IFからのリクエストを待ちたい場合、別々のCHにリクエストを割り当てることで同時にリクエストを待つことが可能。

⑮	ch_prior	使用するCHの優先度設定
			0x0~0x7まで設定可能であり、0x7が最優先。
			複数のCHで同時にリクエストが発行された場合、優先度設定に従って転送順序が決定される。

⑯	src_msize	転送元のバーストトランザクションの長さ。
			DMA転送対象がUARTではない場合は0x0を設定すること。
			UARTの場合は空きFIFO数に合わせて設定必要。

			値	バーストトランザクションの長さ
		       +------+-----------------------------------------------------
			0x0	1
			0x1	4
			0x2	8
			0x3	16
			0x4	32
			0x5	64
			0x6	128
			0x7	256
			0x8	512
			0x9	1024

⑰	dst_msize	転送先のバーストトランザクションの長さ。
			DMA転送対象がUARTではない場合は0x0を設定すること。
			UARTの場合は空きFIFO数に合わせて設定必要。
			設定値は⑯と同様(⑯の表を参照)。

6.7 設定例

(a)DRAM(0x00_0000_1000)からDRAM(0x04_0000_2000)へ128byte分のデータをDMAC0のMaster0portを使用し、DMA転送する場合

(b)DRAM(0x00_0000_1000)からSPIM0(0x00_FD20_0060)へSPIM0からの送信リクエストを受けてから32byte分のデータをDMAC0のMaster0portを使用し、DMA転送する場合

7. PCIE検証環境

7.1 概要

PCIEの対向モデルを使用した検証を行うことができます。
AiTwoPFにはPCIE0、PCIE1の2つを搭載しており、それぞれ下記のように使い分けます。
PCIE0(EP)動作とPCIE1(EP)動作で、必要な設定方法が異なりますのでそれぞれについて説明します。

7.2 環境設定

7.2.1. サンプル環境

以下のサンプル環境(テストケース)を用意しています。

・base_pcie_000		:PCIE0をEP、対向モデルをRCとして起動する環境
・base_pcie_001		:PCIE1をRC、対向モデルをEPとして起動する環境
・base_pcie_002		:PCIE0をEP、PCIE1をRCとして起動し、対向モデルをそれぞれRC、EPとして起動する環境
・base_pcie_003		:PCIE0をEP、対向モデルをRCとして起動し、hostからデータ転送(loader/dumper)を行う環境
・base_pcie_004		:base_pcie_000ベースでBAR設定を変更しながらアクセス先を変える環境
・base_pcie_005		:PCIE0で発行したMSI割り込みを、対向モデルで受信する環境
・base_pcie_006		:PCIE0をEP、対向モデルをRCとして起動し、PCIE0のeDMACでデータ転送を行う環境
・base_pcie_007		:PCIE0で発行したMSIX割り込みを、対向モデルで受信する環境

上記環境と、PCIE0(Endpoint動作、7.3参照)、PCIE1(RootComplex動作、 7.4参照)の説明を参照の上、テストケースを作成してください。

7.2.2. 実行方法

PCIEの検証を行うためには、対向モデルを有効にする必要があります。
対向モデルを有効にするためには、AiTwoSoCPF/sim/1chip/pat/テストケース名/go_sim.csh 中に”-use_pcie”のオプションを追加してください。

AiTwoSoCPF/sim/1chip/zsim_dmac001 $ vi go_sim.csh

  1 #! /bin/csh -f
  2 
  3 ../../env/bin/go_sim.csh    \
  4     -licq               \
  5     -use_pcie       \
  6     $*              \
  7 #                   \

注意).PCIEのパターンを実行する場合は、上記の編集を行う前に、下記のように
-configureを引数として一度実行する必要があります。

AiTwoSoCPF/sim/1chip/zsim_dmac001 $ ./go_sim.csh -t pcie001 -configure		<==最初は-configureが必要
AiTwoSoCPF/sim/1chip/zsim_dmac001 $ ./go_sim.csh -t pcie001 			<==2回目以降

7.3 PCIE0 Endpoint

7.3.1. 概要

AiTwo PFのPCIE0をEPとして起動し、対向モデルをRCとして起動します。
対向モデルをRCとして起動する設定は、モデル内にあるCPUから行います。
AiTwo PF内のCPUのプログラムcpu.cに相当するものとして、対向モデル側のCPUのプログラムhost/cpu.cを準備必要です。詳細は、サンプル環境「base_pcie_000」を参考にしてください。

7.3.2. 環境設定

7.2の記載内容を参照ください。

7.3.3. 対向モデル内のInterConnect メモリマップ

PCIE対向モデル内のInterConnectのメモリ空間は32bitで構成されています。
メモリマップは下記のように設定しています。
なお、下表の(1)AiTwoPFメモリ空間のうち、実際にアクセスできる領域はBAR設定に依存します。BAR設定の説明については、「7.3.6 BAR(Base Address Register)の切り替えについて」を参照してください。

7.3.4. 対向モデル側のCPUプログラムについて

サンプル環境のhost/cpu.cには下記のように関数が記載されています。
対向PCIEモデルの初期化処理は別途準備されており、初期化処理が完了した後、user_mainの内容が実行開始されます。

AiTwoSoCPF/sim/1chip/pat/base_pcie_000 $ vi host/cpu.c

 1 #include "cpu.h"
  2 
  3 int base_pcie_000_user_main(void)
  4 {
  5   unsigned int reg_rdata;
  6 
  7   //----------------------------------------------------------------------------
  8   // user program(example. please modify this code for your test)
  9   //----------------------------------------------------------------------------
 10   REGW(4, 0x01234567);
 11   REGR(4, reg_rdata);
 12 
 13   if(reg_rdata==0x01234567){
 14     debug_printf("HOST PCIe0(RC) - AiTwo PCIE0(EP) linkup O.K. .\n");
 15 
 16   }else{
 17     debug_printf("HOST PCIe0(RC) - AiTwo PCIE0(EP) linkup N.G. .\n");
 18 
 19   }
 20   //REGW(AiOne_PCIE1CFG_BASE_ADDRESS + 0x200F60 , 0x00000000); // 終了判定に使用
 21   REGW(0xFFF20F60 , 0x00000000); // 終了判定に使用
 22 
 23   //----------------------------------------------------------------------------
 24   // finish program
 25   //----------------------------------------------------------------------------
 26   return(1);
 27 
 28 }
7.3.5. PCIe対向モデルからのloader/dumper

PCIe対向モデルからAiTwoのDRAMに初期データをロードしたり、AiTwoのDRAMのデータをファイルダンプしたりすることができます。

基本的な使用方法は、「5.10DRAMデータ Loader/Dumper」と同様ですが、下記の点が異なります。
・本関数はhost/cpu.cに記載して使用します。(5.10節はarc/cpu.cに記載しています)
・data_load/data_dump関数の引数が一つ少なくなります(PCIE0/PCIE1の選択オプションが不要となります)
・DRAMの不定データをdata_dumpすると、PCIe通信でハングする制限があります。
・5.10節にあった16Byteアラインの制限は不要となります。

使用方法はbase_pcie_003を参考にしてください。

7.3.5.1. data_load

テキストファイルからデータをロードし、PCIe対向モデルからAiTwoのPCIE0を経由してDRAMへデータをロードします。
本関数はデータロード処理が完了するまでは次の処理に移りません。
処理時間はロードするデータサイズに依存します。
下記記呼び出しで、”pat/<テストケース名>/dat0″ の内容を、DRAMのアドレス0番地から0x10Byte分だけ、対向PCIeモデルからPCIE0経由でロードします。
記述例)

AiTwoSoCPF/sim/1chip/pat/base_pcie_003 $ less -N host/cpu.c
#include "cpu.h" 

int base_pcie_003_user_main(void)
{
  int   i, j;
  unsigned int reg_rdata;

  //----------------------------------------------------------------------------
  // user program(example. please modify this code for your test)
  //----------------------------------------------------------------------------
  debug_printf("HOST PCIe0(RC) - AiTwo PCIE0(EP) linkup O.K. .\n");

  data_load("ID00",0x01000000,0x1000);//data load
  data_load("ID01",0x02000000,0x1000);//data load
  data_dump("OD00",0x01000000,0x1000);//data dump
  data_dump("OD01",0x02000000,0x1000);//data dump
引数詳細		説明		
-------------+----------------------------------------------------------------------
第一引数		ファイル名の接頭語を指定します。
		指定できる文字数は4文字限定です。
		別途 "pat/<テストケース名>/<本ファイル名>" でロードするデータを用意してください。
		データのフォーマットについては後述します

第二引数		ロード開始アドレスを指定します

第三引数		ロードするサイズを指定します。

7.3.5.2. data_dump

AiTwoのDRAMからPCIE0、対向PCIeモデルを経由したのち、テキストファイルへデータをダンプします。
本関数はデータダンプ処理が完了するまでは次の処理に移りません。
処理時間はダンプするデータサイズに依存します。
下記呼び出しで、ファイル “zsim_(環境名) /dump_000” に、DRAMのアドレス0番地から0x10Byte分だけ、PCIE0経由でダンプします。
※赤字部分は、第一引数に同じ値を指定し本関数を複数回呼び出した場合は_000 -> _001 –> 002の様に自動的にincrementされた値に置き換わります

記述例)

AiTwoSoCPF/sim/1chip/pat/base_pcie_003 $ less -N host/cpu.c
#include "cpu.h" 

int base_pcie_003_user_main(void)
{
  int   i, j;
  unsigned int reg_rdata;

  //----------------------------------------------------------------------------
  // user program(example. please modify this code for your test)
  //----------------------------------------------------------------------------
  debug_printf("HOST PCIe0(RC) - AiTwo PCIE0(EP) linkup O.K. .\n");

  data_load("ID00",0x01000000,0x1000);//data load
  data_load("ID01",0x02000000,0x1000);//data load
  data_dump("OD00",0x01000000,0x1000);//data dump
  data_dump("OD01",0x02000000,0x1000);//data dump

引数詳細		説明		
-------------+----------------------------------------------------------------------
第一引数		ファイル名の接頭語を指定します。
		指定できる文字数は4文字限定です。

第二引数		ダンプ開始アドレスを指定します。

第三引数		ダンプするサイズを指定します。

7.3.5.3. データフォーマット

Loader/Dumperのデータフォーマットは5.10.3と同一です。

7.3.5.4. data_load/data_dump制限事項

・data_dumpするDRAM領域に不定データが存在する場合、PCIe通信でハングすることがわかっています。data_dumpのアドレスとサイズは、不定データが存在しない領域を指定するように注意してください。(参考:起動直後のDRAM領域はすべて不定データとなっていますが、一度でもデータライトした領域は不定が解消されています)

7.3.6. BAR(Base Address Register)の切り替えについて

7.3.3で示したメモリ空間のうち、PCIE対向モデルから実際にアクセスできるのは一部分に限定され、対象空間はBAR(Base Address Resister)の設定に依存します。
デフォルトのBAR設定は下表のようになっており、各開始アドレス~終了アドレスの空間のみアクセスすることができます。
※BAR3の空間にはSYSCのレジスタが含まれており、検証環境でのハード・ソフト連携に使用するため、本検証環境ではアドレス設定を変更しないでください(実機評価では変更可能です)。
※BAR4,5の空間にはPCIEブロックのUNROLLレジスタが配置されているため、アドレス設定を変更しないでください。

デフォルト設定では範囲外となっているメモリ空間にアクセスする場合には、BARの設定変更が必要となります。検証シナリオに必要なアドレスに合わせて、BAR0, BAR2の設定値を変更して使用してください。

7.3.6.1. BAR0,2の設定変更方法

BAR0,2の設定を変更するための関数(pcie_rc_ep_bar02_cng)を用意しました。検証内容に応じて、アクセスしたい領域に合わせたBAR0,2のアドレスを設定してください。
参考パターンとして、動作途中でBARの設定を変更するパターンbase_pcie_004を用意しましたので、参考にしてください。

AiTwoSoCPF/sim/1chip/pat/base_pcie_004 $ vi host/cpu.c

 12   //----------------------------------------------------------------------------
 13   // user program(example. please modify this code for your test)
 14   //----------------------------------------------------------------------------
 15   debug_printf("HOST PCIe0(RC) - AiTwo PCIE0(EP) linkup O.K. .\n");
 16 
 17   // BAR address change
 18   bar0_l = 0x00000000;
 19   bar0_u = 0x00000000;
 20   bar2   = 0x40000000;
 21   pcie_rc_ep_bar02_cng(bar0_l, bar0_u, bar2);
 22 
 23   REGW(4, 0x01234567);
 24   REGR(4, reg_rdata);

引数		説明
-------------+----------------------------------------------------------------------
bar0_l		BAR0[31:0]の設定([26:0]は0固定としてください)
bar0_u		BAR0[63:32]の設定
bar2		BAR2[31:0]の設定([21:0] は0固定としてください)

7.4 PCIE1 RootComplex

7.4.1. 概要

AiTwo PFのPCIE1をRCとして起動し、対向モデルをEPとして起動します。
PCIE1初期化関数、eDMAC転送処理関数(Write用/Read用)を準備しています。AiTwo PF内のCPUのプログラムarc/cpu.cから呼び出すことでPCIE1(RC)機能を使用可能となります。

7.4.2. 環境設定

7.2の記載内容を参照ください。

7.4.3. PCIE初期化関数(pcie1_init)

cpu.cのチップのリセット解除後、pcie1_init();を実行することで、PCIE1の初期化処理が実行されます。DMA転送処理を実行する前に初期化処理を実行しておく必要があります。

7.4.4. Write eDMAC処理

AiTwoPF→対向モデルメモリの転送を行う場合、Write eDMAC処理を使用します。
PCIEには、Write eDMACが2チャンネル実装されており、おのおの独立して使用できます。
Write eDMACを使用するためには、設定・起動・終了確認 の手順が必要となります。

7.4.4.1. Write eDMAC設定(pcie_wr_dma_set)

pcie_wr_dma_set関数を使用することで、Write処理に必要な設定が行われます。
※現環境では、EPの送り先として0x00000000~0x1FFFFFFF の512Mbyteが使用可能です。
ただし、実際にアクセスできる領域はBAR設定に依存します。BAR設定の説明については、7.4.7を参照してください

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi arc/cpu.c

 28   // dma setting
 29   /** pcie_wr_dma_set / pcie_rd_dma *************************************************************************
 30    **   cnt            : Controller Select                :: 0=cnt0, 1=cnt1, 2=cnt2
 31    **   ch             : Channel Select                   :: 0=ch0, 1=ch1, 2=ch2, 3=ch3
 32    **   Done_IMWr_Adr  : IMWr Address when DMA Done       :: low:lower 32bit address, up:upper 32bit address
 33    **   Abort_IMWr_Adr : IMWr Address when DMA Abort      :: low:lower 32bit address, up:upper 32bit address
 34    **   IMWr_Data      : IMWr Data                        ::
 35    **   weight         : Channel Weight                   ::
 36    **   Size           : Transfer Size                    ::
 37    **   SrcAdr         : Source Address                   :: low:lower 32bit address, up:upper 32bit address
 38    **   DstAdr         : Destination Address              :: low:lower 32bit address, up:upper 32bit address
 39    **   LLP            : Link List Pointer                :: low:lower 32bit address, up:upper 32bit address
 40    **   LLE            : Link List Enable                 :: 0=Disable, 1=Enable
 41    **   CCS            : Consumer Cycle State             ::
 42    **********************************************************************************************************/
 43   //              cnt, ch, Done_IMWr_Adr(low, up), Abort_IMWr_Adr(low, up), IMWr_Data, weight, Size,  SrcAdr(low, up),        DstAdr(low, up),        LLP(low,up),                LLE, CCS)
 44   pcie_wr_dma_set(1,   0,  0xE0000000, 0x00000000, 0xE0000004, 0x00000000,  0x0001,    0x2,    0x400, 0x00000000, 0x00000000, 0x18000800, 0x00000000, 0x00000000, 0x00000    000, 0,   0);

引数		説明
-------------+----------------------------------------------------------------------
cnt		コントローラの選択(0:PCIE0, 1:PCIE1)
		RC動作の場合1で使用
ch		eDMACチャンネル番号設定(0 or 1)
Done_IMWr_Adr
(3:low, 4:up)	変更禁止(0xE0000000, 0x00000000固定)
	
Abort_IMWr_Adr
(5:low, 6:up)	変更禁止(xE0000004, 0x00000000固定)
	
IMWr_Data	未使用機能(適当な値を設定)

weight		変更禁止(0x2固定)

Size		データ転送サイズ

SrcAdr
(10:low, 11:up)	AiTwoPF側の転送元開始アドレスの下位32bit(low)、上位32bit(up)を設定
		※up側は0設定とすること
	
DstAdr
(12:low, 13:up)	対向モデル側の転送先開始アドレス下位32bit(low)、上位32bit(up)を設定
		※up側は0設定とすること
	
LLP
(14:low,15:up)	変更禁止(0x00000000, 0x00000000固定)
	
LLE		変更禁止(0固定)

CCS		変更禁止(0固定)
7.4.4.2. Write eDMAC起動(pcie_wr_dma_start)

pcie_wr_dma_start関数を使用することで、「7.4.4.1Write eDMAC設定」の内容でDMA転送を開始します。

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi arc/cpu.c

 67   // dma write
 68   for (i=0; i<2; i++) {
 69     if(i==0){
 70       bar0_l=0x18000000;
 71       bar0_u=0x00000000;
 72       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 73     }else if(i==1){
 74       bar0_l=0x00000000;
 75       bar0_u=0x00000000;
 76       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 77     }
 78     pcie_wr_dma_start( 1, i );
 79     pcie_wr_dma_done ( 1, i, 2 );
 80     for(j=0; j<2; j++) { asm("   nop"); }
 81   }
 82 

引数		説明
-------------+----------------------------------------------------------------------
cnt		コントローラの選択(0:PCIE0, 1:PCIE1)
		※1設定で使用すること

ch		eDMACチャンネル番号設定(0 or 1)
		※pcie_wr_dma_setで指定した番号

7.4.4.3. Write eDMAC終了確認(pcie_wr_dma_done)

pcie_wr_dma_done関数を使用することで、指定したチャンネルのDMAが終了するまでポーリングを行います。

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi arc/cpu.c

 67   // dma write
 68   for (i=0; i<2; i++) {
 69     if(i==0){
 70       bar0_l=0x18000000;
 71       bar0_u=0x00000000;
 72       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 73     }else if(i==1){
 74       bar0_l=0x00000000;
 75       bar0_u=0x00000000;
 76       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 77     }
 78     pcie_wr_dma_start( 1, i );
 79     pcie_wr_dma_done ( 1, i, 2 );
 80     for(j=0; j<2; j++) { asm("   nop"); }
 81   }
 82 

引数		説明
-------------+----------------------------------------------------------------------
cnt		コントローラの選択(0:PCIE0, 1:PCIE1)
		※1設定で使用すること

ch		eDMACチャンネル番号設定(0 or 1)
		※pcie_wr_dma_setで指定した番号

done_type	変更禁止(2固定)

7.4.5. Read eDMAC処理

対向モデルメモリ→AiTwoPFの転送を行う場合、Read eDMAC処理を使用します。
PCIEには、Read eDMACが2チャンネル実装されており、おのおの独立して使用できます。
Read eDMACを使用するためには、設定・起動・終了 の手順が必要となります。

7.4.5.1. Read eDMAC設定(pcie_rd_dma_set)

pcie_rd_dma_set関数を使用することで、Read処理に必要な設定が行われます。
※現環境では、EPの送り先として0x00000000~0x1FFFFFFF の512Mbyteが使用可能です。ただし、実際にアクセスできる領域はBAR設定に依存します。BAR設定の説明については、7.4.7を参照してください

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi arc/cpu.c

  /** pcie_wr_dma_set / pcie_rd_dma *************************************************************************
   **   cnt            : Controller Select                :: 0=cnt0, 1=cnt1, 2=cnt2
   **   ch             : Channel Select                   :: 0=ch0, 1=ch1, 2=ch2, 3=ch3
   **   Done_IMWr_Adr  : IMWr Address when DMA Done       :: low:lower 32bit address, up:upper 32bit address
   **   Abort_IMWr_Adr : IMWr Address when DMA Abort      :: low:lower 32bit address, up:upper 32bit address
   **   IMWr_Data      : IMWr Data                        ::
   **   weight         : Channel Weight                   ::
   **   Size           : Transfer Size                    ::
   **   SrcAdr         : Source Address                   :: low:lower 32bit address, up:upper 32bit address
   **   DstAdr         : Destination Address              :: low:lower 32bit address, up:upper 32bit address
   **   LLP            : Link List Pointer                :: low:lower 32bit address, up:upper 32bit address
   **   LLE            : Link List Enable                 :: 0=Disable, 1=Enable
   **   CCS            : Consumer Cycle State             ::
   **********************************************************************************************************/
  //              cnt, ch, Done_IMWr_Adr(low, up), Abort_IMWr_Adr(low, up), IMWr_Data, weight, Size,  SrcAdr(low, up),        DstAdr(low, up),        LLP(low,up),            LLE, CCS)
  pcie_wr_dma_set(1,   0,  0xE0000000, 0x00000000, 0xE0000004, 0x00000000,  0x0001,    0x2,    0x400, 0x00000000, 0x00000000, 0x18000800, 0x00000000, 0x00000000, 0x00000000, 0,   0);
  pcie_wr_dma_set(1,   1,  0xE0000000, 0x00000000, 0xE0000004, 0x00000000,  0x0002,    0x2,    0x400, 0x00000400, 0x00000000, 0x00000c00, 0x00000000, 0x00000000, 0x00000000, 0,   0);

  pcie_rd_dma_set(1,   0,  0xE0000000, 0x00000000, 0xE0000004, 0x00000000,  0x0010,    0x2,    0x400, 0x10000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0,   0);
  pcie_rd_dma_set(1,   1,  0xE0000000, 0x00000000, 0xE0000004, 0x00000000,  0x0020,    0x2,    0x400, 0x08000400, 0x00000000, 0x00000400, 0x00000000, 0x00000000, 0x00000000, 0,   0);

引数		説明
-------------+----------------------------------------------------------------------
cnt		コントローラの選択(0:PCIE0, 1:PCIE1)
		RC動作の場合1で使用
ch		eDMACチャンネル番号設定(0 or 1)
Done_IMWr_Adr
(3:low, 4:up)	変更禁止(0xE0000000, 0x00000000固定)
	
Abort_IMWr_Adr
(5:low, 6:up)	変更禁止(xE0000004, 0x00000000固定)
	
IMWr_Data	未使用機能(適当な値を設定)

weight		変更禁止(0x2固定)
Size		データ転送サイズ

SrcAdr
(10:low, 11:up)	対向モデル側の転送元開始アドレス下位32bit(low)、上位32bit(up)を設定
		※up側は0設定とすること
	
DstAdr
(12:low, 14:up)	AiTwoPF側の転送先開始アドレスの下位32bit(low)、上位32bit(up)を設定
		※up側は0設定とすること
	
LLP
(14:low, 15:up)	変更禁止(0x00000000, 0x00000000固定)
	
LLE	変更禁止(0固定)

CCS	変更禁止(0固定)

7.4.5.2. Read eDMAC起動(pcie_rd_dma_start)

pcie_rd_dma_start関数を使用することで、「7.4.5.1Read eDMAC設定」の内容でDMA転送を開始します。

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi arc/cpu.c

 51   // dma read
 52   for (i=0; i<2; i++) {
 53     if(i==0){
 54       bar0_l=0x10000000;
 55       bar0_u=0x00000000;
 56       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 57     }else if(i==1){
 58       bar0_l=0x08000000;
 59       bar0_u=0x00000000;
 60       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 61     }
 62     pcie_rd_dma_start( 1, i );
 63     pcie_rd_dma_done ( 1, i, 2 );
 64     for(j=0; j<2; j++) { asm("   nop"); }
 65   }

引数		説明
-------------+----------------------------------------------------------------------
cnt		コントローラの選択(0:PCIE0, 1:PCIE1)
		※1設定で使用すること

ch		eDMACチャンネル番号設定(0 or 1)
		※pcie_wr_dma_setで指定した番号

7.4.5.3. Read eDMAC終了確認(pcie_rd_dma_done)

pcie_rd_dma_done関数を使用することで、指定したチャンネルのDMAが終了するまでポーリングを行います。

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi arc/cpu.c

 51   // dma read
 52   for (i=0; i<2; i++) {
 53     if(i==0){
 54       bar0_l=0x10000000;
 55       bar0_u=0x00000000;
 56       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 57     }else if(i==1){
 58       bar0_l=0x08000000;
 59       bar0_u=0x00000000;
 60       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 61     }
 62     pcie_rd_dma_start( 1, i );
 63     pcie_rd_dma_done ( 1, i, 2 );
 64     for(j=0; j<2; j++) { asm("   nop"); }
 65   }

引数		説明
-------------+----------------------------------------------------------------------
cnt		コントローラの選択(0:PCIE0, 1:PCIE1)
		※1設定で使用すること

ch		eDMACチャンネル番号設定(0 or 1)
		※pcie_rd_dma_setで指定した番号

done_type	変更禁止(2固定)

7.4.6. 対向モデル内のメモリデータLoader/Dumper

PCIE対向モデル内のメモリ(Simtop.pcie_model.AXI_SLV_1D)に対して、データをロード・ダンプするVerilogタスクを用意しています。main_scenario.vから呼び出して使用してください(base_pcie_001のmain_scenario.vにもサンプル記述があります)。

7.4.6.1. 対向メモリデータのLoad

Dumpを行いたいタイミングでSimtop.pcie_model.AXI_SLV_1D.load を実行してください。

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi main_scenario.v

 89 //------------------------------------------------------------------------------
 90 // testcase main task
 91 //------------------------------------------------------------------------------
 92     task    testcase_main();
 93         // ここがテスト本体
 94         // CPUのプログラム以外の制御はここに記載
 95         // 外部端子制御もココ
 96 
 97         `PCIEMODEL.AXI_SLV_1D.load( "./pat/indat0000.hex", 64'h10000000, 64'd1024, 1);
 98         `PCIEMODEL.AXI_SLV_1D.load( "./pat/indat0001.hex", 64'h08000400, 64'd1024, 1);

引数		説明
-------------+----------------------------------------------------------------------
1		入力ファイル名
2		入力開始アドレス
3		データサイズ
4		書式設定(1:16進数記述、0:10進数記述)

7.4.6.2. 対向メモリデータのDump

Dumpを行いたいタイミングでSimtop.pcie_model.AXI_SLV_1D.dump を実行してください。

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi main_scenario.v

106         /* PCIe Linkup */
107         /** pcie_link_up
108          * ****************************************************************************
109          **   cnt          : Controller Enable :: 0=Disable, 1=Enable
110          **                     [3:0]:cnt0, [7:4]:cnt1, [11:8]=cnt2
111          **   slv_sel      : Slave Select      :: 0=cnt0, 1=cnt1, 2=cnt2
112          **                     [ 1: 0]:IMG0(WK1),    [ 5: 4]:IMG0(RK1),
113          **                     [ 9: 8]:IMG1(WK2),    [13:12]:IMG1(RK2),
114          **                     [17:16]:IMG2(PMT-WR), [21:20]:IMG2(PMT-RD),
115          **                     [29:28]:POS(PRK1)
116          **   sris_mode    : SRIS Mode Enable  :: 0=Disable, 1=Enable
117          **                     [3:0]:cnt0, [7:4]:cnt1, [11:8]:cnt2
118          **   link_speed   : Link Speed        :: 1=Gen1(2.5GT/s), 2=Gen2(5.0GT/s), 3=Gen3(8.0GT/s)
119          **                     [3:0]:cnt0, [7:4]:cnt1, [11:8]:cnt2
120          **   link_num     : Link Width Number :: 0=none, 1=x1, 2=x2, 4=x4
121          **                     [3:0]:cnt0, [7:4]:cnt1, [11:8]:cnt2
122          **   dev_type     : Device Type       :: 0=End Point, 4=Root Complex
123          *******************************************************************************************/
124         //            cnt,   slv_sel,    sris_mode, link_speed, link_num, dev_type
125         pcie_link_up( 32'h010, 32'h00000000, 32'h000,     32'h033,      32'h044,   32'd0 );
126         //S_PFC_PCIE1_LTSSMEN_P = 1'b1;
127 
128         @(posedge (`PCIE.PCIE0.u_pcie_user_top.diag_sts_bus28_reg_dec &
129                `PCIE.PCIE0.u_pcie_user_top.lbc_ext_cs));  // プログラムの終了判定に使用
130 
131         `PCIEMODEL.AXI_SLV_1D.dump( "outdat0000.hex", 64'h18000800, 64'd1024, 1);
132         `PCIEMODEL.AXI_SLV_1D.dump( "outdat0001.hex", 64'h00000C00, 64'd1024, 1);

引数		説明
-------------+----------------------------------------------------------------------
1		出力ファイル名
2		出力開始アドレス
3		データサイズ
4		書式設定(1:16進数記述、0:10進数記述)

7.4.7. BAR(Base Address Register)の切り替えについて

7.4.4および7.4.5でEPの対向メモリとして0x00000000~0x1FFFFFFF の512Mbyteが使用可能と記載しましたが、実際にアクセスできるのは一部分に限定され、対象空間はBAR(Base Address Resister)の設定に依存します。
デフォルトのBAR設定は下表のようになっており、各開始アドレス~終了アドレスの空間のみアクセスすることができます。
※BAR4,5の空間にはPCIEブロックのUNROLLレジスタが配置されているため、アドレス設定を変更しないでください。

デフォルト設定では範囲外となっているメモリ空間にアクセスする場合には、BARの設定変更が必要となります。検証シナリオに必要なアドレスに合わせて、BAR0の設定値を変更して使用してください。
※本来はBAR2,3も変更可能ですが、本検証環境ではBAR0だけ変更できるように環境を準備しています。

7.4.7.1. BAR0の設定変更方法

BAR0の設定を変更するための関数(pcie_rc_ep_bar0_cng)を用意しました。検証内容に応じて、アクセスしたい領域に合わせたBAR0のアドレスを設定してください。
参考パターンとして、base_pcie_001を動作途中でBARの設定を変更するパターンに変更しましたので、参考にしてください。

AiTwoSoCPF/sim/1chip/pat/base_pcie_001 $ vi arc/cpu.c

 51   // dma read
 52   for (i=0; i<2; i++) {
 53     if(i==0){
 54       bar0_l=0x10000000;
 55       bar0_u=0x00000000;
 56       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 57     }else if(i==1){
 58       bar0_l=0x08000000;
 59       bar0_u=0x00000000;
 60       pcie_rc_ep_bar0_cng(bar0_l, bar0_u);
 61     }
 62     pcie_rd_dma_start( 1, i );
 63     pcie_rd_dma_done ( 1, i, 2 );
 64     for(j=0; j<2; j++) { asm("   nop"); }
 65   }

引数		説明
-------------+----------------------------------------------------------------------
bar0_l		BAR0[31:0]の設定([26:0]は0固定としてください)

bar0_u		BAR0[63:32]の設定

8. CMEM検証環境

8.1 概要

NOC経由でアクセス可能な汎用メモリ(Common-MEMory)を搭載しています。
本メモリはSRAMで構成しているため、一時的なデータ保管領域としてのみ、使用することができます。

※ RTL Power ONでは使用できません。CMEM領域にはアクセスしないでください。 (アドレス:H’00_80000000~H’00_83FFFFFF)

9. MetaWare RASCALデバック

2021.11.17 機能9.MetaWare RASCALデバックは本バージョンでは未サポートです。
MetaWareデバッガとRASCALよるデバッグ
ARC専用デバッガであるMetaWareデバッガとRASCALと呼ばれるJTAGモデルを使用し、シミュレータと連携させてCプログラムをデバッグすることができます。

9.1 RASCAL設定

rascal.envに記載されているCommand行を以下のように編集してください。Commandに記載されたシミュレーション実行コマンドがMetaWareデバッガ起動時に自動で実行されます。
*pat001 は環境構築時に指定した任意の名前
rascal_ram_map.txtは編集の必要はありません。
*./go_sim.csh の起動オプションと同一にしてください。

デバッカの機能確認用、実行例1のオプションの意味。これを使用すると起動は早いですが、QSPIとMEMCがsimlationモデルとなります。

+not_use_xip_mode	DebuggerによるQSPIアクセスを無視させる
-use_qspi_model		QSPIsimulationモデルを使用する。
-use_memc_model		MEMCsimulationモデルを使用する。

AiTwoSoCPF/sim/1chip/zsim_dmac001 $ vi rascal.env

 13 # This file is read by rascalint.so/.dll and contains the options
 14 # required to launch the required simulator, control the appearance
 15 # and behaviour of that simulator, and control RASCAL's operation.
 16 #
 17 
 18 Simulator = userdefined
 19 Path      = ./
 20 Batch     = on
 21 Start     = stop
 22 Debug     = off
 23 Model     = simtop
 24 User      = user
 25 Command   = ./go_sim.csh -test testcase -rascal					<==修正前
 25 Command   = ./go_sim.csh -test dmac001 -rascal -use_qspi_model -use_memc_model 	<==実行例1
 25 Command   = ./go_sim.csh –test dmac001 -rascal +not_use_xip_mode 			<==修正後例2
 25 Command   = ./go_sim.csh -test testcase -rascal +incdir+aaa +define+EXAMPLE  	<==修正後例3
 26 Libraries =
 27 prop=sim=0
 28 #prop=debug=1

9.2 デバッカ起動方法

9.2.1 MetaWareデバッカを起動する。

以下の様に、go_sim.cshに引数としてテストケース(-testオプション)とMetaWareデバッガ起動オプション(-mdb)を追加します。
※pat001 は環境構築時に指定した任意の名前
下記のコマンド実行後、MetaWareデバッガのGUI起動、シミュレータのコンパイル、シミュレータとMetaWareデバッガのリンクが確立され、最終的にシミュレータ側に制御が戻ります。

AiTwoSoCPF/sim/1chip/zsim_dmac001 $ ./go_sim.csh -test dmac001 -mdb
AiTwoSoCPF/sim/1chip/zsim_dmac001 $ ./go_sim.csh -test dmac001 -mdb use_qspi_model -use_memc_model <==実行例1

以下のように何も表示されていないGUIが立ち上がりますが、この段階では特に問題ありません。

9.2.2 runコマンドを実行

シミュレータ側に制御が戻った後、以下のようにシミュレータのコマンドラインで’run’コマンドを実行してください。JTAGとCPUの通信が開始し、MetaWareデバッガを使用するためのRASCALとCPUの設定が始まります。

Warning simtop.DUT.u_DMAC0.U_ch4_chmem.inst REDENIO change at    0.015[ns].>>
reset assert : ../../env/model/top/common_tasks_inc.v(6)
RASCALINT: ...simulator communications established.
>>>> env: Property setting sim=0 rejected.
>>>> env: It's possible the simulator was not yet operational.
>>>> env: Be sure to put sim=0 after all information necessary to start the simulator.
>>>> env: prop bad keyword line 27...
Memory Usage - Current physical: 9125.3M, Current virtual: 9422.3M
CPU Usage - 1.8s system + 1.2s user = 3.0s total (67.2% cpu)
Simulation stopped via $stop(2) at time 10 NS + 1
/AiTwo/AiIP0X/incoming/user0101/1chipsim/0X/AiTwoSoCPF/sim/env/model/top/jtag_model.v:24     #0                   CLK1GHz = 1'b1;
xcelium> run

RASCALとCPUの設定が完了すると、以下のようにデバッガの画面にソースコードがmain関数でブレークしている状態で表示されます。これ以降、デバッガを使用してCソースをデバッグすることができます。
9.3.以降でMetaWareデバッガの機能の一部について使用例を示します。

9.2.3 FAQ

1) 1chipsim起動コマンドオプションとrascal.envのcommandのオプションは同一にする。

AiTwoSoCPF/sim/1chip/zsim_dmac001 $ ./go_sim.csh -test dmac001 -mdb -use_qspi_model -use_memc_model <==実行例1
AiTwoSoCPF/sim/1chip/zsim_dmac001 $ vi rascal.env

 25 Command   = ./go_sim.csh -test dmac001 -rascal +not_use_xip_mode -use_qspi_model -use_memc_model 	<==実行例1

2)起動が遅い場合は、
以下のオプションを./go_sim.cshとrascal.env commandにつける。
-use_qspi_model -use_memc_model

3)QSPIwriite access error.

*E : QSPI write access detected.(0x840018e4) : ./../../env/model/top/cpu_common_inc.v(170)
       Please check linker command script(pat/link.lcf)

       Please contact to AiOneSoCPF 1chip sim environment designer.
         and set -use_qspi_model to go_sim.csh for provisionally simulation

以下のオプションを./go_sim.cshとrascal.env commandにつける。
+not_use_xip_mod

9.3 デバッカ使用例

9.3.1. ブレークポイントの設定

Cソースのデバッグ時にブレークポイントを設定する場合、GUI上に表示されたCソースの該当する行(ブレークポイントを設定したい行)を右クリックし、「Breakpoint」を選択することで設定できます。※該当する行をダブルクリックするだけでも設定できます。

ブレークポイントを設定後、以下のように該当する行の左側にマークが付与されます。

次にGUIの上部にある「Run」をクリックすることでブレークポイントを設定した個所までプログラムが進んで停止します。

9.3.2. ステップ実行

Cソースデバッグ時にGUI上部の「Src Over」をクリックすることでステップ実行を使用することができます。

ステップ実行完了後、ポインタが次の行に移ります。

9.3.3. レジスタ値のダンプ

memコマンドを使用することでMetaWareデバッガから各ブロックのレジスタ値をダンプすることができます。コマンドはMetaWareデバッガのコマンドライン上で実行します。
※このコマンドはDRAM領域にも使用することができます
コマンド仕様: [radix][format] mem address

/w mem 0xFFFFC000

※指定したアドレスより160byte分のデータをダンプすることができます
[radix][format]については以下より選択できます。

コマンド		説明
-------------+----------------------------------------------------------------------
/b		:byte view
/c		:byte view
/s		:short view
/w		:long view
/I		:int view
/ll		:long long view
/f		:float view
/d		:double view
/ld		:long double view
/ub		:unsigned byte view
/us		:unsigned short view
/ui		:unsigned int view
/ull		:unsigned long long view
/q7		:fixed point byte view
/q15		:fixed point half-word view
/q31		:fixed point word view
/q63		:fixed point double word view

GUI下部にあるコマンドライン上でmemコマンドを実行してください。

memコマンド実行後、GUI上のデバッグコンソールにダンプ結果が表示されます。

9.3.4. レジスタダンプ結果のファイル出力

mem2fileコマンドを使用することで各ブロックのレジスタ値をファイルに保存することができます。コマンドはMetaWareデバッガのコマンドライン上で実行します。
※このコマンドはDRAM領域にも使用することができます
MetaWareデバッガのコマンドライン上でmem2fileコマンド実行後、実行ディレクトリ(AiTwoSoCPF/sim/1chip/zsim_pat001 ※pat001 は環境構築時に指定した任意の名前)にファイルが出力されます。
出力されるファイルはバイナリファイルのため、xxdコマンドなどを使用してHexファイルに変換してください。
コマンド仕様: mem2file address length file_name

mem2file 0xFFFFC000 100 dump.txt

9.3.5. レジスタ値の変更

memsetコマンドを使用することで各ブロックのレジスタの値を変更することができます。コマンドはMetaWareデバッガのコマンドライン上で実行します。
※このコマンドはDRAM領域にも使用することができます
コマンド仕様: memset dest val length

memset 0xFFFFC000 0xFFFFFFFF 4
9.3.6. DRAMへのバイナリファイルのロード

file2memコマンドを使用することでバイナリファイルをDRAM領域にロードすることができます。コマンドはMetaWareデバッガのコマンドライン上で実行します。
コマンド仕様: file2mem address file_name

file2mem 0x00000000 image_data.bin

※デバッガからCPUへのデータ転送速度は遅く、また、シミュレータ上で動作させているため、大容量のファイルを転送するには膨大な時間が必要になります。

9.3.7. その他の機能について

その他の機能を使用したい場合は下記のMetaWareデバッガのマニュアルを参照してください。

マニュアル所在:
/apps/aidl/ip_snps_dsgn/tools/mwdt/MetaWare/arc/docs/pdf/Debugger_Guide.pdf

10. 検証時のノウハウ

10.1. ソフト/ハード連携方法

SYSCのリザーブレジスタを使用して、ソフト処理(cpu.c)とハード処理(main_scenario.v)を連携させることができます。
※下記レジスタは機能割り当てのないリザーブレジスタのため、検証用にテンポラリ使用することができます。

SYSCレジスタ	                 |   RTL信号                      |   初期値
-------------------------------------+-------------------------------------------------
AiOne_SYSC_BASE_ADDRESS + 0x02F8     |   `SYSC_RSV_MODE_02F8[31:0]   |  0xFFFFFFFF
AiOne_SYSC_BASE_ADDRESS + 0x02FC     |   `SYSC_RSV_MODE_02FC[31:0]   |  0xFFFFFFFF
10.1.1. ソフト処理(cpu.c)→ハード処理(main_scenario.v)連携手順

ソフト処理(cpu.c):
 上記SYSCレジスタに適当な値をライトする。
ハード処理(main_scenario.v):
 allways文で対応するRTL信号を監視して、信号値に応じて連携するtaskを実行する。
 (例:信号が0→1変化したら、所望のtaskを実行する、等)

arc/cpu.c記述例

//ソフト処理が終了したらSYSCレジスタに0設定
REGW(AiTwo_SYSC_BASE_ADDRESS + 0x02f8 , 0x00000000);

main_scenario.v記述例

SYSC信号が1設定されたら、次の処理のtaskを実行する
always @(`SYSC_RSV_MODE_02F8[0]) begin
  if (`SYSC_RSV_MODE_02F8[0]==1’b0) begin
    ※所望のtask呼び出し
  end
end

10.1.2. ハード処理(main_scenario.v)→ソフト処理(cpu.c)連携手順

ハード処理(main_scenario.v):
 上記RTL信号に対して、forceで適当な値を上書きする。
ソフト処理(arc/cpu.c):
 対応するレジスタをリードして、所望の処理を行う。
 (例:レジスタをポーリングして、値が変わったら次のステップへ進む、等)

main_scenario.v記述例

:(ここまで一連のハード処理)

//処理終了したらSYSC信号を強制的に上書き
force `SYSC_RSV_MODE_02F8=32’h00000001

arc/cpu.c記述例

//SYSCレジスタの値が上書きされるまでポーリング
rdata=0xFFFFFFFF;
while(rdata!=0x00000001){
REGR(AiTwo_SYSC_BASE_ADDRESS + 0x02f8 , rdata);
}

//次の処理へ

10.2 プログラムカウンタによるデバッグ

CPUの動作をデバッグするためプログラムカウンタ(PC)をモニタしたい場合は以下の信号をご参照ください。
実行環境(zsim_*)のmem_image/arc.dmp(Cプログラムコンパイル後のアセンブラソース)と対応付けて確認することでCPUがどこまで進んでいるかのデバッグが可能です。

		core0			core1
-------------+------------------------+---------------------------------------------
PC		simtop.cpu_core0_pc	simtop.cpu_core1_pc
PC有効信号	simtop.cpu_core0_act	simtop.cpu_core1_pc_act

以下にcpu.dmpファイルの例を示します。
※アセンブラコードを一つずつ解析するのは難しいかもしれませんが、おおよその実行位置(実行中の関数名等)は把握できるのではないかと思います。

11. 現時点での制限事項

・MMUは使用できません。
CPUからアクセスできるDRAM領域は最初の2GBのみとなります。
(アドレス:H'00_00000000~H'00_7FFFFFFF)
・CMEMは使用できませんので、下記CMEM領域へはアクセスしないでください。
(アドレス:H’00_80000000~H’00_83FFFFFF)

付録A. 割り込みハンドラ割り付け表

AiIP用の割込みハンドラでは、ご連絡いただきました割り込み要因を各領域#0から順に配置しています。配置されなかった割り込みはリザーブ扱いとなり、同様に割り込みハンドラもリザーブ扱いとなります。

割り込み
要因番号	割り込み要因概略	割り込みハンドラ名
0	reserved	
1	reserved	
2	reserved	
3	reserved	
4	reserved	
5	reserved	
6	reserved	
7	reserved	
8	reserved	
9	reserved	
10	reserved	
11	reserved	
12	reserved	
13	reserved	
14	reserved	
15	reserved	
16	reserved	
17	reserved	
18	reserved	
19	reserved	
20	reserved	
21	reserved	
22	reserved	
23	reserved	
24	reserved	
25	reserved	
26	reserved	
27	reserved	
28	reserved	
29	reserved	
30	reserved	
31	reserved	
32	AiIP01_B向け割り込み(int_done)	aiip01b_0_handler
33	AiIP01_B向け割り込み(int_err)	aiip01b_1_handler
34	reserved	
35	reserved	
36	reserved	
37	reserved	
38	reserved	
39	reserved	
40	AiIP02向け割り込み		aiip02_0_handler
41	reserved	
42	reserved	
43	reserved	
44	reserved	
45	reserved	
46	reserved	
47	reserved	
48	reserved	
49	reserved	
50	reserved	
51	reserved	
52	reserved	
53	reserved	
54	reserved	
55	reserved	
56	AiIP01_A向け割り込み	aiip01a_0_handler
57	AiIP01_A向け割り込み	aiip01a_1_handler
58	AiIP01_A向け割り込み	aiip01a_2_handler
59	AiIP01_A向け割り込み	aiip01a_3_handler
60	AiIP01_A向け割り込み	aiip01a_4_handler
61	AiIP01_A向け割り込み	aiip01a_5_handler
62	AiIP01_A向け割り込み	aiip01a_6_handler
63	AiIP01_A向け割り込み	aiip01a_7_handler
64	reserved	
65	reserved	
66	reserved	
67	reserved	
68	reserved	
69	reserved	
70	reserved	
71	reserved	
72	reserved	
73	reserved	
74	reserved	
75	reserved	
76	reserved	
77	reserved	
78	reserved	
79	reserved	
80	reserved	
81	reserved	
82	reserved	
83	reserved	
84	reserved	
85	reserved	
86	reserved	
87	reserved	
88	reserved	
89	reserved	
90	reserved	
91	reserved	
92	reserved	
93	reserved	
94	reserved	 
95	reserved	 
96	AiIP01_A向け割り込み	aiip01a_8_handler
97	AiIP01_A向け割り込み	aiip01a_9_handler
98	AiIP01_A向け割り込み	aiip01a_10_handler
99	AiIP01_A向け割り込み	aiip01a_11_handler
100	AiIP01_A向け割り込み	aiip01a_12_handler
101	AiIP01_A向け割り込み	aiip01a_13_handler
102	AiIP01_A向け割り込み	aiip01a_14_handler
103	AiIP01_A向け割り込み	aiip01a_15_handler
104	IPコア向けリザーブ		aiipr1_0_handler
105	IPコア向けリザーブ		aiipr1_1_handler
106	IPコア向けリザーブ		aiipr1_2_handler
107	IPコア向けリザーブ		aiipr1_3_handler
108	IPコア向けリザーブ		aiipr1_4_handler
109	IPコア向けリザーブ		aiipr1_5_handler
110	IPコア向けリザーブ		aiipr1_6_handler
111	IPコア向けリザーブ		aiipr1_7_handler
112	IPコア向けリザーブ		aiipr3_0_handler
113	IPコア向けリザーブ		aiipr3_1_handler
114	IPコア向けリザーブ		aiipr3_2_handler
115	IPコア向けリザーブ		aiipr3_3_handler
116	IPコア向けリザーブ		aiipr3_4_handler
117	IPコア向けリザーブ		aiipr3_5_handler
118	IPコア向けリザーブ		aiipr3_6_handler
119	IPコア向けリザーブ		aiipr3_7_handler
120	IPコア向けリザーブ		aiipr4_0_handler
121	IPコア向けリザーブ		aiipr4_1_handler
122	IPコア向けリザーブ		aiipr4_2_handler
123	IPコア向けリザーブ		aiipr4_3_handler
124	IPコア向けリザーブ		aiipr4_4_handler
125	IPコア向けリザーブ		aiipr4_5_handler
126	IPコア向けリザーブ		aiipr4_6_handler
127	IPコア向けリザーブ		aiipr4_7_handler
128	AiTwoSoCPF DMAC0 割り込み要因#0	dmac0_0_handler
129	AiTwoSoCPF DMAC0 割り込み要因#1	dmac0_1_handler
130	AiTwoSoCPF DMAC0 割り込み要因#2	dmac0_2_handler
131	AiTwoSoCPF DMAC0 割り込み要因#3	dmac0_3_handler
132	AiTwoSoCPF DMAC0 割り込み要因#4	dmac0_4_handler reserved
133	AiTwoSoCPF DMAC0 割り込み要因#5	dmac0_5_handler reserved
134	AiTwoSoCPF DMAC0 割り込み要因#6	dmac0_6_handler reserved
135	AiTwoSoCPF DMAC0 割り込み要因#7	dmac0_7_handler reserved
136	AiTwoSoCPF DMAC1 割り込み要因#0	dmac1_0_handler
137	AiTwoSoCPF DMAC1 割り込み要因#1	dmac1_1_handler
138	AiTwoSoCPF DMAC1 割り込み要因#2	dmac1_2_handler
139	AiTwoSoCPF DMAC1 割り込み要因#3	dmac1_3_handler
140	AiTwoSoCPF DMAC1 割り込み要因#4	dmac1_4_handler
141	AiTwoSoCPF DMAC1 割り込み要因#5	dmac1_5_handler
142	AiTwoSoCPF DMAC1 割り込み要因#6	dmac1_6_handler
143	AiTwoSoCPF DMAC1 割り込み要因#7	dmac1_7_handler
144	AiTwoSoCPF QSPI0 割り込み要因#0	qspi0_0_handler
145	AiTwoSoCPF QSPI1 割り込み要因#0	qspi1_0_handler
146	reserved	
147	reserved	
148	AiTwoSoCPF SPIS0 割り込み要因#0	spis0_0_handler
149	reserved	
150	reserved	
151	reserved	
152	AiTwoSoCPF SPIM0 割り込み要因#0	spim0_0_handler
153	reserved	
154	reserved	
155	reserved	
156	AiTwoSoCPF SPIM1_割り込み要因#0	spim1_0_handler
157	reserved	
158	reserved	
159	reserved	
160	AiTwoSoCPF GPIO0 割り込み要因#0	gpio0_0_handler
161	AiTwoSoCPF GPIO0 割り込み要因#1	gpio0_1_handler
162	AiTwoSoCPF GPIO0 割り込み要因#2	gpio0_2_handler
163	AiTwoSoCPF GPIO0 割り込み要因#3	gpio0_3_handler
164	AiTwoSoCPF GPIO0 割り込み要因#4	gpio0_4_handler
165	AiTwoSoCPF GPIO0 割り込み要因#5	gpio0_5_handler
166	AiTwoSoCPF GPIO0 割り込み要因#6	gpio0_6_handler
167	AiTwoSoCPF GPIO0 割り込み要因#7	gpio0_7_handler
168	AiTwoSoCPF GPIO0 割り込み要因#0	gpio1_0_handler
169	AiTwoSoCPF GPIO0 割り込み要因#1	gpio1_1_handler
170	AiTwoSoCPF GPIO0 割り込み要因#2	gpio1_2_handler
171	AiTwoSoCPF GPIO0 割り込み要因#3	gpio1_3_handler
172	AiTwoSoCPF GPIO0 割り込み要因#4	gpio1_4_handler
173	AiTwoSoCPF GPIO0 割り込み要因#5	gpio1_5_handler
174	AiTwoSoCPF GPIO0 割り込み要因#6	gpio1_6_handler
175	AiTwoSoCPF GPIO0 割り込み要因#7	gpio1_7_handler
176	AiTwoSoCPF TIMER0 割り込み要因#0	timer0_0_handler
177	AiTwoSoCPF TIMER0 割り込み要因#1	timer0_1_handler
178	AiTwoSoCPF TIMER0 割り込み要因#2	timer0_2_handler
179	AiTwoSoCPF TIMER0 割り込み要因#3	timer0_3_handler
180	AiTwoSoCPF TIMER0 割り込み要因#4	timer0_4_handler
181	AiTwoSoCPF TIMER0 割り込み要因#5	timer0_5_handler
182	AiTwoSoCPF TIMER0 割り込み要因#6	timer0_6_handler
183	AiTwoSoCPF TIMER0 割り込み要因#7	timer0_7_handler
184	AiTwoSoCPF TIMER0 割り込み要因#0	timer1_0_handler
185	AiTwoSoCPF TIMER0 割り込み要因#1	timer1_1_handler
186	AiTwoSoCPF TIMER0 割り込み要因#2	timer1_2_handler
187	AiTwoSoCPF TIMER0 割り込み要因#3	timer1_3_handler
188	AiTwoSoCPF TIMER0 割り込み要因#4	timer1_4_handler
189	AiTwoSoCPF TIMER0 割り込み要因#5	timer1_5_handler
190	AiTwoSoCPF TIMER0 割り込み要因#6	timer1_6_handler
191	AiTwoSoCPF TIMER0 割り込み要因#7	timer1_7_handler
192	reserved	
193	reserved	
194	reserved	
195	reserved	
196	AiTwoSoCPF NOC_ERR 割り込み要因#0	noc_err_0_handler
197	reserved	
198	reserved	
199	reserved	
200	AiTwoSoCPF DMAC0 割り込み要因#8	dmac0_8_handler
201	AiTwoSoCPF DMAC1 割り込み要因#8	dmac1_8_handler
202	AiTwoSoCPF NOC 割り込み要因#0	noc_0_handler
203	AiTwoSoCPF NOC 割り込み要因#1	noc_1_handler
204	AiTwoSoCPF NOC 割り込み要因#2	noc_2_handler
205	AiTwoSoCPF NOC 割り込み要因#3	noc_3_handler
206	AiTwoSoCPF NOC 割り込み要因#4	noc_4_handler
207	AiTwoSoCPF NOC 割り込み要因#5	noc_5_handler
208	AiTwoSoCPF NOC 割り込み要因#6	noc_6_handler
209	AiTwoSoCPF NOC 割り込み要因#7	noc_7_handler
210	reserved	
211	reserved	
212	AiTwoSoCPF WDT0 割り込み要因#0	wdt0_0_handler
213	AiTwoSoCPF WDT1 割り込み要因#0	wdt1_0_handler
214	reserved	
215	reserved	
216	AiTwoSoCPF UART0 割り込み要因#0	uart0_0_handler
217	AiTwoSoCPF UART1 割り込み要因#0	uart1_0_handler
218	AiTwoSoCPF UART2 割り込み要因#0	uart2_0_handler
219	reserved	
220	reserved	
221	reserved	
222	reserved	
223	reserved	
224	AiTwoSoCPF PCIE0 割り込み要因#0	pcie0_0_handler
225	AiTwoSoCPF PCIE0 割り込み要因#1	pcie0_1_handler
226	AiTwoSoCPF PCIE0 割り込み要因#2	pcie0_2_handler
227	AiTwoSoCPF PCIE0 割り込み要因#3	pcie0_3_handler
228	AiTwoSoCPF PCIE0 割り込み要因#4	pcie0_4_handler
229	reserved	
230	reserved	
231	reserved	
232	AiTwoSoCPF PCIE1 割り込み要因#0	pcie1_0_handler
233	AiTwoSoCPF PCIE1 割り込み要因#1	pcie1_1_handler
234	AiTwoSoCPF PCIE1 割り込み要因#2	pcie1_2_handler
235	AiTwoSoCPF PCIE1 割り込み要因#3	pcie1_3_handler
236	AiTwoSoCPF PCIE1 割り込み要因#4	pcie1_4_handler
237	reserved	
238	reserved	
239	reserved	
240	AiTwoSoCPF MEMC 割り込み要因#0	memc_ddrphy_0_handler
241	reserved	
242	reserved	
243	reserved	
244	reserved	
245	reserved	
246	reserved	
247	reserved	
248	reserved	
249	reserved	
250	reserved	
251	reserved	
252	reserved	
253	reserved	
254	reserved	
255	reserved	

付録B:DRAM物理アドレスマッピング

AiTwoにおける外付けDRAMのアドレスマッピングは下記のようになっています。連続アクセスする際のアドレス指定によっては、インタリーブ機能が活用できず帯域が低下する場合があります。
マッピングの思想:
・ラスターアクセス時、128バイト単位でバンクインタリーブを行い、DRAM規格のペナルティ(バンクビジー待ち)を受けなくする。
・異ランク間のアクセスはR/W共にDDRPHY-IP仕様でのペナルティ(ランク切り替え待ち)を受ける為、最上位ビットに配置してペナルティを受けにくくする。

注意:帯域を落とすアクセスの仕方
・bit9-7、5(チャンネルビット及びバンクのビット)を固定した連続アクセスの場合、インタリーブ機能が活用できず、DRAM規格のペナルティを大きく受けて、帯域を著しく落とす可能性があります。

AIチップ設計拠点 Confidential Document