MMAV ユーザ • ガイド バージョン 2.0 DENALI SOFTWARE, INC. 1000 Hamlin Court, Sunnyvale, CA 94089 Tel: (408) 743-4200 Fax: (408) 743-4209 [email protected] [email protected] www.denali.com/support www.ememory.com All rights reserved 機密保持告知 Denali Software, Inc. Sunnyvale, CA 94089 © 2006 Denali Software, Inc. All rights reserved. 公開:2008 年 10 月 30 日 本情報製品のいかなる部分も、デナリソフトウエア社からの書面による事前の許可を得ずに、 電子的、機械的、手作業、光学的、またはその他のいかなる形式または手段によっても、複 製、送信、または翻訳することはできません。本製品内の情報は予告なく変更されることが あり、デナリソフトウエア社側の義務を表すものではありません。 本書に含まれている情報は、デナリソフトウエア社またはそのライセンサが所有権を持つ機 密情報であり、デナリソフトウエア社とお客様の間の契約書に従って提供され、デナリソフ トウエア社のお客様のみが使用することができます。当該契約書に明記されていない限り、 デナリソフトウエア社は、本書に含まれている情報の整合性、正確性、または実用性につい て、いかなる表明も保証も行わず、明確に放棄します。デナリソフトウエア社は、当該情報 の使用によって第三者の権利が侵害されないことを保証しません。また、デナリソフトウエ ア社は、当該情報の使用に起因するいかなる種類の損害または費用に対する責任も負いま せん。 制限された権利の表示 政府による使用、複製、または開示は、DFARS 252.227-7013 の「Rights in Technical Data and Computer Software」の節のサブパラグラフ (c)(1)(ii) で定められた制限の対象となります。 仕向地規制の表示 本製品に含まれているすべての技術データは、アメリカ合衆国の輸出規制法の対象となりま す。合衆国法に反する諸外国の国民に開示することは禁じられています。お客様の責任にお いて、適用される規則を調べ遵守していただきます。 MMAV ユーザ • ガイド 10/30/08 2 1 はじめに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.1 読者としての前提条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.2 表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3 ヘルプ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.4 2 1.3.1 製品のマニュアル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.2 関連情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.3 技術サポートへの連絡 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.4 トレーニング • コース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 このマニュアルの使用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 PUREVIEW グラフィカル • ツールの使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1 PureView の起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2 デナリ SOMA ファイルへのアクセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2.1 2.3 2.4 3 4 eMemory.com からの SOMA ファイルの入手 . . . . . . . . . . . . . . . . . . . . . . . . . . 13 PureView GUI の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.3.1 PureView での SOMA ファイルの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.3.2 PureView の [File] プルダウン • メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.3.3 PureView の [Options] プルダウン • メニュー . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.3.4 HDL シェルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.3.5 SOMA ファイルの作成または変更. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 コマンド • ラインからの HDL シェルの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 PUREVIEW でのメモリのデバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.1 デナリ • メモリ • データベース • ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2 シミュレーション時の対話型デバッグ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2.1 UNIX シェルの起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2.2 シミュレータおよびテストベンチの起動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3 シミュレーション結果ファイルの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.4 メモリ • インスタンスの選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.5 PureView の [Debugging] ウィンドウ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.5.1 [Memory Contents] ウィンドウ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.5.2 メモリ内容トランザクション • サマリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.5.3 トランザクション履歴の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.6 PureView での後処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.7 Mentor Graphic's の Seamless HW/SW Co-Verification での PureView の使用 . . . . . . . . 36 デナリの MEMORY MODELER ADVANCED VERIFICATION (MMAV) の使用. . . . . . . . . . . . . . . 38 4.1 .denalirc ファイルを使用したメモリ • シミュレーション • モデルの制御 . . . . . . . . . 38 4.1.1 レジスタ • ファイル固有の .denalirc パラメータ . . . . . . . . . . . . . . . . . . . . . . . 46 4.1.2 IBM-EDRAM 固有の .denalirc パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.1.3 RDRAM 固有の .denalirc パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 4.1.4 RLDRAM 固有の .denalirc パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 MMAV ユーザ • ガイド 11/6/08 3 4.1.5 DDR-II SDRAM 固有の .denalirc パラメータ. . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.1.6 DDR-II と DDR3 に固有の .denalirc パラメータ . . . . . . . . . . . . . . . . . . . . . . . . 48 4.1.7 ESSRAM 固有の .denalirc パラメータ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.1.8 Mentor Graphics ModelSim 固有の .denalirc パラメータ . . . . . . . . . . . . . . . . . . 49 4.1.9 Mentor Graphics Seamless HW/SW Co-Verification 固有の .denalirc パラメータ . .49 4.1.10 OneNand Flash の .denalirc パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 4.1.11 アサーションの .denalirc パラメータ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.1.12 .denalirc の概要をまとめた一覧表. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2 シミュレーション時の .denalirc オプションの動的設定 . . . . . . . . . . . . . . . . . . . . . . . . 55 4.3 ライセンスに関するソリューション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.4 4.5 4.3.1 デナリのライセンスのためのシミュレータ • キューイング . . . . . . . . . . . . . 56 4.3.2 ライセンスのチェックアウトの高速化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 デナリの Tcl インターフェイス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 4.4.1 ModelSim での使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.4.2 NCSIM や他の Tcl インタープリタでの使用. . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.4.3 Tcl のコマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.4.4 コールバック • コマンド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 デナリのメモリの初期化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.5.1 メモリ • アドレスの判定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.5.2 メモリの初期の内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.5.3 ファイルからのメモリのロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.5.4 メモリ内容ファイルの形式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.6 メモリ • インスタンスの指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 4.7 メモリの内容のリセット . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.8 メモリのリードとライト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.8.1 4.9 メモリの内容の保存と比較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.10 クロック • サイクル時間の再計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.11 シミュレーション時の SOMA ファイルの再ロードとタイミング • パラメータの “オンザフライ”での変更 . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.12 エラー • メッセージの制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.13 クロック • サイクルの強制的な再計算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 4.14 RDRAM (Rambus) 固有モデルの考慮事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.14.1 5 マスクされたメモリ • ライト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 RAMBUS 向け Turbo Channel Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 MMAV の特別な検証機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.1 メモリ • トランザクションのアサーションの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 5.1.1 メモリ • アクセスのアサーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 5.1.2 データ • アクセスのアサーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.1.3 グローバルなメモリ • アクセスのアサーション . . . . . . . . . . . . . . . . . . . . . . . 85 5.1.4 パリティ • チェックのアサーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 MMAV ユーザ • ガイド 11/6/08 4 5.2 アサーションの動的な有効化および無効化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 5.3 エラー挿入ルーチン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 5.4 5.5 5.3.1 エラー挿入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 5.3.2 故障モデリング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 XML を使用した MMAV での論理アドレス指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 5.4.1 XML の基本 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 5.4.2 深さおよび幅の拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.4.3 インターリーブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 5.4.4 アドレスのスクランブル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4.5 データ • ビットの並べ替えおよびマスキング . . . . . . . . . . . . . . . . . . . . . . . . . 97 5.4.6 ホールの作成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 5.4.7 統合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 5.4.8 MMAV とのインターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 PLI/FLI/Tcl を使用した、MMAV での論理アドレス指定 . . . . . . . . . . . . . . . . . . . . . . 101 5.5.1 幅の拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.5.2 深さの拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.5.3 インターリーブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 5.5.4 マスキング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 5.6 アドレスのスクランブル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 5.7 スクラッチパッドのメモリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 5.8 MMAV と Mentor Graphic's の Seamless HW/SW Co-Verification 製品の併用 . . . . . . . 109 5.9 エンベデッド ASIC メモリのための MMAV の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . 110 5.9.1 6 レジスタ • ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 5.9.2 エンベデッド SRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 5.9.3 エンベデッド DRAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 MMAV テストベンチの統合. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .114 6.1 Verilog インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.1.1 6.2 6.3 6.4 MMAV と Verilog の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.1.2 MMAV と Verilog のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.1.3 コールバックの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 VHDL インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 6.2.1 MMAV と VHDL の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 6.2.2 MMAV と VHDL のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 SystemC インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 6.3.1 MMAV と SystemC の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 6.3.2 MMAV と SystemC のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Specman インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 6.4.1 MMAV と Specman の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 6.4.2 MMAV と Specman のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 6.4.3 コンフィギュレーション • レジスタおよびメモリへのアクセス . . . . . . . . 131 MMAV ユーザ • ガイド 11/6/08 5 6.5 6.6 6.7 A 6.4.4 sn_denali_unit を拡張してすべての MMAV 関数をメソッドとして含める . . .131 6.4.5 波形でのメモリ • トランザクションの表示 . . . . . . . . . . . . . . . . . . . . . . . . . . 133 6.4.6 テストケースの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Vera インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 6.5.1 MMAV と Vera の概要. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 6.5.2 MMAV と Vera のシミュレーション. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 6.5.3 Vera テストベンチからのデナリ • メモリ • モデルの初期化 . . . . . . . . . . . . 136 6.5.4 コールバックの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 6.5.5 Vera テストベンチからの他のデナリ関数の使用 . . . . . . . . . . . . . . . . . . . . . . 139 6.5.6 テストケースの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 NTB インターフェイス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.6.1 MMAV と NTB の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.6.2 MMAV と NTB のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.6.3 インスタンスとトランザクション • クラス . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.6.4 コールバックの処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 6.6.5 テストケースの例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 SystemVerilog インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 6.7.1 MMAV と SystemVerilog の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 6.7.2 MMAV と SystemVerilog のシミュレーション . . . . . . . . . . . . . . . . . . . . . . . . 164 6.7.3 コンフィギュレーション • レジスタおよびメモリへのアクセス . . . . . . . . 166 技術サポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 A.1 A.2 デナリ履歴ファイル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 A.1.1 デナリの履歴ファイルについて (.denalirc の HistoryFile) . . . . . . . . . . . . . . . 193 A.1.2 HistoryDebug モード (.denalirc の HistoryFile と HistoryDebug) . . . . . . . . . . . 194 履歴ファイルについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 A.2.1 SIM READ エントリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 A.2.2 MASKED SIM ライト • エントリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 A.2.3 デバッグ • リード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 A.2.4 デバッグ • ライト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 A.2.5 ファイル • ロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 MMAV ユーザ • ガイド 11/6/08 6 CHAPTER 1 1 はじめに MMAV ユーザ • ガイドへようこそ。このマニュアルでは、デナリの Memory Modeler Advanced Verification (MMAV) および PureView ソフトウエアについて説明します。 1.1 読者としての前提条件 このマニュアルで説明する製品は、チップの設計者および検証エンジニアを対象にしていま す。読者は Verilog または VHDL を確実に理解している必要があります。 1.2 表記規則 このマニュアルでは、次の表記規則を採用しています。 • コマンド、 ファイル名、およびコマンド • ライン • オプションの文字列値は等幅フォントで 表記します。 例:.denalirc ファイルを使用すると、実行時モデリング • パラメータを変更できます。 注意: レジスタ名などの文字は通常のフォントで表記します。 • コンテキストによって特定される値で置き換える必要がある変数は、かぎかっこで囲ん で示します。 例:ファイルを検索するには、 「grep <filename> 」と入力します。<filename> には ファイルの名前を入力します。 • UNIX 環境変数は、標準の表記法を採用して示します。 例:$DENALI 環境変数は、製品のインストール • ホーム • ディレクトリを指定します。 • 一連のオプションから任意で選択できるオプションの場合は、かぎかっこおよびパイプ を使用して構文を示します。 myscript [-option1 <value>|option2] したがって、 server1 というマシンを指定して myscript をデバッグ • モードで実行する と仮定すると、構文は次のようになります。 myscript –server server1 –debug • 構文の例をテキスト • ボックスに示します。 % verilog [all of your regular arguments] $DENALI/ddvapi/verilog/denaliPcie.v \ +incdir+$DENALI/ddvapi/verilog MMAV ユーザ • ガイド 11/6/08 \ 7 1.3 ヘルプ 次のセクションで、ヘルプ、トレーニング • マニュアル、およびオンライン • マニュアルにつ いて説明します。 1.3.1 製品のマニュアル デナリ製品の使用について不明な点がある場合は、ネットワークにインストールされている マニュアルかデナリソフトウエア • リリース内にある該当製品のマニュアルを参照してくだ さい。 $DENALI/docs/ ここで、$DENALI はデナリのホーム • ディレクトリです。 1.3.2 関連情報 次の関連情報にアクセスできます。 こ • 『スタート • ガイド』 。デナリ VIP 製品を初めて使用するときの詳細が記載されています。 のマニュアルには、ソフトウエアのダウンロード、インストール • ディレクトリの作成、 インストール•パッケージの解凍、ソフトウエア•ライセンスのインストールについての詳 細と、サポートされているツールおよびプラットフォームのリストが記載されています。 GettingStartedUserGuide.pdf は $DENALI/docs/ にあります。 • デナリ製品に関する Web 上の FAQ は、次の URL にあります。 http://www.denali.com/support • SOMA ファイルは、次の URL から入手できます。 http://www.ememory.com • MMAV のリリースは、次の URL から入手できます。 http://www.denali.com/support デナリとデナリ製品の詳細については、次の URL を確認してください。 http://www.denali.com 1.3.3 技術サポートへの連絡 有効なソフトウエア • ライセンスを購入していると、技術サポートを受けることができます。 デナリのサポート • センターには、次の方法で問い合わせることができます。 電子メールによるサポート : • www.denali.com/support を利用します。 • 左側から、Support > Product Support > Create New Ticket を選択します。 MMAV ユーザ • ガイド 11/6/08 8 • 次のように .denalirc コンフィギュレーション • オプションを設定したシミュレーショ ンの TraceFile と共に、問題の詳細な情報が含まれているサポート • チケットを開きます。 Historyfile denali.his Historydebug on Tracefile denali.trc (.denalirc ファイルおよびトレース • ファイルの設定の詳細については、38 ページのセ クション「.denalirc ファイルを使用したメモリ • シミュレーション • モデルの制御」を参照 してください。) • 最寄りのサポート • センターのお問い合わせ電話番号 − 米国 : 408-743-4200、内線 3 − ヨーロッパ : +44-1494-481030、[email protected] − 日本 : +81-3-3511-2460、[email protected] 1.3.4 トレーニング • コース デナリでは、製品の完全なトレーニング • コースを用意しています。現在提供されているコー スの情報については、最寄りの技術サポート • センターにお問い合わせください。 1.4 このマニュアルの使用方法 このマニュアルは次の章で構成されています。 • 第 1 章: 「はじめに」では、このマニュアルの概要を説明します。 新しい PureView GUI の SOMA パラ 「PureView グラフィカル • ツールの使用」では、 • 第 2 章: メータの表示機能と編集機能の両方について説明します。 • 第 3 章: 「PureView でのメモリのデバッグ」には、シミュレーション中のメモリ内容を固 有の図に表示する PureView デバッガの詳細が記載されています。 • 第 4 章: 「デナリの Memory Modeler Advanced Verification (MMAV) の使用」には、メモリの サブシステム検証の強化を目的とした、高度な検証機能を有するデナリの世界有数のメ モリ • モデリング機能を拡張する MMAV 製品の詳細な使用方法が記載されています。 • 第 5 章: 「MMAV の特別な検証機能」には、検証の確認をテストベンチに追加し、物理的 なメモリ表示を論理的なメモリ表示に整理できる一連の追加的な検証機能が示されてい ます。 • 第 6 章: 「MMAV テストベンチの統合」では、サポートされているさまざまなテストベン チのインターフェイスを示し、それについて説明します。 • 付録 A: 「技術サポート」には、デナリソフトウエア社の技術サポートを利用するための さまざまな方法が記載されています。 MMAV ユーザ • ガイド 11/6/08 9 CHAPTER 2 2 PureView グラフィカル • ツールの使用 PureView グラフィカル • ユーザ • インターフェイス (GUI) を使用すると、メモリ • アーキテク チャ (SOMA) ファイルの仕様を設定したり、以前の Memory Maker のすべての機能を、強化 された PureView のデバッグ機能と組み合わせたりすることができます。これによって、デナ リ製品で必要とされるデスクトップ • ウィンドウの数を抑えることができます。 この章では、PureView GUI のデバッグ機能と共に、SOMA の表示機能と編集機能について説 明します。 2.1 PureView の起動 PureView GUI は、 次のコマンドを Unix または Linux シェル • コマンド • ラインから入力すると 起動できます。 shell > MMAV ユーザ • ガイド $DENALI/bin/pureview & 11/6/08 10 次の GUI が起動します。 図 2-1: PureView GUI 2.2 デナリ SOMA ファイルへのアクセス PureView を使用して、 新しい SOMA ファイルの作成、デナリ • パラメータまたはメモリ • ベン ダが作成した SOMA ファイルの表示および編集、シミュレーションで使用できる HDL ラッ パーの生成を実行できます。詳細については、22 ページの「HDL シェルの作成」を参照して ください。 デナリのメモリ • モデリング • ソリューションの中核となるのは、 よく知られているあらゆる メモリ • クラスアーキテクチャの 'C' モデルに基づくクラスです。これらの 'C' モデルは、特定 のデバイス • ファミリーの全メモリ • クラスにわたるすべての機能に対応します。たとえば、 デ ナリには次のメモリ • クラス用の 'C' モデルがあります。 SRAM DRAM 不揮発性 揮発性 エンベデッド ASIC/ FPGA 同期 SRAM DRAM フラッシュ カード • メモリ DRAM 非同期 SRAM EDO-DRAM 同期フラッシュ マルチメディア • カード * SRAM DDR SRAM SDRAM EEPROM メモリスティック * フラッシュ MMAV ユーザ • ガイド 11/6/08 11 SRAM DRAM 不揮発性 揮発性 エンベデッド ASIC/ FPGA QDR SRAM SGRAM SEPROM メモリスティック Pro* レジスタ • ファイル / 配列 SigmaRAM 拡張 SDRAM PROM SecureDigital ** FIFO DDR-SGRAM SMROM SecureDigital IO** Cellular RAM DDR/DDRII-SDRAM コンパクト • フラッ シュ * = ライセンスのみの場合 ライセンシー専用 Mobile RAM FCRAM/FCRAM2 Atmel Serial/ Parallel/SPI フラッ シュ ** = SDA メンバ専用 RDRAM AND/NAND/NOR フラッシュ RLDRAM Sharp フラッシュ RLDRAM2 SST シリアル • フラッシュ GDDR2 One NAND GDDR3 DDR-NVM GDDR4 LPDDR2-NVM GDDR5 DDR3 前述のメモリ • クラスは、 さまざまなメモリ • ベンダから数多くのバリエーションが出ている ため、デナリでは SOMA ファイルを使用して特定の部品番号の特定のメモリ機能とタイミン グを記述します。 これらの SOMA ファイルでは高度に最適化された 'C' コア • モデルが一意に パラメータ化され、SOMA の仕様に従って動作とタイミングが調整されます。 SOMA ファイルは、メモリ • コンポーネントの動作を使用するためにメモリ • ベンダに幅広く 使用されており、多くのメモリ • ベンダの Web サイトから無料でダウンロードできます。こ れらのベンダと連携し、デナリでも eMemory Web サイト (http://www.eMemory.com) に SOMA ファイルのリポジトリを保持しています。対象デバイスの SOMA ファイルが見つからない場 合は、ご要望に応じて当社から SOMA ファイルをお届けすることになっています。通常、 SOMA ファイルを入手する場合は次の手順を実行します。 1. デナリの eMemory Web サイトを検索する (http://www.eMemory.com)。 2. メモリ • ベンダの Web サイトで該当する SOMA ファイルを検索する。 3. 類似デバイスの場合は、既存の SOMA ファイルを修正する。 4. http://www.eMemory.com から SOMA ファイルを要求する ( 該当するデバイスの仕様とデー タシートへの参照を必ず含める )。 MMAV ユーザ • ガイド 11/6/08 12 2.2.1 eMemory.com からの SOMA ファイルの入手 デナリの SOMA ファイルでは、特定のベンダおよび動作速度に合わせて当社の C ベースのメ モリ • モデルが完全に特性付けされます。 デナリでは、 ベンダ • データシートとメモリ • デバイ スにおける当社の専門技術を使用して、これらのファイルの作成と検証が慎重に行われてい ます。 特定のメモリ • ベンダの部品番号に対応した SOMA ファイルは、eMemory Web サイトから入 手できます。URL は http://www.eMemory.com です。このページに初めてアクセスすると、ダ ウンロードのために登録を求められます。登録すると、ご使用の SOMA ファイルが更新され たときに、最新バージョンのダウンロードが可能であるとの通知を受け取れます。 図 2-2: eMemory.com の登録ページ MMAV ユーザ • ガイド 11/6/08 13 eMemory.com のユーザ登録を行うと、SOMA ファイルを検索できます。 図 2-3: eMemory.com の SOMA 検索ページ ベンダ、クラス、データ幅、サイズ、または部品番号のいずれかを指定して、特定のメモリ を簡単に検索することができます。 メモリの検索は、特定のベンダ、クラス、データ幅、サイズ、または部品番号に限定する必 要があります。検索エンジンによって、サブ文字列と [Part #] フィールドにユーザが入力した ものとの検索が実行されます。ここで、* はワイルドカードとして受け入れられます。 その後、関連する SOMA を選択してカートに追加します。こうすると、Download Cart が表 示されます。このインターフェイスでは、電子メールで SOMA ファイルを入手できる [Send cart now]、SOMA ファイルの [Remove Selected] または [Remove All] を選択できます。 MMAV ユーザ • ガイド 11/6/08 14 図 2-4: eMemory.com のダウンロード • カート ファイルが電子メールで送信されると、PureView でその設定内容を確認することができます。 詳細については、16 ページの「PureView GUI の使用」を参照してください。 注意: 探している部品が見つからない場合は、次のインターフェイスを使用して SOMA を要 求できます。 MMAV ユーザ • ガイド 11/6/08 15 図 2-5: SOMA のリクエスト 2.3 PureView GUI の使用 PureView を起動するには、UNIX シェルから次のコマンド • ラインを入力します。 $DENALI/bin/pureview & これで PureView ウィンドウが表示され、新しい SOMA 仕様ファイルを作成するか、既存の SOMA ファイルを開くかを選択できるようになります。SOMA ファイルには、メモリ • デバイ スをモデル化するために必要なあらゆる機能仕様とタイミング仕様が含まれています。 MMAV ユーザ • ガイド 11/6/08 16 2.3.1 PureView での SOMA ファイルの表示 既存の SOMA ファイルで読み込むには、PureView メイン • ウィンドウで [Open SOMA file] ボ タンを選択します。SOMA ファイルには、XML の .soma サフィックスか、テキスト • ファイ ルの .spc ファイル • サフィックスを付けることができます。現在のディレクトリ ( または別 のディレクトリ ) で SOMA ファイルを選択し、最初の選択ウィンドウの [Open] ボタンをク リックします。SOMA ファイルが現在のディレクトリにない場合は、ファイル選択ウィンド ウの上部でディレクトリ参照機能を使用します。 図 2-6: PureView の [Open SOMA File] ウィンドウ MMAV ユーザ • ガイド 11/6/08 17 2.3.2 PureView の [File] プルダウン • メニュー 図 2-7: PureView の [File] メニュー [New SOMA File] 特定のメモリ•クラス用にデナリのデフォルトのSOMAファイルを使用して独自のSOMAファ イルを作成するときに使用します。 [Open a SOMA File] 別の SOMA ファイルを開くことができます。PureView で表示する別の SOMA ファイルを選 択できるダイアログ • ボックスが表示されます。 [Check a SOMA File for Errors] SOMA ファイルの構文エラーと不正な機能の組み合わせを確認します。最初から独自の SOMA ファイルを作成する場合は、その SOMA ファイルを保存したり、シミュレーションで 使用する前にファイルを確認することをお勧めします。 注意: このチェックでは、タイミングおよび機能の観点から SOMA ファイルの正確性は確認 されません。SOMA ファイルに設定された不正なパラメータのチェックのみが行われ ます。 MMAV ユーザ • ガイド 11/6/08 18 注意: この後説明する [Save SOMA] または [Save SOMA As...] コマンドは [Check SOMA] コ マンドと同様のチェック結果となり、保存をキャンセルしたりそのままの問題を開始 したりするオプションを提供します。 [Save SOMA] ファイル • オプション このオプションを使用すると、SOMA ファイルを保存できます。[Save SOMA] オプションは、 SOMA ファイルへの変更が検出されると使用可能になります。デナリが作成した SOMA ファ イルを表示する場合は、パラメータを変更しない限り、SOMA ファイルを再保存する必要は ありません。 [Save SOMA As] ファイル • オプション このオプションを使用すると、 新たに作成された SOMA ファイルを保存したり、 既存の SOMA ファイルを別のファイル名で保存したりすることができます。 [Save Source] オプション このオプションを使用すると、22 ページの図 2.3.4「HDL シェルの作成」で生成された HDL ラッパー• ファイルをディスクに保存することができます。このオプションでは、SOMA ファ イルの名前を使用します。また、デフォルトで .vhdl または .v のファイル拡張子 ( それぞれ VHDL および Verilog ソース用 ) を使用します。 [Save Source As] オプション このオプションを使用すると、22 ページの図 2.3.4「HDL シェルの作成」で生成された HDL ラッパー • ファイルをディスクに保存することができます。このオプションでは、メモリ • モ デル • クラスの名前を使用します。また、デフォルトで .vhdl または .v のファイル拡張子 ( そ れぞれ VHDL および Verilog ソース用 ) を使用します。3.2 では新たに、モデル化するインター フェイスの HTML データシートを保存できます。 [Close] オプション このオプションを使用すると現在の PureView ウィンドウが閉じられますが、PureView アプリ ケーションは終了しません。 [Exit] オプション 現在の PureView ウィンドウに加えてその他の開いている PureView ウィンドウを閉じ、 PureView を終了します。 MMAV ユーザ • ガイド 11/6/08 19 2.3.3 PureView の [Options] プルダウン • メニュー 図 2-8: PureView の [Options] メニュー [SOMA Output Format] サポートされている 3 つの形式で SOMA ファイルを保存できます。デフォルトでは、 eMemory.com からダウンロードされるすべての SOMA ファイルは XML 形式で圧縮されます。 これらのファイルは、 XML 形式として圧縮されずに保存されるか、テキスト • ファイル ( バー ジョン 0.001) として保存されます。 [Simulation Environment] HDL シェルの生成プロセスで使用するシミュレーション環境を選択します。Verilog、VHDL、 HTML Datasheet、および SystemC から選択できます。選択すると、PureView の [Source] ウィ ンドウに HDL シェル • ファイルが表示され、 [File] -> [Save Source] メニューを使用してシミュ レーション用の HDL シェルを保存することができます。 MMAV ユーザ • ガイド 11/6/08 20 データシート • オプションを使用すると、モデル化する HTML インターフェイスのデータシー トを保存できます。これによって、機能をすばやくドキュメンテーションに展開できます。 この例は次のとおりです。 図 2-9: PureView のデータシート • ソース • ウィンドウ [Bit-blast Pins] このオプションは、 すべてのデータ•バスをHDLシェル•ファイルの個別の信号ビット•ポート に展開します。さらに個別のピンは、[Functionality] タブの [Pins] の ( 右 ) 半分にある [Blast Bits] チェック • ボックスでビットブラストできます。このウィンドウの例については、図 2-11 「PureView の [Functionality] ウィンドウ」を参照してください。 [STD_ULOGIC for VHDL Ports] このオプションは、すべての VHDL ポートの信号タイプを STD_ULOGIC に変換します。デ フォルトの信号タイプは STD_LOGIC です。 [Balloon Help] このオプションは、マウスを重ねると表示されるヘルプ情報をオンにします。このボックス のチェックを解除すると無効にできます。 MMAV ユーザ • ガイド 11/6/08 21 2.3.4 HDL シェルの作成 SOMA ファイルが正常にロードされたら、シミュレーション環境に合わせて HDL シェルを 作成する必要があります。これを行うには、PureView の SOMA の詳細を表示したウィンドウ の右下隅にある [Source] タブを選択します。 図 2-10: PureView HDL [Source] ウィンドウ 最初は、[Source] ウィンドウには何も表示されていません。ウィンドウの一番上にある [Options] メニューから [Simulation Environment] を選択します。次に、シミュレータがサポー トしている HDL 言語に応じて [Verilog] または [VHDL] を選択します。次に、使用するシミュ レータを選択します。その HDL シミュレータ用のコードが [Source] ウィンドウに表示されま す。一部のフィールドを編集できることがわかります。これらのフィールドには、読み込ん だ SOMA ファイルから適切なデータがあらかじめロードされているので、変更する必要はあ りません。.spc ファイルまたは初期内容ファイルの場所を変更する場合は、これらのフィー ルドの隣にある [...] ボタンをクリックすると、ファイル選択ボックスが表示されます。この ボックスを使用して別のファイルを選択します。 HDL シェルでは、初期ファイル (init_file) を指定できます。モデルの初期化時にロードさ れるファイルを示すパス名を編集できます。このファイル形式は、65 ページの「メモリ内容 ファイルの形式」に記載されているメモリ内容ファイル形式と同じです。 最後の手順は、この HDL シェルをデザイン内でインスタンス化できるようにファイルに書き 出すことです。これを行うには、[Source] ウィンドウの左上にある [File] メニューから [Save Source As] を選択します。 HDL ソース • ファイルに名前を付けて適切なディレクトリに書き込 めるファイル選択ボックスが表示されます。これを実行すると、SOMA ファイルに指定され ている特定のメモリ • デバイスでシミュレーションを開始するために必要なことはすべて実 行したことになります。 MMAV ユーザ • ガイド 11/6/08 22 注意: verilog シミュレータのすべてのオプションは、1 つのソース • ウィンドウにまとめられ ています。PLI 標準インターフェイスにより、ここで、Verilog HDL ラッパーはすべて の Verilog シミュレータで同じものになります。すべての Verilog シミュレータについ て [All] オプションを選択します。 2.3.5 SOMA ファイルの作成または変更 PureView を使用すると、新しい SOMA ファイルを最初から作成したり、既存の SOMA ファ イルを変更したりすることができます。これを行うには、次の手順を実行します。 1. インターフェイス • クラスを選択するか、既存の SOMA ファイルを読み込みます。 PureView を起動し、既存の SOMA ファイルを変更するために [Open SOMA file] を選択す るか、[Select an interface class] を選択します。下部に 4 つのタブ ([Overview]、 [Functionality]、[Timing]、[Source]) がある PureView クラス • ウィンドウが表示されます。 2. サイズ、機能パラメータ、およびピン名を選択します。 図 2-11: PureView の [Functionality] ウィンドウ MMAV ユーザ • ガイド 11/6/08 23 ウィンドウの下部の [Functionality] タブを選択します。[Functionality] ウィンドウでは、選 択したメモリ • クラスについて、 シミュレーション • モデルをパラメータ化できます。 各ク ラスには、 メモリ•クラスのサイズと機能を記述する一連の独自のパラメータがあります。 これらのオプションは、表示される左側のウィンドウでオンまたはオフにすることがで きます。右側のウィンドウを使用すると、各ピン • タイプのピン名と幅を指定できます。 デバイスのサイズは、アドレスおよびデータ • ポートのピン幅によって決まります。 ピンに名前を付けると、複数のピンの名前を一意に識別できます。PureView は、Pins セ クションに次の構文を取得します。 name_prepend{port1_specifier, port2_ specifier, port3_specifier}name_postpend 例: 2 ポート • デバイスおよび、 OE_port1_N および OE_port2_N の目的の HDL シェル出力有効 ピン名の場合、PureView に次のように出力有効ピン名を入力します。 OE_{port1,port2}_N 3. タイミング • パラメータの指定 図 2-12: PureView の [Timing] ウィンドウ MMAV ユーザ • ガイド 11/6/08 24 メモリの適切な機能とサイズを選択したら、設定したこのクラスとパラメータに関連す るタイミング•パラメータを指定する必要があります。タイミング•パラメータを編集する には、タイミング • パラメータの値の上で左マウス • ボタンをクリックします。このパラ メータの説明と値は、 タイミング•パラメータの関連性を示すタイミング•チャートと同様 に、ウィンドウの右上隅に表示されます。このタイミング • パラメータは、[Value] フィー ルドで右マウスをクリックし、正しい値を入力すると修正できます。値の絶対値は、 [Value] フィールドの右側にあるプルダウン • メニューをクリックすると変更できます。 パ ラメータの値を変更するには、カーソルが [Value] 入力ボックス内にあるときに RETURN キーを押します。 指定したタイミングの関連性がシミュレーション時に違反となる場合、そのエラーの報 告を有効または無効にすることができます。これを実行するには、チェック • マークをク リックしてチェックを解除します。[Enabled] 列の空白部分をクリックすると、タイミン グのチェックがオンに戻ります。[Functionality] タブで設定したパラメータに適さないタ イミング • チェックは灰色で表示され、編集することはできません。 4. SOMA ファイルを保存します。 メモリのすべての機能およびタイミング • パラメータの設定が終了したら、 SOMA ファイ ルをディスクに書き出す必要があります。これを行うには、ウィンドウの左上隅にある プルダウン • メニューから [File] > [Save SOMA As] を選択します。SOMA ファイルの名前 を選択できるファイル選択ダイアログ • ボックスが表示されます。 SOMA ファイルのファ イル名を指定したら、[Save] をクリックします。既存の SOMA ファイルを修正した場合 は、[File] > [Save SOMA] を選択します。元のファイルは、[Functionality] および [Timing] ウィンドウから入力した新しい仕様に上書きされます。 5. HDL シェルを書き出します。 最後の手順は、メモリをシミュレーション環境に追加できるように、作成または修正し たメモリの HDL シェルを書き出すことです。これを実行するには、22 ページの図 2.3.4 「HDL シェルの作成」で説明されている指示に従ってください。注意:HDL シェルは最 後に書き出してください。こうすることで、SOMA ファイルがユーザのデザインでイン スタンス化されるときに、HDL シェルが正しい SOMA ファイルを特定します。SOMA ファイルを保存する前に HDL シェルを書き出すと、古い SOMA ファイルが示される可 能性があります。 2.4 コマンド • ラインからの HDL シェルの作成 PureView は、シミュレーションのインスタンス化に必要な HDL シェルの作成に最も一般的 に使用されています。この HDL シェルには、SOMA ファイルに記述されているデバイスの Verilog でのモジュール定義または VHDL でのエンティティとアーキテクチャのペアが含まれ ています。 デバイスのピンは、"C" の特定のメモリ • クラス • オブジェクトへの呼び出しと同様 に定義されます。このオブジェクトは、デナリのソフトウエアに提供されているライブラリ • オブジェクトを共有する denali.so を経由してシミュレーションにリンクしています。 次のコ マンドを入力すると、PureView のオプションのリストを確認できます。 pureview -batch -help コマンド • ラインから HDL シェルを作成するための構文は次のようになります。 pureview -batch -generate <target environment> <model name> -genoption option1,option2 -genoutput <HDL shell file name> <soma file> MMAV ユーザ • ガイド 11/6/08 25 例: pureview -batch -generate mti essram_denali -genoption init_file="../loadfiles/essram.dat" -genoutput essram.v essram.soma このコマンドはデバイスに、 ../loadfiles/essram.datの初期ファイルをプリロードして、 essram.soma SOMA ファイルでかつ、essram_denali のモジュールの essram.v ファイルを作 成します。この HDL シェル • ファイル (essram.v) は、MTI Verilog シミュレータに対して生 成されます。 次に、PureView のコマンド • ラインで使用できるオプションの完全なリストを示します。 表 2-1: PureView のコマンド • ライン • オプション オプション -batch 説明 -usage PureView コマンドのヘルプ使用状況情報を出力します。 -help PureView コマンドのヘルプ情報を出力します。 -quiet メッセージはコンソールに表示されません。 ウィンドウは開かれず、コマンド • ラインに指定された動作が終わると終了します。 -new <class name> 指定されたメモリ • クラスの新しい SOMA を作成します。 -convert <format> 入力 SOMA を指定された形式に変換します。有効なオプションは、"xml" および "uncompressedxml"( または "uxml") です。 -convoutput <file name> 変換された SOMA (「-convert」を参照 ) を、コンソールではなく指定されたファイ ルに書き込みます。 -generate Verilog モジュールまたは VHDL エンティティに指定された名前を使用して、指定さ れた環境に対応するシミュレーション • ソース • コードを生成します。以下の target_environments のリストを参照してください。 <target env> <model name> 名前を付けたオプションを指定した値か、値を指定しない場合は 1 に設定します。 <option>[=<value>] コマンド • ラインに対する複数の -genoption 引数の効果は累積的です。複数のオ プションは、スペースではなくコンマで区切ります。以下のオプションのリストを 参照してください。 -genoutput HDL ソース • コード (「-generate」を参照 ) を、コンソールではなく指定された ファイルに書き込みます。 <file name> -genoption シミュレーション • データベース • ファイルに結び付けます。 -instance <instance シミュレーション • データベースに表示するインスタンス名 (-simdb が必要 ) name> -simdb <file name> 表 2-2: -generate オプションのターゲット環境 パラメータ Co-Design 環境 CoWare CoWare Simulator Verilog all すべての Verilog シミュレータ VHDL leapfrog VHDL コンフィギュレーション • テンプレート Cadence Leapfrog/NC-VHDL mentor-unix Mentor MTI Modelsim (UNIX) configuration mti-unix MTI V-System/Mentor QuickHDL (UNIX) package VHDL パッケージ • テンプレート MMAV ユーザ • ガイド 11/6/08 26 表 2-2: -generate オプションのターゲット環境 パラメータ scirocco 環境 Synopsys Scirocco voyager Ikos Voyager Datasheet datasheet HTML データシート SystemC systemC SystemC 表 2-3: パラメータ init_file"file name" -genoption のパラメータ 説明 init_file パラメータ / ジェネリックの値。 注意 : ファイル名には、関連パス (../../this_initfile.txt) に加えて環境 変数 ($denali_loadfiles/mem1.dat) も使用できます。 bitblast[=<value>] 1、yes、またはtrueに設定すると、追加ビットベースのHDLシェルが生成されます。 注意 : すべてのバスがブラストされます。ブラストを選択するには PureView GUI を使用します。 blastModelName= < モデル名 > ビットベースまたは追加的な HDL シェルのモジュール名またはエンティティ名 (blastModelName=rbt12_75 など ) 注意 : blastModelName パラメータでは、大文字と小文字が区別されます。 combinesetuphold 1 に設定すると、 $setup/$hold の条件を 1 つの $setuphold 条件にまとめ ます。 configurationName VHDL コンフィギュレーション • テンプレートのコンフィギュレーション名。 packageName VHDL パッケージ • テンプレートのパッケージ名。 libraryName VHDL コンフィギュレーション • テンプレートのライブラリ名。 vhdl_std_ulogic 1 に設定すると、VHDL のポート • タイプは、std_logic か std_ulogic のいず れかになります ( デフォルトは常に std_logic)。 MMAV ユーザ • ガイド 11/6/08 27 CHAPTER 3 3 PureView でのメモリのデバッグ PureView デバッガでは、 シミュレーション中のメモリ内容が独自なグラフィック • ビューに表 示されます。 このビューはポスト • プロセス • デバッグと同様に対話することを目的としてお り、検証デバッグ用に次の機能が提供されています。 • 物理および論理アドレス内容の表示 • ポスト • プロセス • データベース • シミュレーション実行後のメモリ内容の対話型ブラウズ • メモリ内容を表示中の時間的前後移動 • 特定アドレスの履歴 • メモリ位置のダブルクリックよるメモリのトランザクション履歴の表示 • シミュレータとの時刻同期 • 「ライブ」モードでの実行時の PureView とシミュレータの同期 • ユーザによる選択が可能なメモリ空間 / 内容のレイアウトおよび表示 PureView デバッガは、デナリのクライアントアプリケーションインターフェイスを使用して シミュレーションと同期します。 このため、メモリのリード / ライト • データが正確に PureView ウィンドウに反映されるようになります。 3.1 デナリ • メモリ • データベース • ファイル ポスト • プロセス機能を有効にするには、 作成するデータベース • ファイルを指定する必要が あります。このファイルにはデナリの高度データベース圧縮技術が使用され、シミュレーショ ン時のパフォーマンスに与える影響を最小限に抑えます。シミュレーション時のすべてのメ モリ • イベントは、このバイナリ • ファイルに記録されます。 このファイルは、シミュレーションの開始時またはシミュレーション中にいつでも指定する ことができます。 注意: シミュレーションの開始後にデータベース • ファイルが指定されると、先に行われた シミュレーション•データベース作成のシステム•メモリ定義に関する情報が抑制され る場合があります。 作成するデータベース • ファイルを指定するには、次のいずれかの方法で行います。 1. シミュレーションの開始時に、.denalirc ファイルから指定する。: SimulationDatabase MMAV ユーザ • ガイド simdb 11/6/08 28 2. シミュレーション中、Tcl インターフェイスから RTL で動的に指定する。 Verilog/VHDL: mmtcleval("mmsimulationdatabase simdb_filename"); Tcl: mmsimulationdatabase simdb_filename .denalirc オプション • メソッドはシミュレーションの開始時からデータベース全体を記録 するため、このメソッドを使用することをお勧めします。両方のメソッドを使用した場合、 mmsimulationdatabase が起動されると、.denalirc ファイルの記録が停止します。 3.2 シミュレーション時の対話型デバッグ 前述のように、PureView は、シミュレーション時の対話型モードとポスト • プロセス • モード の 2 つのモードで使用することができます。PureView は、シミュレーション前やシミュレー ション中にいつでも起動できます。いずれの場合でも、データベース • ファイルを生成する必 要があります。データベース • ファイルの指定方法の詳細については、28 ページの図 3.1「デ ナリ • メモリ • データベース • ファイル」を参照してください。 3.2.1 UNIX シェルの起動 UNIX シェルから PureView を起動するには、次のコマンドを使用します。 pureview & コマンド•ライン•スイッチを使用して、 特定のデータベース•ファイルとメモリ•インスタンス を呼び出すことができます。 • -simdb filename - PureView を自動的にシミュレーション • データベース • ファイルと結び 付けます。 • -instance instance_name - シミュレーション • データベースで表示するインスタンス名を 指定します。 たとえば、test1.simdb データベースでインスタンス test.memory.ddr0 を開きます。 pureview -simdb ./test1.simdb -instance test.memory.ddr0 次のコマンド • ラインを入力すると、コマンド • ライン • スイッチの完全なリストを入手でき ます。 pureview -batch -usage MMAV ユーザ • ガイド 11/6/08 29 pureview & を使用して PureView を起動すると、 次のクライアント • ウィンドウが表示されます。 図 3-1: PureView の [Debugger] ウィンドウ 3.2.2 シミュレータおよびテストベンチの起動 ユーザのデザインまたはテストベンチから PureView を直接起動することもできます。デナリ では、ユーザのテストベンチやシミュレータのコマンド • ラインから PureView を直接起動す る、PLI、FLI、および TCL コマンドを用意しています。 例: • ModelSim TCL: mmstartpureview • NC-SIM VHDL TCL: call mmtcleval "mmstartpureview" • Verilog PLI: success = $mmstartpureview; • VHDL FLI (ModelSim のみ ): success := mmstartpureview; • Verilog コマンド • ライン: $system("$DENALI/bin/pureview &"); MMAV ユーザ • ガイド 11/6/08 30 3.3 シミュレーション結果ファイルの表示 PureView を起動したら、デバッグを開始するためにデータベースを開きます。シミュレー ション• データベース • ファイルを見つけて開くには、 [Open an existing file] の下の[Simulation Results] ボタンをクリックします。 注意: 1 回の PureView セッションでは、1 つのデータベース • ファイルしか開けません。 図 3-2: PureView の [Open Simulation Results] ウィンドウ 3.4 メモリ • インスタンスの選択 PureView を使用し、 ユーザのデザインでインスタンス化された物理メモリ • インスタンスを表 示したり、MMAV の機能を使用して作成した論理的にアドレス指定されたメモリを表示した りすることができます。論理的にアドレスを指定されたメモリを物理メモリと組み合わせて、 深さ、幅、およびインターリーブ拡張を使用して、メモリ • サブシステムのまとまったシステ ム表示ができます。これらの「論理的にアドレス指定された」メモリ表示の作成方法の詳細 については、81 ページの「MMAV の特別な検証機能」を参照してください。 MMAV ユーザ • ガイド 11/6/08 31 データベース•ファイルを開くと、 PureViewにメモリ•インスタンス•ウィンドウが表示されま す。1 つまたは複数のメモリインスタンスを選択し、[OK] をクリックします。 図 3-3: PureView の [Open Instance] ウィンドウ 3.5 PureView の [Debugging] ウィンドウ デバッグするメモリを選択すると、PureView に 2 つのウィンドウが表示されます。1 つ目の [Memory Contents] ウィンドウには、指定したシミュレーション時刻のメモリ内容が表示され ます。2 つ目の [Transaction History] ウィンドウには、記録したメモリ • トランザクションが連 続して表示されます。 これらの 2 つのウィンドウは、互いに同期がとれています。たとえば、[Memory Contents] ウィ ンドウで時刻を設定すると [Memory Contents] ウィンドウが自動的に更新され、その時刻また はその時刻に近いトランザクションが示されます。また、[Transaction History] ウィンドウで 特定のトランザクションをダブルクリックすると、自動的に [Memory Contents] ウィンドウが 調整され、シミュレーション中のその時刻のメモリ内容が表示されます。 MMAV ユーザ • ガイド 11/6/08 32 メモリ内容の表示 赤色のタグ:最後にリードされた アドレス 白色のタグ:最後にライトされた アドレス これらのタグは、履歴の最後ではな く、現在表示されている時刻を基準 にしています。 点滅している 黄色のタグ:ダブルクリックして 要求したアドレス。 トランザクション履歴 の表示 図 3-4: PureView の [Debugger] ウィンドウ 3.5.1 [Memory Contents] ウィンドウ [Memory Contents] ウィンドウには、デバッグを支援する補足機能がいくつかあります。これ らは、プルダウン • メニューでアクティブにします。このウィンドウを以下に示します。 図 3-5: PureView の [Memory Contents] ウィンドウのオプション MMAV ユーザ • ガイド 11/6/08 33 次に、これらの機能について説明します。 [File] オプション • プルダウン • メニューから、次の機能を使用できます。 • [Open Instance...]:PureView メモリ • インスタンス • ウィンドウを開きます。追加デバッグ • ウィンドウを開くことができます。 • [Run Tcl Command...]:必要に応じて、Tcl コマンドを発行できます。 • [Debug]:PureView GUIでの問題をデナリ•サポートに報告するデバッグ•オプション•ウィ ンドウを表示します。 • [Close Window]:現在の [Memory Content] ウィンドウを閉じます。 • [Exit]:すべてのウィンドウを閉じて PureView を終了します。 [View] プルダウン • メニューから、次の機能を使用できます。 • [Value Format]:データの値の形式を設定できます(アドレスは常に16進数形式で表示され ます )。次のいずれかを選択できます。 − 2 進数 − 10 進数 − 16 進数 − 8 進数 • [Contents Table Origin]: • [Top Left]:開始アドレスをウィンドウの左上から始めてメモリの内容が表示されます。 • [Top Right]:開始アドレスをウィンドウの右上から始めてメモリの内容が表示されます。 • [Bottom Left]:開始アドレスをウィンドウの左下から始めてメモリの内容が表示されます。 • [Bottom Right]:開始アドレスをウィンドウの右下から始めてメモリの内容が表示され ます。 • [Show Last Read]:最後に読み込まれたアドレスが表示されます。 • [Show Last Write]:最後に書き込まれたアドレスが表示されます。 • [Refresh]:[Memory Content] ウィンドウをリフレッシュします。 MMAV ユーザ • ガイド 11/6/08 34 3.5.2 メモリ内容トランザクション • サマリ 特定のアドレスを「ダブルクリック」すると、そのアドレスのすべてのメモリ • トランザク ションのサマリを入手できます。 ダブルクリックしたアドレスにメモリ • トランザクションが あると、すべてのアクティビティを要約する次のポップアップ • ウィンドウが表示されます。 図 3-6: PureView の [Transaction Summary] ウィンドウ 3.5.3 トランザクション履歴の表示 PureView では、全体的な情報を提供するトランザクション履歴が表示されます。PureView を 起動すると、この表示ですべてのメモリ • トランザクションのリストを確認できます。トラン ザクション履歴ウィンドウの情報レベルは、次のように .denalirc ファイル内のパラメータ で制御できます (.denalirc ファイルの詳細については、38 ページの「.denalirc ファイルを 使用したメモリ • シミュレーション • モデルの制御」を参照してください )。 1. HistoryFile:基本的なリード / ライト動作とメモリ動作 (precharge、nop、refresh など ) に 関する詳細が提示されます。 MMAV ユーザ • ガイド 11/6/08 35 2. HistoryDebug:HistoryFile の情報に加え、バンク、行、および列のアドレス、バンクの状 態など、詳細なデバッグ情報も表示されます。 図 3-7: PureView の [Transaction History] ウィンドウ [Transaction History] ウィンドウの特定の行をダブルクリックすると、[Memory Contents] ウィ ンドウの該当する時刻とアドレスが表示されます。 3.6 PureView でのポスト • プロセス 前述のように、PureView は、シミュレーション時の対話型モードとポスト • プロセス • モード の 2 つのモードで使用することができます。ポスト • プロセス • モードでを使用するには、 デー タベース • ファイルがあらかじめ存在しなければなりません。ポスト • プロセス • モードで PureView を使用するには、次の手順を実行します。 1. .denalirc ファイル内またはテストベンチ内から SimulationDatabase を設定し、シ ミュレーションを実行します。 2. PureView を起動し、シミュレーション • データベース • ファイルを開きます。 3. デバッグするメモリ • インスタンスを開きます。 上記のすべての機能は、すでに有効になっています。 3.7 Mentor Graphic's の Seamless HW/SW Co-Verification での PureView の使用 DenaliOwn と DenaliOwnClass という Seamless 内のメモリの制御をデナリに渡す 2 つの新し い .denalirc の機能があります。 注意: Seamless 環境内で PureView を使用するには、これらの設定を使用してメモリの所有 権をデナリに渡す必要があります。 MMAV ユーザ • ガイド 11/6/08 36 DenaliOwn .denalirc設定を使用して、 デナリへの特定のインスタンスを"own"に渡します。 たと えば、Seamless でメ モリ • イン スタ ンス "testbench.rams.sdram0" を表 示す るに は、 .denalirc 変数を次のように設定します。 DenaliOwn /testbench/rams/sdram0 また、デナリがメモリ • クラス全体を所有できるように Seamless で指示することもできます。 メモリ • クラスとは特定のメモリ • タイプ (SDRAM, DDR_SDRAM、Flash、 SRAM など ) のこと です。たとえば、Seamless で実行しているときに PureView で SDRAM メモリ • インスタンス を表示するには、.denalirc 変数を次のように設定します。 DenaliOwnClass sdram 注意: DenaliOwn および DenaliOwnClass パラメータに複数のメモリ • クラスを追加するには、 セミコロンでメモリ • クラスを分割し、これらのクラスをテキストの同一行に置くよ うにしてください。 例: DenaliOwn /testbench/rams/sdram0;/testbench/rams/sdram1;*ddr* DenaliOwnClass sdram;ddr MMAV ユーザ • ガイド 11/6/08 37 CHAPTER 4 4 デナリの Memory Modeler Advanced Verification (MMAV) の使用 デナリの MMAV 製品は、デナリの世界有数のモデリング機能を詳細な検証機能によって拡張 します。この検証機能は、メモリ • サブシステムの検証を強化することを目的としています。 データとデータ • トランザクションを使用してシステムを検証することにより、 検証サイクル 時間を大幅に短縮する一方で、検証の対象範囲を拡大することができます。 4.1 .denalirc ファイルを使用したメモリ • シミュレーション • モ デルの制御 MMAV の機能を最大限に発揮させるために、デナリはランタイム制御初期設定ファイルの $DENALI/.denalirc を使用しています。このファイルは、シミュレーション中のモデルの 動作を制御する設定を保存したものです。最大 4 つの $DENALI/.denalirc ファイルを使用 して、この設定を保存することができます。たとえば、特定のシミュレーションの 1 つの設 定だけを変更するには、.denalirc ファイルをワーキング • ディレクトリに作成して、特定 のシミュレーションの設定を保存します。これらの初期設定ファイルが置かれている場所は 以下のとおりで、リストの順番での優先度になります。 表 4-1: .denalirc の優先度 場所 説明 $DENALIRC 環境変数 ./.denalirc 特定シミュレーションのデフォルト ~/.denalirc ユーザ • デフォルト $DENALI/.denalirc システム • デフォルト 通常、.denalirc ファイルは、初期設定に使用されるキーワードと値がペアで記述されるテ キスト•ファイルです。#で始まる行はすべてコメントとして無視されます。 インストレーショ ン • ディレクトリに格納されているデフォルトの .denalirc ファイルには、コメントによっ てすべてのスイッチの使用方法が記載されています。説明では、明確にするために大文字と 小文字を混在させて使用しますが、スイッチでは、その値には大文字と小文字の区別があっ ても、名前には大文字と小文字の区別はありません。 次のセクションでは、 メモリ • モデル動作を変更するために初期設定ファイルに設定できるス イッチ ( またはフラグ ) についていくつか説明します。 MMAV ユーザ • ガイド 11/6/08 38 HistoryFile HistoryFile スイッチを設定すると、履歴ファイルが作成されます。このファイルには、各 メモリに対するリードとライトの処理がすべて記載されます。デフォルトの .denalirc で は、このスイッチはオフになっています。このスイッチを設定するには、該当する行のコメ ントを解除し、履歴を記述するファイル名を指定してください。たとえば、履歴ファイルを memresults.his として保存するには、 .denalirc ファイルの該当行を次のようにしてくだ さい。 HistoryFile memresults.his HistoryDebug HistoryDebug スイッチを使用すると、 さらに詳細な情報が HistoryFile の結果に保存され ます。デフォルトの .denalirc では、このスイッチはオフになっています。このスイッチを 設定するには、該当する行のコメントを解除してください。例: HistoryDebug On HistoryDebugLoad HistoryDebugLoad スイッチを使用すると、 上記よりさらに詳細な情報が HistoryFile の結 果に保存されます。これには、履歴ファイルに対する個別のアドレス • ロードもそれぞれ含ま れます。したがって、このスイッチを設定すると、HistoryFile のサイズが大幅に増えま す。デフォルトの .denalirc では、このスイッチはオフになっています。このスイッチを設 定するには、該当する行のコメントを解除してください。例: HistoryDebugLoad On HistoryInSimLog HistoryInSimLog を1に設定すると、 シミュレータからの出力(これはシミュレータによって 異なります ) と共に反映され、履歴メッセージを確認することができます。これによって、デ ナリの履歴はテストベンチ出力と合わせて出力されます。デフォルトは 0 ( オフ ) です。 HistoryInSimLog 0 TraceFile TraceFile スイッチを設定すると、リードやライトなど、メモリ上で行われたイベントをす べて記載したファイルが作成されます。このファイルは主に、ユーザのメモリ • シミュレー ション環境を理解し、再現するために、デナリのサポート部門が貴重な診断ツールとして使 用するものです。デフォルトの .denalirc では、このスイッチはオフになっています。この スイッチを設定するには、適切な行のコメントを外し、データを保存するファイル名を指定 します。たとえば、トレース • ファイルを testcase.trc として保存するには、.denalirc ファイルの該当行を次のようにしてください。 TraceFile testcase.trc TraceTimingChecks TraceTimingChecks を使用すると、 シミュレーション時のすべてのタイミング • チェックを トレースできます。デフォルトの .denalirc では、このスイッチはオフになっています。 TraceTimingChecks スイッチをオンにするには、値を 1 に設定します。例: TraceTimingChecks 1 MMAV ユーザ • ガイド 11/6/08 39 LicenseQueueTimeout LicenseQueueTimeout を使用すると、ライセンスを使用することができない場合にサスペ ンド状態で待たなければならない時間 ( 単位は分 ) を指定することができます。次の例では、 ライセンスが使用できるようになるまで、デナリは 120 分間待ちます。 LicenseQueueTimeout 120 LicenseQueueRetryDelay LicenseQueueRetryDelay は、 ライセンスを要求する ping を開始するまでの待ち時間 ( 単位 は秒 ) を指定します ( こうすることにより、ライセンスのログ • ファイルがオーバーフローす ることはなくなります )。次の例では、デナリはデナリ • ライセンスを要求して 60 秒ごとに ping を行います。 LicenseQueueRetryDelay 60 SimulationDatabase SimulationDatabaseは、 ポストプロセスのシミュレーション•データベースのファイル名と 場所を指定します。 SimulationDatabase /tmp/simdbxxx ここで、XXX は他のユーザとの衝突を避けるための一意の数です。必要に応じて、上記以外 のデータベース場所を指定することもできます。ただし、パフォーマンス上の理由により、 データベースをローカル • ディスク上に配置することを強くお勧めします。 注意: データベースを生成するときには、HistoryFile パラメータを有効にする必要があり ます。 データベースの生成を無効 ( デフォルト ) にするには、次のコマンドを使用します。 SimulationDatabase Off SimulationDatabasePattern データベース情報を特定のインスタンスに限定するには、次のステートメントを使用してく ださい。 SimulationDatabasePattern instance2 ワイルドカード • パターンを使用する場合 ( たとえば、インスタンス名のパスに [] を使用 ) に、 SimulationDatabasePattern パラメータに指定するには、エスケープを使用する必要があ ります。 たとえば、"top.m_system.bank[0].index[0].mem" の場合は、次のコマンドを使用します。 SimulationDatabasePattern top.m_system.bank\[0\].index\[0\].mem これらすべてを 1 つのパターンにまとめるには、次のコマンドを使用します。 SimulationDatabasePattern top.m_system.bank???.index???.mem MMAV ユーザ • ガイド 11/6/08 40 SimulationDatabaseBuffering データベースをディスクに直ちにフラッシュするために、シミュレーション • データベース • バッファリングの有効 / 無効を切り替えることができます。 直ちにフラッシュするとパフォー マンスが低下しますが、 「異常終了」の状況をデバッグしている場合は便利です。 SimulationDatabaseBuffering on/off TimingChecks TimingChecks スイッチは、 メモリ • モデルのタイミング • チェック ( つまり、 セットアップ時 間やホールド時間など ) をオンまたはオフにします。デフォルトの .denalirc では、このス イッチはオンになっています。 タイミング • チェックをオフにするには、値を 0 に設定します。 例: TimingChecks 0 RefreshChecks RefreshChecks スイッチは、 DRAM モデルのリフレッシュ• タイミング • チェックをオンまた はオフにします。DRAM モデルのシミュレーションをしていない場合は、このスイッチは無 視されます。デフォルトの .denalirc では、このスイッチはオンになっています。リフレッ シュ • チェックをオフにするには、値を 0 に設定します。例: RefreshChecks 0 RefreshOnReadWrite リードとライトをその特定の行に対するリフレッシュ処理として数える場合は、パラメータ RefreshOnReadWrite を 1 に設定します。その部分の該当する動作では、リードとライトを その行に対するリフレッシュ処理として数える場合もありますが、デナリのデフォルトは、 数えない設定になっています。デフォルト値がこのように設定されているのは、コントロー ラが適切なリフレッシュ• レートを取得するために一部のメモリ • アクセスに依存するのを防 ぐためです。これがサポートされているメモリの種類は、EDRAM、RLDRAM、SDRAM、 DDR SDRAM、および DDR II SDRAM だけです。 RefreshOnReadWrite 1 ReadDQSContentionCheck リード時に DQS でのバスの競合がないかどうかをチェックするには、 ReadDQSContentionCheck を 1 に設定します。 サポート対象は DDR SDRAM だけです。DDR SDRAM モデルは、リード時に DQS でのバスの競合がないかどうかをチェックします。この チェックを無効にするには、ReadDQSContentionCheck を 0 に設定します。 ReadDQSContentionCheck 1 InitialMemoryValue デフォルトでは、メモリ • モデルは X に初期化されます。次のいずれかの値を指定して、メモ リを初期化することができます。 • InitialMemoryValue 0 - すべて 0 に初期化します。 • InitialMemoryValue 1 - すべて 1 に初期化します。 • InitialMemoryValue X - すべて X に初期化します。 • InitialMemoryValue U - すべて U に初期化します。 MMAV ユーザ • ガイド 11/6/08 41 あるいは、16 進数値を指定することもできます。この値は "0x" で始まり、0 ~ 9 と A ~ F ( または a ~ f) の 16 進数値で構成される必要があります。例: InitialMemoryValue 0x3018 この文字列をメモリのワード幅 ( 通常はデータ • サイズ ) より長く拡張することはできません。 ワード幅より短い場合、指定されないビットには 0 が入力されます。 値が上記以外の場合は、メモリはすべて X に初期化されます。 次のように指定することによって、 初期データのためにランダム • データを生成することもで きます。 • InitialMemoryValue randomNoUpdate - モデルはランダム • データによって更新され ません ( つまり、ランダム • データはモデルにライトされません )。したがって、途中にラ イトが発生しないそれ以降のリードで、新しいランダム • データを取得します。 • InitialMemoryValue randomWithUpdate - モデルはランダム • データによって更新さ れます ( つまり、ランダム • データはモデルにライトされます )。したがって、途中にライ トが発生しないそれ以降のリードで、初めて返されたのと同じランダム • データを取得し ます。 あるいは、任意の C 関数を使用して、初期データ ( ランダム • データやパリティ付きランダム • データなど ) を指定することもできます。 具体例については、$DENALI/ddvapi/example/fillValue を参照してください。 InitMessages InitMessages を設定すると、 初期化時にデザイン内でインスタンス生成された各メモリ • コ ンポーネントに関する情報メッセージが、システムによってレポートされます。デフォルト の .denalirc では、InitMessages がオンになっています。InitMessages をオフにする には、次のように値を Off に設定します。 InitMessages Off TracePattern TracePattern を使用すると、特定のインスタンス名パラメータのみを取り込むことによっ て、トレース • ファイル ( 上記を参照 ) のサイズを制限できます。*、?、[] などのシェル "glob" パターンを使用することができます。TraceFile のコメントを解除する必要があります。 たとえば、"sdram" というパターンを持つメモリ • インスタンスだけをトレースするには、次 のコマンドを使用します。 TracePattern *sdram* ワイルドカード • パターンを使用する場合 ( たとえば、インスタンス名のパスに [] を使用 ) に、 TracePattern パラメータに指定するには、エスケープを使用する必要があります。 たとえば、"top.m_system.bank[0].index[0].mem" の場合は、次のコマンドを使用します。 TracePattern top.m_system.bank\[0\].index\[0\].mem これらすべてを 1 つのパターンにまとめるには、次のコマンドを使用します。 TracePattern top.m_system.bank???.index???.mem MMAV ユーザ • ガイド 11/6/08 42 HistoryPattern HistoryPattern を使用すると、特定のインスタンス名パラメータだけを取り込むことに よって、履歴ファイル ( 上記を参照 ) のサイズを制限することができます。*、?、[] などの シェル "glob" パターンを使用することができます。 たとえば、 "sdram" というパターンを持つメモリ • インスタンスだけの履歴を記録するには、 次 のコマンドを使用します。 HistoryPattern *sdram* ワイルドカード • パターンを使用する場合 ( たとえば、インスタンス名のパスに [] を使用 ) に、 HistoryPattern パラメータに指定するには、エスケープを使用する必要があります。 たとえば、"top.m_system.bank[0].index[0].mem" の場合は、次のコマンドを使用します。 HistoryPattern top.m_system.bank\[0\].index\[0\].mem これらすべてを 1 つのパターンにまとめるには、次のコマンドを使用します。 HistoryPattern top.m_system.bank???.index???.mem IrregularClock ランダム出力の遅延スケジューリング機能を備えたモデル (DDR SDRAM、DDR-II、FCRAM、 RDRAM、RLDRAM など ) では、出力スケジューリングと一部のタイミング • チェックは、実 際のクロック • サイクル時間の影響を受けます。クロック • サイクル時間は通常、シミュレー ションの最初の数サイクルの間だけ、モデルによって測定されます。ただし、次のフラグの いずれかが使用されている場合を除きます。 不均一クロック ( 一定でないクロック幅 ) で実行している場合は、この機能を設定する必要 があります。 通常の ( 均一 ) クロックで実行している場合は、 デナリ • モデルは許容できるデー タ有 効範 囲内 で、デー タ出 力を「ラ ンダ ム化」す るこ とが で きま す ( 下 記の 「RandomOutputDelay」を参照 )。IrregularClock を 1 に設定すると、このランダム化は 自動的にオフになります。 このスイッチを設定すると、サイクルごとにクロック幅が測定され、ランダム出力の遅延ス ケジューリング機能はオフになります。 IrregularClock 1 ClockStableCycles これは、クロックが安定していると MMAV が見なす場合での 1 行内のサイクル数を設定する ときに使用します。これは、DDR、FCRAM、および RLDRAM で必要です。通常はクロック 数が安定するまでにしばらく時間がかかるからです。 ClockStableCycles 1000 RandomOutputDelay このパラメータは、ランダム出力の遅延スケジューリング機能を備えたモデル (DDR、 FCRAM、DDR など ) で使用します。そうすることにより、メモリ • コントローラの機能が向 上します。検証サイクルの初期段階でオフにしてもかまいません。デフォルトでは、この値 はオンです。 RandomOutputDelay 1 MMAV ユーザ • ガイド 11/6/08 43 OutputTiming デフォルトでは、デナリのメモリ • モデルはデータ出力を駆動します。このとき、SOMA ファ イル • パラメータに基づく遅延が発生します。出力の遅延をゼロにするには、OutputTiming 変数を "0" に設定する必要があります。 これは主にサイクル • ベースのシミュレーションで使 用します。 OutputTiming 0 InitChecks DRAM の初期化チェック機能は、InitChecks パラメータを使用してオフにすることができ ます。初期化チェック機能がオフにされると、適切な DRAM 初期化シーケンスがあるかどう かをデナリはチェックしません。このコマンドは注意して使用してください。オフにすると、 実際のエラーが隠されてしまうことがあるからです。 初期化チェックをオフにするには、次のように設定します。 InitChecks 0 InitChecksPauseTime この変数は、DRAM モデルで実行される tpause/tinit チェック、および SSRAM モデルで実行 される DLL Lock Time チェックをデナリ • モデルが無視するときに使用します。 InitChecksPauseTime 0 ErrorMessages このオプションを使用すると、警告メッセージとエラー• メッセージを全面的にオンまたはオ フにすることができます。 エラーと警告はデナリの履歴ファイルとトレース • ファイルに引き 続き取り込まれますが、シミュレータの出力 / コンソールにはメッセージが表示されなくな くります。 ErrorMessages on ErrorMessages off ErrorMessagesStartTime デナリでは、特定の時刻にエラー• メッセージと警告メッセージをオンにする機能も用意して あります。これにより、デナリ • モデルがエラーのレポートを開始する前にリセットやデバイ スの初期化を行うための時間を確保することができます。エラーと警告はデナリの履歴ファ イルとトレース • ファイルに引き続き取り込まれますが、シミュレータの出力 / コンソールに はメッセージが表示されなくなくります。構文については、次の例を参照してください。 ErrorMessagesStartTime ErrorMessagesStartTime ErrorMessagesStartTime ErrorMessagesStartTime 0ps # default "20 us" "200ms" 200000 ns ExitOnErrorCount この変数を使用すると、デナリのエラーが指定件数だけ発生したらシミュレーションを終了 するよう指定することができます。エラーのしきい値を .denalirc ファイルに次のように指 定します。 ExitOnErrorCount 10 MMAV ユーザ • ガイド #exits simulation after 10 Denali errors 11/6/08 44 ErrorCount Verilog コードでは、整数変数を使用して、デナリ • メモリ • モデルで検出したエラーの数を知 ることができます。テストベンチで整数変数を宣言した後、.denalirc ファイル内の ErrorCount スイッチを通じてエラー• カウント変数として登録します。 デナリ • モデルでは、 エラーを検出するたびに、この変数の値が 1 つずつ増えます。エラー • カウント変数をモニタ したり、その値によって分岐したりできます。 使用例: テストベンチで、次のように指定します。 module testbench; integer errCount; // monitor, display this .denalirc で、次の行のコメントを解除します。 ErrorCount testbench.errCount TclInterp この設定は NC Sim ユーザが使用します。デフォルトでは、NC Sim を備えたデナリの Tcl イ ンタープリタはオフになっています。これは、以前に NC Sim の Tcl インタープリタとの互換 性に問題があったからです。NC Sim でのデナリの Tcl インタープリタをオンにするには、次 の .denalirc 設定を使用して、明示的にオンにする必要があります。 TclInterp 1 TrackAccessFromInit init_file またはmmloadをメモリに事前にロードしてから、 ブレークポイントを設定してお り、かつこれらのアクションをメモリ • ライト • アクセスとして数える場合は、次の変数を設 定してください ( デフォルト値は 0 です )。 TrackAccessFromInit 1 これは、ブレークポイントをアクセス対象外のメモリ位置に設定するときに便利です。 EiMessages ソフト • エラー挿入のメッセージがレポートされないようにします。デフォルトでは、挿入エ ラーはすべてレポートされます。 EiMessages off DifferentialClockChecks この設定により、差動クロック • チェックは実行されなくなります。デフォルトでは、モデル は負のクロック信号をチェックして、正のクロック信号との同期をとります。 DifferentialClockChecks 0 MMAV ユーザ • ガイド 11/6/08 45 DifferentialClockSkew この設定を使用すると、差動クロック • チェックを行うために、正のクロック信号と負のク ロック信号の間の許容スキューを指定することができます。スキューは 2 つのうちどちらか 一方の信号が切り替わってから、逆の信号が切り替わるまでの時間で測定されます。デフォ ルトでは、スキューは許容されません。実際のデバイスでは、差動クロック • スキューは無意 味であることに注意してください。これは、クロック • エッジが、正のクロック信号と負のク ロック信号との交点として定義されているからです。このパラメータは、立ち上がり時間と 立ち下がり時間が、シミュレーションにモデル化されておらず、その値がベンダによって提 供されていない、という事実を考慮したものです。スキューは時刻の値と単位を使用して指 定されます。 DifferentialClockSkew 150 ps AssertionMessages アサーションがトリガされたときに表示されるメッセージを表示しないようにします。デ フォルトでは、アサーションがトリガされるとメッセージが出力されます。 AssertionMessages off TraceBackdoorReadWrite バックドア • リード / ライトのトレースを無効にします。デフォルトでは、デナリのトレース • ファイル ( 指定されている場合 ) でトレースされます。 TraceBackdoorReadWrite 0 DenaliByPass デナリのすべてのモデルを機能しないものとし、シミュレーション時にライセンスをチェッ クアウトしません。デフォルト値は 0 です。 DenaliByPass 1 4.1.1 レジスタ • ファイル固有の .denalirc パラメータ SuppressUnknownAddrReadError 名前が "InstNamePattern" に一致するインスタンスから不明なアドレスからリードされたとき に表示されるエラー • メッセージを表示しないようにします。 SuppressUnknownAddrReadError InstNamePattern ワイルドカード • パターンを使用する場合 ( たとえば、インスタンス名のパスに [] を使用 ) に、 SuppressUnknownAddrReadError パラメータに指定するには、エスケープを使用する必要 があります。 たとえば、"top.m_system.bank[0].index[0].mem" の場合は、次のコマンドを使用します。 SuppressUnknownAddrReadError top.m_system.bank\[0\].index\[0\].mem これらすべてを 1 つのパターンにまとめるには、次のコマンドを使用します。 SuppressUnknownAddrReadError top.m_system.bank???.index???.mem MMAV ユーザ • ガイド 11/6/08 46 4.1.2 IBM-EDRAM 固有の .denalirc パラメータ SuppressRefreshInfoMessages SuppressRefreshInfoMessages 1 を使用すると、エラーでも警告でもないときには、実際 のリフレッシュ• ウィンドウ • サイズについての情報メッセージが表示されなくなります。デ フォルト値は 0 であり、リフレッシュ • サイクルごとにレポートされます。 SuppressRefreshInfoMessages 0 4.1.3 RDRAM 固有の .denalirc パラメータ WarnSuppress 通常のタイミングとプロトコルのエラー状況に加えて、デナリの RDRAM モデルは、次の危 険な操作についても警告を発行します。 • ライト • バッファが廃棄される前の上書き (WR-WR-RD-RD-RTR など ) • バンクが廃棄される前のプリチャージ ( ルール CR8) これらの警告は、次のように .denalirc ファイルの WarnSuppress パラメータを設定する ことによって、表示しないようにすることができます。 WarnSuppress 1 TimingChecksReportOnly このオプションをオンにすると、タイミング • エラーが発生したときに、メモリを破壊して データ • バス上に "X" を駆動するデナリ • モデルの機能がオフになります。 このオプションを 使用すると、 タイミング • エラーが発生してもモデルはメッセージを発行するだけになり、 "X" を駆動することはなくなります。これは、エラーの初期評価で非常に便利な場合があります。 ただし、エラーがレポートされてもシミュレーションは続行されます。 TimingChecksReportOnly 1 TimingChecksStartTime デナリでは、特定の時刻にタイミング • チェックをオンにする機能も用意してあります。これ により、デナリ • モデルがタイミング • エラーのチェックを開始する前に、リセットとデバイ ス初期化を行うための時間を確保することができます。構文については、次の例を参照して ください。 TimingChecksStartTime TimingChecksStartTime TimingChecksStartTime TimingChecksStartTime MMAV ユーザ • ガイド 0ps "20 us" "200ms" 200000 ns 11/6/08 47 4.1.4 RLDRAM 固有の .denalirc パラメータ RldramInitCyclesCheck 初期化時の各リフレッシュ間の 2000 サイクル • チェックをオフにします。 RldramInitCyclesCheck 0 RldramInitRefreshChecks 初期化時の各バンクへのリフレッシュ• チェックをオフにするには、これを "0" に設定します。 RldramInitRefreshChecks 0 InitMrsAddressStable この設定は、Init MRS 時のアドレス安定性チェックをオンにするときに使用します。 InitMrsAddressStable を次のように設定して、チェックを強制的に行わせることもでき ます。 InitMrsAddressStable 1 4.1.5 DDR-II SDRAM 固有の .denalirc パラメータ OffChipDriveImpedanceChecks OffChipDriveImpedanceChecks 変数は、OCD チェックをオフにするときに使用します。こ の変数が 0 であると、OCD レベルが有効範囲外であっても、警告メッセージは発行されず データも破壊されません。OCD をオンにする SOMA 機能もあることに注意してください。 SOMA 機能がオフであると、OCD はモデルによって完全に無視されます。 OffChipDriverImpedanceChecks 0 MRSmsgsInSimLog MRS/EMRS 情報メッセージが、履歴とシミュレーション • ログ / トランスクリプト • ファイル に常に記録されます。このメッセージをシミュレーション • ログに記録しないようにするに は、MRSmsgsInSimLog パラメータを 0 に設定します。デフォルトでは、このパラメータは "1" に設定されています。 MRSmsgsInSimLog 0 4.1.6 DDR-II と DDR3 に固有の .denalirc パラメータ noXsInReadData モデル駆動リード • データの無効な範囲が、X で埋められません。 noXsInReadData 0 RandomInsteadOfXInReadData モデル駆動リード • データの無効な範囲が、X 以外のランダム • データで埋められます。 RandomInsteadOfXInReadData 0 MMAV ユーザ • ガイド 11/6/08 48 4.1.7 ESSRAM 固有の .denalirc パラメータ SuppressPortContention SuppressPortContention 変数は、 InstNamePattern で指定されたパターンに名前が一致 するインスタンスで、 リード • ライト • ポート競合エラー• メッセージを表示しないようにする ときに使用します。 SuppressPortContention InstNamePattern ワイルドカード • パターンを使用する場合 ( たとえば、インスタンス名のパスに [] を使用 ) に、 SuppressPortContention パラメータに指定するには、 エスケープを使用する必要があり ます。 たとえば、"top.m_system.bank[0].index[0].mem" の場合は、次のコマンドを使用します。 SuppressPortContention top.m_system.bank\[0\].index\[0\].mem これらすべてを 1 つのパターンにまとめるには、次のコマンドを使用します。 SuppressPortContention top.m_system.bank???.index???.mem 4.1.8 Mentor Graphics ModelSim 固有の .denalirc パラメータ ModelSimTimeDefinitionToggle デナリは ModelSim シミュレータのために時間の上位ビットと下位ビットをできるだけ正確 に解釈しようと努めます。ModelSim ではこの動作はプラットフォームとリリースによって異 なります。デナリの自動的な動作があらゆるケースで適切であるとは限りません。そこで、 次のスイッチが用意してあり、デナリの自動的な動作をユーザが制御することができます。 時間の上位ビットと下位ビットを自動的に解釈する動作を無効にして、切り替わる動作をオ フにするには、次のコマンドを使用します。 ModelSimTimeDefinitionToggle off 切り替わりをデフォルトの動作に設定する ( 一部のメッセージを表示しない ) には、次のコ マンドを使用します。 ModelSimTimeDefinitionToggle on 4.1.9 Mentor Graphics Seamless HW/SW Co-Verification 固有の .denalirc パラメータ デナリの 3.0 がリリースされる以前には、Seamless の顧客はデナリの PureView デバッガを Seamless で使用することができませんでした。これは、Seamless がメモリを「所有する」デ ザインになっていたからです。リリース 3.0 でデナリと Mentor Graphics はこの問題を解決し ました。.denalirc の新機能が 2 つあり、DenaliOwn と DenaliOwnClass といいます。こ れらは Seamless 内のメモリの制御をデナリに渡します。その結果、PureView を使用してメモ リの内容をデバッグできるようになりました。 Seamless 環境内で PureView を使用するには、デナリの次の設定を使用して、メモリの所有権 をデナリに渡す必要があります。 MMAV ユーザ • ガイド 11/6/08 49 DenaliOwn DenaliOwn 設定を使用して、特定のインスタンスをデナリに渡してデナリが「所有」できる ようにします。 たとえば、Seamless のメモリ • インスタンス "testbench.rams.sdram0" を表示するには、変数を 次のように設定します。 DenaliOwn /testbench/rams/sdram0 ワイルドカード • パターンを使用する場合 ( たとえば、インスタンス名のパスに [] を使用 ) に、 DenaliOwn パラメータに指定するには、エスケープを使用する必要があります。 たとえば、"top.m_system.bank[0].index[0].mem" の場合は、次のコマンドを使用します。 DenaliOwn top.m_system.bank\[0\].index\[0\].mem これらすべてを 1 つのパターンにまとめるには、次のコマンドを使用します。 DenaliOwn top.m_system.bank???.index???.mem DenaliOwnClass また、デナリにメモリ • クラス全体を所有させるよう Seamless に指示することもできます。メ モリ • クラスとは特定のメモリの種類 (SDRAM、DDR_SDRAM、Flash、SRAM など ) のこと です。たとえば、SDRAM を Seamless で実行している場合に、PureView で SDRAM メモリ • イ ンスタンスを表示するには、変数を次のように設定します。 DenaliOwnClass sdram ワイルドカード • パターンを使用する場合 ( たとえば、インスタンス名のパスに [] を使用 ) に、 DenaliOwnClass パラメータに指定するには、エスケープを使用する必要があります。 たとえば、"top.m_system.bank[0].index[0].mem" の場合は、次のコマンドを使用します。 DenaliOwnClass top.m_system.bank\[0\].index\[0\].mem これらすべてを 1 つのパターンにまとめるには、次のコマンドを使用します。 DenaliOwnClass top.m_system.bank???.index???.mem 4.1.10 OneNand Flash の .denalirc パラメータ minimizeCallbacks oneNand Flash にはバッファ RAM と Flash 配列があり、データがバッファ RAM から Flash 配列、 または Flash 配列からバッファRAM に移動されたときに使用されます。minimizeCallbacks がオンの場合、該当するコールバックだけが発生します。たとえば、バッファ RAM をリー ドして Flash 配列にライトするプログラム • コマンドを発行し、かつ minimizeCallbacks が有効 である場合は、Flash 配列へのライト • コールバックだけが発生します。 minimizeCallback 1 MMAV ユーザ • ガイド 11/6/08 50 oneNandEnableReadArrayCBs この変数がオンであり、しかもたとえば、ロードが実行されると、Flash 配列からの真のリー ドが行われます。その結果、Flash 配列の各リードに対してコールバックが発行されます。 oneNandEnableReadArrayCBs 1 4.1.11 アサーションの .denalirc パラメータ AssertionCoverageFile アサーション • カバレッジをオンにして、シミュレーションの最後にカバレッジ統計情報を ファイルに出力するには、このパラメータをそのファイル名に設定します。このパラメータ をオフに設定するか、または .denalirc ファイルに含めない場合は、シミュレーションでア サーション • カバレッジは使用されません。 AssertionCoverageFile filename AssertionPassMessages アサーション • チェックに合格するたびに履歴メッセージが表示されるようにするには、 この パラメータを 1 に設定します。AssertionCoverageFile が存在しないか、またはオフに設 定されている場合は、モデルはこのパラメータを無視します。 AssertionPassMessages 0 AssertionPassCallbacks アサーション • チェックに合格するたびにコールバックが生成されるようにするには、 このパ ラメータを 1 に設定します。AssertionCoverageFile が存在しないか、またはオフに設定 されている場合は、モデルはこのパラメータを無視します。 AssertionPassCallbacks 0 LogUncoveredAssertions アサーション • カバレッジ • ログにアサーションの種類をすべて記録する ( 合格 / 不合格を問わ ず ) には、このパラメータを 1 に設定します。カバレッジ外のアサーションの総数も記録さ れます。 LogUncoveredAssertions 0 AssertionChecklistFile カバレッジ統計値を指定ファイルに出力して、エラー ID ではなくリファレンス ID (PCISIG ID など ) でソートするには、このパラメータをそのファイル名に設定します。 AssertionCoverageFile を .denalirc ファイルに含めて、 かつ AssertionCoverageFile に指定されたファイル名とは別のファイル名にする必要があります。 AssertionChecklistFile filename MMAV ユーザ • ガイド 11/6/08 51 AssertionCoverageByTest 1 に設定すると、各 PureSuite テストの結果が、カバレッジ • ファイルとチェックリスト • ファ イルに各テスト名の後に出力されます。PureSuite を実行していなければ、モデルはこのパラ メータを無視します。 AssertionCoverageByTest 0 AssertionCoverageSummary 1 に設定すると、シミュレーション全体のアサーション • カバレッジの累積統計情報が、カバ AssertionCoverageByTest レッジ • ファイルとチェックリスト • ファイルに出力されます。 も 1 に設定すると、カバレッジ • ファイルとチェックリスト • ファイルに各テストの結果、そ の後に結果の概要が記載されます。 AssertionCoverageSummary 1 .denalirc の概要をまとめた一覧表 4.1.12 表 4-2: キーワード 値 .denalirc のキーワード デフォルト 説明 HistoryFile ファイル名 なし デナリのリード / ライト情報を記載したファイルを保存 します。 HistoryDebug On/Off Off HistoryFile を使用して作成したファイルにデバッグ HistoryDebugLoad On/Off Off ファイルからロードされた場合、各アドレスの追加情報を 追加します。 HistoryInSimLog 0/1 0 ユーザのシミュレーション•ログと HistoryFile で指定 されたファイル名に履歴ファイルをリダイレクトします。 TraceFile ファイル名 なし トレース情報をファイルに保存します。主にデナリのサ ポート部門がお客様の問題をデバッグするときに使用し ます。 TraceTimingChecks 0/1 0 TraceFile を使用して作成したファイルにタイミング • LicenseQueueTimeout 時刻値 ( 単位は分 ) なし 情報を追加します。 チェック情報を追加します。 LicenseQueueTimeout を使用すると、ライセンスを 使用することができない場合にサスペンド状態で待たなけ ればならない時間 ( 単位は分 ) を指定することができます。 LicenseQueueRetryDelay 時刻値 ( 単位は秒 ) なし LicenseQueueRetryDelay は、ライセンスを要求す る ping を開始するまでの待ち時間 ( 単位は秒 ) を指定しま す ( こうすることにより、ライセンスのログ • ファイルが オーバーフローすることはなくなります )。 SimulationDatabase ファイル名 このパラメータを設定すると、シミュレーション • データ ベースのファイルが指定されます。 Off 注意 : HistoryFile も設定する必要があります。 SimulationDatabasePattern パターン文字列 SimulationDatabaseBuffering On/Off MMAV ユーザ • ガイド す べ て の イ 指定した「パターン」に関する情報のみをシミュレーショ ンスタンス ン • データベース • ファイルに追加します。データベース • ファイルにダンプされる情報の量を制限するときに使用 します。 Off データベースをディスクに直ちにフラッシュする場合は、 simdb バッファリングをオフにしてください。直ちにフ ラッシュするとパフォーマンスが低下しますが、「異常終 了」の状況をデバッグしている場合は、便利です。 11/6/08 52 表 4-2: キーワード 値 .denalirc のキーワード ( 続き ) デフォルト 説明 TimingChecks 0/1 1 セットアップ / ホールドのタイミング違反をチェックし ます。 RefreshChecks 0/1 1 DRAM リフレッシュ違反をチェックします。 RefreshOnReadWrite 0、1 0 リードとライトをその特定の行に対するリフレッシュ処理 として数える場合は、 パラメータ RefreshOnReadWrite を 1 に設定します。その部分の該当する動作では、リード とライトをその行に対するリフレッシュ処理として数え る場合もありますが、デナリのデフォルトは、数えない設 定になっています。デフォルト値がこのように設定されて いるのは、コントローラが適切なリフレッシュ•レートを取 得するために一部のメモリ • アクセスに依存するのを防ぐ ためです。これがサポートされているメモリの種類は、 EDRAM、RLDRAM、SDRAM、DDR SDRAM、および DDR II SDRAM だけです。 ReadDQSContentionCheck 0、1 0 リード時に DQS でのバスの競合がないかどうかをチェッ クするようモデルに指示します。 InitialMemoryValue X、1、0 Off/On X すべてのメモリの初期値。 InitMessages On デザイン内のインスタンスに関するメッセージをオンま たはオフにします。 TracePattern パターン文字列 す べ て の イ 指定した「パターン」に関する情報のみをトレース • ファイ ンスタンス ルに追加します。トレース•ファイルにダンプされる情報の 量を制限するときに使用します。 HistoryPattern パターン文字列 IrregularClock 0/1 ClockStableCycles サイクル数 RandomOutputDelay 0/1 OutputTiming 0/1 InitChecks 0/1 す べ て の イ 指定した「パターン」に関する情報のみを履歴ファイルに ンスタンス 追加します。履歴ファイルにダンプされる情報の量を制限 するときに使用します。 0 クロックが定期的でない場合は、1 に設定する必要があり ます。こうすると、データがクロック • エッジに整列され ます。 0 クロックのサイクル時間を判断するときに使用される安 定したクロック • サイクルの数を指定します。 1 IrregularClock が 0 の場合、このパラメータで一部の メモリ • デバイスに対して、出力のランダム化のオン / オフ を指定することができます。 1 デフォルトでは、メモリ•モデルは出力を遅延しながら駆動 します。0 に設定すると、遅延はゼロになります。主にサ イクル • ベースのシミュレーションで使用します。 1 初期化チェックをオンまたはオフにします。 InitChecksPauseTime 0/1 1 この変数は、DRAM モデルで実行される tpause/tinit チェッ ク、および SSRAM モデルで実行される DLL Lock Time チェックをデナリ • モデルが無視するときに使用します。 ErrorMessages On/Off On エラー•メッセージを完全にオフにするときに使用します。 履歴ファイルとトレース•ファイルが有効な場合は、これら のファイルにメッセージが記録されます。 ErrorMessagesStartTime 時刻値 0 ns エラー • メッセージのレポートの開始時刻を指定するとき に使用します。初期化中やリセット中にメッセージが表示 されないようにすることができます。履歴ファイルとト レース•ファイルが有効な場合は、これらのファイルにメッ セージが記録されます。 ExitOnErrorCount 変数名 なし この Verilog 機能では、発生したエラーの数をチェックす るために HDL コード内で照会する変数を設定することが できます。 MMAV ユーザ • ガイド 11/6/08 53 表 4-2: キーワード 値 .denalirc のキーワード ( 続き ) デフォルト 説明 ErrorCount 変数名 なし この Verilog 機能では、発生したエラーの数をチェックす るために HDL コード内で照会する変数を設定することが できます。 TclInterp 0/1 0 NC-Sim 使用時のデナリの Tcl インタープリタをオンまた はオフにします。 TrackAccessFromInit Off/On Off 事前ロード処理とバックドア処理が、初期化されていない メモリ • アクセス時にブレークポイントのメモリ「ライト」 アクセスとして数えられるようにします。 EiMessages On/Off On エラー挿入のエラー • メッセージをオフにします。 DifferentialClockChecks 0/1 1 差動クロック • チェックを無効にします。デフォルトでは、 モデルは負のクロック信号をチェックして、正のクロック 信号との同期をとります。 DifferentialClockSkew 時刻の値と単位 0 ns 差動クロック•チェックを行うために、正のクロック信号と 負のクロック信号の間の許容クロック • スキューを指定す ることができます。 AssertionMessages On/Off On デナリのアサーションがトリガされたときにアサーショ ン•メッセージを表示するかどうかを指定します。デフォル ト値は、メッセージを表示する設定です。 TraceBackdoorReadWrite 0/1 1 トレース•ファイルのバックドア•リード/ライト•メッセー ジを無効にすることができます。デフォルトでは、メッ セージはトレース • ファイルに生成されます。 レジスタ • ファイル固有のパラメータ SupressUnknownAddrReadError インスタンス • パターン文字列 インスタン 不明なアドレスが、名前が「インスタンス • パターン文字 スなし 列」に一致するインスタンスからリードされたときに表示 されるエラー • メッセージを表示しないようにします。 IBM eDRAM 固有のパラメータ SuppressRefreshInfoMessages 0/1 0 エラーでも警告でもないときには、実際のリフレッシュ • ウィンドウ • サイズについての情報メッセージが表示され なくなります。デフォルト値は 0 であり、リフレッシュ • サイクルごとにレポートされます。 RDRAM 固有のパラメータ WarnSuppress 0/1 0 特定のプロトコル • チェックでの警告メッセージを表示し ないようにします ( 詳細については上記を参照 )。 TimingChecksReportOnly 0/1 0 タイミング • エラーが発生したときに、メモリを破壊して データ • バス上に "X" を駆動するデナリ • モデルの機能をオ フにします。 TimingChecksStartTime 時刻値 0 ps エラー • メッセージのレポートの開始時刻を指定するとき に使用します。初期化中やリセット中にメッセージが表示 されないようにすることができます。履歴ファイルとト レース•ファイルが有効な場合は、これらのファイルにメッ セージが記録されます。 RLDRAM 固有のパラメータ RldramInitCyclesCheck 0/1 1 初期化時にリフレッシュ • コマンド間の 200 サイクルを チェックします。 RldramInitRefreshCheck 0/1 1 初期化時の各バンクへのリフレッシュ • チェックをオフに します。 InitMrsAddressStable 0/1 0 この設定は、Init MRS 時のアドレス安定性チェックをオン にするときに使用します。 MMAV ユーザ • ガイド 11/6/08 54 表 4-2: キーワード 値 .denalirc のキーワード ( 続き ) デフォルト 説明 DDR-II SDRAM 固有のパラメータ OffChipDriveImpedanceChecks 0/1 1 OCD チェックをオフにします。この変数が 0 であると、 OCD レベルが有効範囲外であっても、警告メッセージは 発行されずデータも破壊されません。OCD をオンにする SOMA 機能もあることに注意してください。SOMA 機能 がオフであると、OCD はモデルによって完全に無視され ます。 eSSRAM 固有のパラメータ SuppressPortContention なし 名前が InstNamePattern で指定されたパターンに一 致するインスタンスで、リード•ライト•ポート競合エラー• メッセージを表示しないようにします。 On ModelSim シミュレータで、時間の上位ビットと下位ビッ トを自動的に解釈します。 パターン文字列 ModelSim シミュレータ固有のパラメータ ModelSimTimeDefinitionToggle On/Off デナリの PureView または Mentor Seamless 固有のパラメータ DenaliOwn /path/to/memory/ なし instance デナリがデバッグのために「所有」する、Seamless に対 する特定のインスタンスを指定します。 デナリがデバッグのために「所有」する特定のメモリ • クラ スを指定します。 SaveDataRadix ddr_sdram、 なし sdram、flash、 sram、およびそ の他のメモリ • ク ラス 2、8、10、または 16 16 SaveAddressRadix 2、8、10、または 16 16 mmsave* アドレスの形式設定を 2 (2 進数 )、8 (8 進数 )、10 (10 進数 )、または 16 (16 進数 ) として指定します。 DenaliOwnClass 4.2 mmsave* データの形式設定を2 (2進数)、8 (8進数)、10 (10 進数 )、または 16 (16 進数 ) として指定します。 シミュレーション時の .denalirc オプションの動的設定 Tcl コマンド mmsetvar を使用すると、テストベンチから .denalirc の設定を直接制御する ことができます。テストベンチ内で mmsetvar を使用するために、デナリの PLI/FLI 呼び出 し mmtcleval コマンドを呼び出して、Tcl コマンド mmsetvar を解釈することができます。 たとえば、履歴ファイル ( 名前は denali.his) の生成をテストベンチから動的にオンにするに は、次の構文を使用します。 Verilog: success = $mmtcleval("mmsetvar historyfile denali.his"); VHDL: success := mmtcleval("mmsetvar historyfile denali.his"); Tcl: mmsetvar historyfile denali.his MMAV ユーザ • ガイド 11/6/08 55 4.3 4.3.1 ライセンスに関するソリューション デナリのライセンスのためのシミュレータ • キューイング ライセンス•キューイングを使用すると、 シミュレーションをロードしたときにデナリのライセン スを使用できない場合にライセンスに空きができるのを「待つ」ことができます。ライセンス • キューイングをオンにできるのは、 シェル環境に環境変数 DENALI_LICENSE_QUEUE_TIMEOUT を 設定し、かつデナリのライセンスを待つ時間 ( 単位は分 ) を指定した場合だけです。たとえ ば、最長 60 分間待つには、次のコマンドを使用します。 setenv DENALI_LICENSE_QUEUE_TIMEOUT 60 デフォルトでは、この機能はオフになっています。 MMAV ライセンスを要求する ping を実行するまでの経過秒数を指定する ( こうして、ライセ ンス • ログ • ファイルのオーバーフローを防ぐ ) には、次のように環境変数を設定します。 setenv DENALI_LICENSE_QUEUE_RETRY_DELAY 60 4.3.2 ライセンスのチェックアウトの高速化 デナリ関連のライセンス•ファイルを環境変数 DENALID_LICENSE_FILE で指定できるように なりました。 例: setenv DENALID_LICENSE_FILE /home/denali/licenses/license.dat この場合、デナリは /home/denali/licenses/license.dat ファイルをホストしている サーバに関連付けられたライセンス • サーバだけを検索します。LM_LICENSE_FILE 環境変数 は無視されます。その結果、ライセンスのチェックアウトが高速化されます。デナリのライ センスを提供しているライセンス • サーバだけがチェックされるからです。また、ライセン ス • ファイル • パスで区切り文字としてコンマがサポートされるようになりました。 4.4 デナリの Tcl インターフェイス デナリはその機能すべてのために直接の Tcl インターフェイスを用意しています。Tcl は検証 言語として普及し続けており、非常に強力です。また、Tcl を複数のシミュレータ間で移植す ることもできます。VHDL シミュレータは、Verilog シミュレータとは異なり共通の C イン ターフェイスを共有せず、大半のシミュレータが Tcl をサポートしているからです。このマ ニュアルの後の方で説明するデナリのすべての機能が、使いやすいように Tcl に移植されて います。 MMAV ユーザ • ガイド 11/6/08 56 4.4.1 ModelSim での使用 ModelSim には組み込み Tcl インタープリタがあるので、デナリのすべての Tcl コマンドを ModelSimコマンド•ラインまたはModelSimの.doファイルから直接実行することができます。 例: mmwriteword testbench.uut1 0 11110000 4.4.2 NCSIM や他の Tcl インタープリタでの使用 NCSIM ( と他のシミュレータ ) には独自の組み込み Tcl インタープリタがあるので、デナリ • ライブラリ libmmcalls.so を任意の Tcl インタープリタからロードして、2 つの Tcl イン タープリタが互いに通信できるようにする必要があります。ロードが完了すると、デナリの すべての mm* 呼び出しを ModelSim の場合と同様に Tcl コマンドとして使用することができ ます。 例: ncsim> load /<denali path>/libmmcalls.so ncsim> set x [mminstanceid .....] ncsim> set a [mmreadword .....] あるいは、限られた個数のデナリの C 外部関数ルーチン (mmtcleval など ) を外部から呼び 出すための代替手段として、デナリの CFC ライブラリを使用することもできます。 libdencfc.soライブラリは$DENALIにあり、 den_CFCPtrという名前のブートストラップ関 数を備えています。もっとも、libmmcalls.so をロードすることをお勧めします。デナリ の Tcl 呼び出しはシミュレータの Tcl インタープリタ内部にロードされるからです。こうし て、関数呼び出しと変数はシミュレータのインタープリタから直接見ることができるように なります。シミュレータにとって外部であるデナリの Tcl インタープリタを使用すると、直 接見ることはできません。 4.4.3 Tcl のコマンド mmtcleval - 別のデナリの Tcl コマンドを評価するために、VHDL または Verilog のテストベン チ内部で使用します。 正常に実行できたときには値 "0"、エラー発生時には値 "-1" を返します。 Tcl を使用して「バックドア」リードを行います。リード先はアドレス =0 のメモリ • インスタ ンス /testbench/top/sdram です。 Verilog: success = $mmtcleval("set memid [mminstanceid testbench.top.sdram]"); success = $mmtcleval("mmreadword $memid 0"); MMAV ユーザ • ガイド 11/6/08 57 VHDL: Cadence NC-VHDL を使用している場合: success := mmtcleval("set memid [mminstanceid :testbench:top:sdram]"); success := mmtcleval("mmreadword $memid 0"); Mentor Graphics ModelSim を使用している場合: success := mmtcleval("set memid [mminstanceid /testbench/top/sdram]"); success := mmtcleval("mmreadword $memid 0"); mmtclcallback - アサーションがトリガされたときに Tcl 関数を呼び出す場合に使用します。ア サーションについては、82 ページの「メモリ • トランザクションのアサーションの設定」を参 照してください。正常に実行できたときには値 "0"、エラー発生時には値 "-1" を返します。 Tcl コールバックを使用して、アサーションがトリガされたときに、Tcl スクリプト "functions.tcl" に記述されている別の Tcl プロシージャ ("Func1") を呼び出します ( アサーショ ンについては、82 ページの「メモリ • トランザクションのアサーションの設定」を参照してく ださい )。 Verilog: success = $mmtcleval("source functions.tcl"); success = $mmtclcallback(memid, bkpt, "Func1"); VHDL: success := mmtcleval("source functions.tcl"); success := mmtclcallback(memid, bkpt, "Func1"); Tcl: source functions.tcl mmtclcallback memid bkpt Func1 Verilog または VHDL テストベンチから mmtcleval コマンドも使用して、Tcl ハンドラ • スク リプト (functions.tcl) を入手する必要があることに注意してください。この Tcl ハンドラ関数 は、次のパラメータも要求します。 • bkpid - アサーションのブレークポイント ID • instid - インスタンス ID • addr - アサーションに関連付けられているアドレス • bkptype - アサーションのタイプ (assert_datavalue、assert_access、assert_parity) • access - アクセスのタイプ ( リード、ライトなど ) • data - 上記アドレスに関連付けられているデータ • mask - マスクされたビット ( 存在する場合 ) • compare - 比較文字列 ( 存在する場合 ) MMAV ユーザ • ガイド 11/6/08 58 この Tcl コールバック • ハンドラの一例は、次のようになります。 proc Func1 {bkpid instid addr bkptype access data mask compare} { set curtime [mmtime] //displays the time of assertion puts ""$curtime:$bkpid $instid $addr $bkptype $access $data $mask $compare"" mmbreak } 4.4.3.1 Tcl コールバック • ヘルパのコマンド コールバック「ヘルパ」のコマンドがいくつか追加されています。このコマンドはアサーショ ン • コールバック関数内部から呼び出すことができます。説明は次のとおりです。 mmgetids - デザインで使用されるメモリ ID を返します。ID は整数値です。 mmgetids メモリ • インスタンスが 1 つのデザインには、{0} を返します。 mmgetinfobyid - 参照対象メモリ • インスタンスの幅 ( ビット数 )、アドレス位置の値、インス タンス名、およびメモリのタイプを返します。 mmgetinfobyid 0 {9 2097152 testbench.uut1 sdram} を返します。ここで、9 はデバイスの幅 ( ビット数 )、2097152 はアドレス位置の 10 進数値、testbench.uut はインスタンス名で、メモリのタイプは SDRAM です。 mmnote - 発生したアサーションについての情報を出力します。アサーション•コールバック関 数内部で呼び出すことができます。 mmnote "This is a callback note" mmbreak - シミュレーションを停止します。このコマンドは通常、アサーション • コールバッ ク関数内部で呼び出します。 mmbreak mmexit - シミュレーションを終了します。このコマンドは通常、アサーション • コールバック 関数内部で呼び出します。 mmexit mmtime - シミュレーションの現在の時刻を取得します。時刻を文字列として返します。この コマンドは通常、アサーション • コールバック関数内部で呼び出します。 mmtime MMAV ユーザ • ガイド 11/6/08 59 4.4.4 コールバック • コマンド mmdisablecallbackall:データ • ドリブン検証 API (DDV-API) に設定したすべてのコールバック のセットアップを無効にするときに使用します。mmtcleval コマンドを使用して、Verilog ま たは VHDL から呼び出すことができます。 Verilog: success = $mmtcleval("mmdisablecallbackall"); VHDL: success := mmtcleval("mmdisablecallbackall"); Tcl: mmdisablecallbackall mmenablecallback:データ • ドリブン検証 API (DDV-API) に設定した特定のメモリ • インスタン スのセットアップで、コールバックを有効にするときに使用します。mmtcleval コマンドを 使用して、Verilog または VHDL から呼び出すことができます。 注意: デフォルトではすべてのコールバックが有効なので、個々のコールバックを有効にす る前に、mmdisablecallbackall を使用する必要があります。 Verilog: success = $mmtcleval("set mem_id [mminstanceid tb.mem.sdram0 ]"); success = $mmtcleval("mmenablecallback $mem_id"); VHDL: Cadence NC-VHDL を使用している場合: success = $mmtcleval("set mem_id [mminstanceid :to:mem:sdram0]"); success = $mmtcleval("mmenablecallback $mem_id"); Mentor Graphics ModelSim を使用している場合: success = $mmtcleval("set mem_id [mminstanceid /to/mem/sdram0]"); success = $mmtcleval("mmenablecallback $mem_id"); Tcl: set mem_id [mminstanceid tb.mem.sdram0] mmenablecallback $mem_id mmdisablecallback:データ•ドリブン検証API (DDV-API)に設定した特定のメモリ•インスタン スのセットアップで、コールバックを無効にするときに使用します。mmtcleval コマンドを 使用して、Verilog または VHDL から呼び出すことができます。 MMAV ユーザ • ガイド 11/6/08 60 Verilog: success = $mmtcleval("set mem_id [mminstanceid tb.mem.sdram0 ]"); success = $mmtcleval("mmenablecallback $mem_id"); VHDL: Cadence NC-VHDL を使用している場合: success = $mmtcleval("set mem_id [mminstanceid :to:mem:sdram0]"); success = $mmtcleval("mmenablecallback $mem_id"); Mentor Graphics ModelSim を使用している場合: success = $mmtcleval("set mem_id [mminstanceid /to/mem/sdram0]"); success = $mmtcleval("mmenablecallback $mem_id"); Tcl: set mem_id [mminstanceid tb.mem.sdram0] mmdisablecallback $mem_id mmsetaccesscallbackmask:データ•ドリブン検証API (DDV-API)に設定した特定のメモリ•イン スタンスのセットアップのライト • マスク • フィールドに基づいて、 コールバックを有効にす るときに使用します。コールバックがトリガされるのは、指定した文字列にライト • マスクが 一致したときだけです。mmtcleval コマンドを使用して、Verilog または VHDL から呼び出 すことができます。 Verilog: success = $mmtcleval("set mem_id [mminstanceid tb.mem.sdram0 ]"); success = $mmtcleval("mmsetaccesscallbackmask $mem_id hff00"); VHDL: Cadence NC-VHDL を使用している場合: success = $mmtcleval("set mem_id [mminstanceid :to:mem:sdram0]"); success := mmtcleval("mmsetaccesscallbackmask $mem_id hff00"); Mentor Graphics ModelSim を使用している場合: success = $mmtcleval("set mem_id [mminstanceid /to/mem/sdram0]"); success := mmtcleval("mmsetaccesscallbackmask $mem_id hff00"); Tcl: set mem_id [mminstanceid tb.mem.sdram0] mmsetaccesscallbackmask $mem_id 'hff00 MMAV ユーザ • ガイド 11/6/08 61 4.5 4.5.1 デナリのメモリの初期化 メモリ • アドレスの判定 デナリ • モデル ( フラッシュ、SRAM、レジスタ • ファイルなど ) は、単純な直接アドレスを使 用して、メモリの内容にアクセスします。DRAM など他のものは、別のアドレス指定方式を 使用して、バンク、行、および列というデバイスの物理的コンフィギュレーションに関連付 けます。 単純なメモリ • マップを提供するために、デナリはこれらのデバイスにアクセスするためのフ ラット化されたアドレスのマップを使用します。このアドレスは、バンク • ビットを行ビット および列ビットを連結して実際のアドレスを形成することによって生成されます。たとえば、 4 つのバンク (2 つのバンク • ビット )、9 つの行ビット、および 12 個の列ビットがある DDRDRAM デバイスの場合、デナリ • モデルのアドレスは次のようになります。 Address [22:0] = "B B R R R R R R R R R C C C C C C C C C C C C" こうすることにより、23 ビットのアドレスが得られます。このアドレスは物理的な DRAM デ バイスの任意の位置を一意にアドレス指定することができます。 4.5.2 メモリの初期の内容 デフォルトでは、メモリの初期値は "X" に設定されています。つまり、初期化されていない メモリをリードすると、シミュレーションで値 "X" が返されます。 次の 2 つの方法のどちらかを使用して、このデフォルト値を変更することができます。 • .denalirc の変数 InitialMemoryValue を使用する方法: InitialMemoryValue InitialMemoryValue InitialMemoryValue InitialMemoryValue 0 1 X U - for for for for all all all all '0's '1's 'X's 'U's あるいは、16 進数値を使用して、指定した値にすべてのワードを初期化することもでき ます。 例: InitialMemoryValue 0x3018 この文字列をメモリのワード幅 ( 通常はデータ • サイズ ) より長く拡張することはできま せん。ワード幅より短かければ、指定されないビットには 0 が入力されます。 値が上記以外の場合は、メモリはすべて X に初期化されます。次のように指定すること によって、初期データのためにランダム • データを生成することもできます。 − InitialMemoryValue randomNoUpdate - 複数回のリードの後に新しいランダム • データを得ることができます。 − InitialMemoryValue randomWithUpdate - 複数回のリードの後に同じランダム • データを得ることができます。 注意: 論理的にアドレス指定されたメモリでは、InitialMemoryValue randomWithUpdate を使 用する場合、ライト•コールバックが有効であるとライト•コールバックが得られます。 詳細については、 38 ページの「.denalirc ファイルを使用したメモリ • シミュレーション • モ デルの制御」を参照してください。 MMAV ユーザ • ガイド 11/6/08 62 あるいは、任意の C 関数を使用して、初期データ ( ランダム • データやパリティ付きラン ダム • データなど ) を指定することもできます。 例については、$DENALI/ddvapi/example/fillValue を参照してください。 • シミュレーションのテストベンチで mmsetfillvalue を使用する方法: 注意: mmsetfillvalue が設定するのは、ライトされていない位置のための値だけです。値のリ セットは行いません。メモリ位置をリセットするには、$mmreset を使用してくださ い。詳細については、68 ページの「メモリの内容のリセット」を参照してください。 充填値のサイズは、メモリ • デバイスの幅です。16 進形式 "0x" を使用して、実際の充填値 を指定してください。Verilog と VHDL で、充填値 0x55 を 8 ビット幅の SDRAM インス タンス "tb.mem.sdram0" に設定の方法の例は、次のとおりです。 オプションの 3 番目の引数は、mmsetfillvalue に最近追加されたものです。この引数 は情報メッセージを表示しないようにするときに使用します。3 番目の引数の値が 1 の場 合、どの情報メッセージも表示されません。値が 0 か、または 3 番目の引数として値が 提供されない場合は、メッセージがすべて通常どおり表示されます。 正常に実行できたときには値 "0"、エラー発生時には値 "-1" を返します。 Verilog: status = $mmsetfillvalue("tb.mem.sdram0", "0x55", "1"); //suppress the informational messages VHDL: Cadence NC-VHDL を使用している場合: status := mmsetfillvalue("<instance_id>",":tb:mem:sdram0","0x55"); No message suppression (default) // Mentor Graphics ModelSim を使用している場合: status := mmsetfillvalue("<instance_id>","/tb/mem/sdram0","0x55"); No message suppression (default) // Tcl: mmsetfillvalue /tb/mem/sdram0 0x55 1 # supress messages 注意: mmsetfillvalue が関係するのは、物理メモリだけです。このコマンドを使用して、論理 的にアドレス指定されたメモリの充填値を設定することはできません。これを行うに は、論理的にアドレス指定されたメモリの一部である各物理メモリ • インスタンスで、 mmsetfillvalue を使用する必要があります。 4.5.3 ファイルからのメモリのロード デナリのメモリ • モデルはどれも、1 つのファイルからロードすることができます。ファイル からロードするコマンドは、2 つの引数を取ります。1 つ目はロードするデナリ • モデルのイ ンスタンス名、2 つ目はアドレスとデータ値を格納したファイルです。ロード • ファイルに格 納したデータ値の幅は、ロードしようとしているデバイスの幅に一致している必要がありま す。ファイルの構文は次のとおりです。 <start_addr>:<end_addr>/<data>; MMAV ユーザ • ガイド 11/6/08 63 あるいは <addr>/<data>; すべてのアドレスおよびデータ値は HEX 形式です。ロード • ファイルには空白行を含めるこ とができ、コメント文字は "#" です。 例: # File name: load.dat 0/21; 1/22; 3/23; 4:1F/55; 20:1FFF/FF; # End of load.dat mmload コマンドの例を次に示します。 Verilog: status = $mmload("tb.mem.sdram0",”load.dat"); VHDL: Cadence NC-VHDL を使用している場合: status := mmload(":tb:mem:sdram0",”load.dat"); Mentor Graphics ModelSim を使用している場合: status := mmload("/tb/mem/sdram0",”load.dat"); Tcl: mmload tb.mem.sdram0 load.dat mmload /tb/mem/sdram0 load.dat # Verilog # VHDL Tcl コードでは [] も特殊なシーケンスであることに注意してください。Tcl の mmload コマン ドを呼び出すには、このかぎかっこを波かっこかバックスラッシュで囲む必要があります。 たとえば、 メモリ • インスタンスのパスが top.m_system.bank [0].index[0].mem である 場合、次のコマンドを使用します。 mmload {top.m_system.bank[0].index[0].mem} some.dat mmload top.m_system.bank\[0\].index\[0\].mem some.dat 注意: モデルの初期化が済んだらすぐにロードするファイルを指定することもできます。指 定は、作成した HDL シェル • ファイルで行います。詳細については、22 ページの「HDL シェルの作成」を参照してください。 MMAV ユーザ • ガイド 11/6/08 64 4.5.4 メモリ内容ファイルの形式 メモリ形式ファイルは、 標準的なテキスト • ファイルを使用するメモリ • インスタンスの内容 の保存、ロード、および比較を行うときに使用されます。 メモリ形式ファイルはそれぞれ、一組のレコードで構成されます。各レコードは ASCII テキ ストの 1 行内に記述する必要がありますが、複数のレコードを 1 行に記述することもできま す。このようなファイルを作成するときには、次の構文を使用します。 start_addr [:|- end_addr] / data; start_addr / data [data ...]; [# comment] "[]" はレコードのオプションの構成要素を示します。"|" は論理 OR を示します。上記のレコー ド仕様では、これは文字 ":" と "-" のどちらかを使用して、start_addr と end_addr を分け ることができることを示します。 コメントは文字 "#" で示され、その行の終わりまで続きます。1 行に複数のコメントを記述す ることはできません。 基数指定子の接頭辞 mmload コマンドと mmcomp コマンドの start_addr と end_addr およびデータは、 基数指定子 の接頭辞を使用して、2 進数、8 進数、16 進数、または 10 進数の形式で指定することができ ます。デフォルトでは、基数指定子が使用されていない場合は、16 進数が基数となります。 基数指定子として次の接頭辞を使用してください。 'b 'o 'd 'h - binary octal decimal hexadecimal start_addr はメモリ形式レコードに必須の構成要素です。end_addr と併用すると、連続的 で包括的なアドレス範囲の値がレコードによって指定されます。単独で使用した場合、デー タ値を 1 つしか提供しないと、1 つだけのアドレスのメモリ内容がレコードによって指定さ れます。データ値を複数提供すると、アドレス start_addr で始まる一連のメモリ内容がレ コードによって指定されます。 アドレス範囲の末尾を指定するには、end_addr を使用してください。 start_addr と end_addr を分けるには、文字 ":" か "-" のどちらかを使用してください。 mmsave コマンドと mmsaverange コマンドの場合、 設定できる出力データの形式は 16 進数だ けです。この形式設定を変更するには、SaveDataRadix と SaveAddressRadix という .denalirc の変数を使用します。保存ファイルの出力に採用する「基数」に応じて、この変 数を 2 (2 進数 )、8 (8 進数 )、10 (10 進数 )、または 16 (16 進数 ) に設定することができます。 あるいは、テストベンチから動的に設定することもできます。デフォルト値は 16 です。 MMAV ユーザ • ガイド 11/6/08 65 たとえば、アドレスの基数を 2 進数に動的に変更するには、次のコマンドを使用することが できます。 success = $mmtcleval("mmsetvar SaveAddressRadix 2"); たとえば、データの基数を 2 進数に動的に変更するには、次のコマンドを使用することがで きます。 success = $mmtcleval("mmsetvar SaveDataRadix 2"); アドレスと同様に、デフォルトではデータとアドレスは 16 進数です。不正値も許されてお り、 文字 "X" または "x" で示されます。ただし、 不正値を 10 進値と併用することはできません。 データをメモリ • インスタンスのデータ幅と等しい幅で指定することは、 優れたスタイルであ り良い慣行ですが、必須ではありません。この値がメモリ • インスタンスのデータ幅より小さ い場合は、データの先頭に 0 が補充されます。 値が大きすぎるなら、形式ファイルは該当するインスタンスにとって無効になります。 メモリ形式レコードの末尾を示すには、文字 ";" を使用してください。ただし、ファイルの最 後のレコードには必須ではありません。1 行のテキストに複数のレコードを入力することが できます。 Motorola S-record と Intel Hex の形式ファイルの変換 デナリには Tcl スクリプトがあり、これを使用して Motorola S-record 形式ファイルまたは Intel hex 形式ファイルをデナリのロード • ファイルに変換することができます。この Tcl スクリプ トをご希望の場合は、[email protected] までお問い合わせください。 パリティ • ビット 一部のメモリ • タイプ ( 主に SRAM デバイス ) では、 パリティ• ビットをオプションでメモリ • モデルに指定することができます。パリティに使用するビット数は、特定のデバイスの SOMA ファイル設定で決まります。通常のデバイスでは、1 ビットのパリティで 8 ビットのデータ をカバーします。パリティ • ビットは常に、ロードするデータ • フィールドの最下位のビット となります。たとえば、データ • ビットが 8、パリティ• ビットが 1 の SDRAM デバイスを使用 する場合、データ • ビットは [8:1] から取り出され、パリティ• ビットはビット [0] になります。 データ • ビットが 16、 パリティ• ビットが 2 のデバイスでは、データ • ビットは [17:2] から取り 出され、パリティ• ビットは [1:0] になります。ここで、ビット [1] はデータ • ビット [17:10] を カバーし、ビット [0] はデータ • ビット [9:2] をカバーします。このようなデバイスにデータを ロードするときには、この点を考慮する必要があります。 例 1: 次の例では、16 進値 "70FF" が、16 進数 "AB73" で指定されるアドレスにロードされます。 AB73 / 70FF; MMAV ユーザ • ガイド 11/6/08 66 例 2: 次の例では、複数の 16 進値が、16 進数 "AB73" で指定されるアドレスで始まる複数のアドレ ス ( 末尾のアドレスは 16 進数 "AB7A" で指定されます ) にロードされます。 AB73 / 70FF 7100 7101 7102 7103 7104 7105 7106; 例 3: 次の例ではどちらも、2 進値 "1100XXXX" ( 不正値が含まれています ) が、開始アドレス 0 で 始まり 10 進アドレス "2478" で終わるアドレス範囲にロードされます。アドレス範囲の区切 り文字として ":" または "-" を使用することができます。 0:'d2478/'b1100XXXX; 0-'d2478/'b1100XXXX; 例 4: 次の例では、1 行に複数のレコードを指定でき、1 行を 1 つのコメントで終了する様子が示さ れています。 0/00; 1/01; 2/02; 3/03; # pattern loading 4.6 メモリ • インスタンスの指定 デナリ MMAV-2001 は、デザイン内のモデルの HDL インスタンス名を使用することによって、 デザイン内のメモリを参照します。 2 つの関数が用意されており、 Verilog には mminstanceid、 VHDL には mmgetinstanceid です。このコマンドを使用して、インスタンス名を抽出し、 デナリの全メモリ • モデル • コマンドで特定のメモリ • デバイスを参照することができます。 一般的な使用方法は、指定したインスタンス名に変数または整数を割り当てることです。そ して、この変数を「ショートカット」として使用して、デナリのメモリ • モデルを参照します。 コマンドの形式には 2 種類があります。1 つ目ではメモリ • インスタンス名として完全なイン スタンス • パス名を取り、 2 つ目では相対パスを取ります。 メモリ • モデルまでの階層的なフル • パスを知っている場合、後者の方が好ましい方法です。 移植性をさらに必要としており、かつ上位の階層レベルをよく知らない場合は、相対パスを 使用して、特定のモジュール内またはアーキテクチャ• ブロック内のメモリ • モデルを特定す ることができます。相対パスが有効なのは、mminstanceid または mmgetinstanceid が、 モジュール内またはアーキテクチャ• ブロック内で使用されている場合だけです。結果として 得られる変数または整数は、こうしてそのインスタンスに関連付けられるので、他のコマン ドで使用することができるようになります。 VHDL においては、別の問題があります。GENERATE ステートメントを使用してモデルを初 期化する際に、特別な形の mmgetinstanceid が必要とされます。path_name パラメータが 必要です。これにより、デナリは GENERATE ブロックから完全なパス名を抽出して、正確 なインスタンス名を構成することができます。 MMAV ユーザ • ガイド 11/6/08 67 例 ( 階層的なフル • インスタンス名 ): Verilog: memory_id0 = $mminstanceid("testbench.top.device0"); VHDL: Cadence NC-VHDL を使用している場合: memory_id0 := mmgetinstanceid(":testbench:top:device0"); Mentor Graphics ModelSim を使用している場合: memory_id0 := mmgetinstanceid("/testbench/top/device0"); 例 ( インスタンス生成のモジュールに対して相対的なインスタンス名 ): Verilog: memory_id0 = $mminstanceid("device0"); VHDL: memory_id0 := mmgetinstanceid("device0"); 例 (GENERATE ステートメントで使用される相対的なインスタンス名 ): VHDL: memory_id0 := mmgetinstanceid(device0'path_name); 4.7 メモリの内容のリセット シミュレーション時にいつでも、指定したメモリ • インスタンスの内容をリセットして、初期 状態に戻すことができます。これは、mmreset コマンドで実行することができます。 Verilog: success = $mmreset("tb.mem.sdram0"); VHDL: success := mmreset("tb.mem.sdram0"); Tcl: mmreset tb.mem.sdram0 MMAV ユーザ • ガイド 11/6/08 68 4.8 メモリのリードとライト MMAV ではテストベンチから任意のメモリ位置のリードとライトを行うことができます。こ のコマンドはシミュレーション時にいつでも発行することができます。リードまたはライト を行うインスタンスとアドレスを指定する必要があります。Verilog では、リードまたはライ トを行うコマンドが複数あります。 メモリのリードまたはライトを行う Verilog のコマンドは、明示的なインスタンス名または暗 黙的なインスタンス ID を取ることができます。この ID は mminstanceid コマンドから取得 します。この 2 つの相違点は、暗黙的なインスタンス ID の方が明示的なインスタンス名より 高速である、ということです。テストベンチで頻繁にメモリのリードとライトを行う場合は、 インスタンス ID コマンドを使用してください。1 つのコマンドで連続する位置のリードまた はライトを行うこともできます。これを行うには、開始アドレスと、リードまたはライトを 行う位置の数を指定します。コマンドの構文を次に示します。このコマンドは正常に実行で きたときには値 "0"、エラー発生時には値 "-1" を返します。 注意: 一部の SRAM デバイスでは、パリティ• ビットがデータ • ビットに関連付けられていま す。このパリティ • ビットの取り扱いの詳細については、66 ページの図「パリティ • ビット」を参照してください。 また、アドレス入力は、mmreadword の使用時には文字列値 ("0x00")、mmreadword2 または mmreadword3 の使用時には Verilog 形式 ('h00) である必要がある点にも注意してください。 $mmreadword("<instance name>",”<address>",<param>); $mmreadword2(<instance id>,<address>,<param>); $mmreadword3(<instance id>,<address>,<number>,<param>,...,<param>); Verilog: status = $mmreadword("tb.mem.sdram0",”0x000a",tmp_read); m_id = $mminstanceid("tb.mem.sdram0"); status = $mmreadword2(m_id,'h200,tmp_read); status = $mmreadword3(m_id,'h200,2,tmp_read,tmp_read2); Verilog のライト • コマンドには構文が数種類あり、ライト • データがコマンドにとって明示的 なのか、それともシミュレーションのレジスタまたはパラメータ内に存在するのかによって 異なります。アプリケーションに適したコマンドを選択してください。これらのコマンドの 構文は次のとおりです。 注意: データ値 <value> は、2 進数の文字列値である必要があります。mmwriteword の使用 時には、アドレス入力は文字列値 ("0x00") である必要があります。mmwriteword2 ~ 5 の使用時には、アドレス入力は Verilog 形式 ('h00) か変数である必要があります。 $mmwriteword("<instance $mmwriteword2(<instance $mmwriteword3(<instance $mmwriteword4(<instance $mmwriteword5(<instance MMAV ユーザ • ガイド name>",”<addr>",”<value>"); id>,<addr>,<value>); id>,<addr>,<num>,<value>,...,<value>); id>,<addr>,<param>); id>,<addr>,<num>,<param>,...,<param>); 11/6/08 69 例: status = $mmwriteword("tb.mem.sdram0",”0x200",”01010101"); m_id = $mminstanceid("tb.mem.sdram0"); status status status status = = = = $mmwriteword2(m_id,'h200,"01010101"); $mmwriteword3(m_id,'h200,2,"01010101",”10101010"); $mmwriteword4(m_id,'h200,tmp_write); $mmwriteword5(m_id,'h200,2,tmp_write,tmp_write2); VHDL と Tcl の場合、メモリ位置のリードとライトを行うためのコマンドは、現時点では 2 つしかありません。構文は次のとおりです。コマンドのステータスは、<status> 変数で返さ れます。戻り値 TRUE はデータのライトに成功し、FALSE は失敗したことを意味します。 VHDL: mmreadword(<instance id>,<addr>,<param>,<status>); mmwriteword(<instance id>,<addr>,<data>,<status>); Cadence NC-VHDL を使用している場合: m_id := mmgetinstanceid(":tb:mem:sdram0"); mmreadword(m_id,200,tmp_read,status); mmwriteword(m_id,200,tmp_write,status); Mentor Graphics ModelSim を使用している場合: m_id := mmgetinstanceid("/tb/mem/sdram0"); mmreadword(m_id,200,tmp_read,status); mmwriteword(m_id,200,tmp_write,status); Tcl: set <param> [mmreadword <instance id> <addr>] mmwriteword <instance id> <addr> <data> set tmp_read [mmreadword /tb/mem/sdram0 200] mmwriteword /tb/mem/sdram0 200 10100101 4.8.1 マスクされたメモリ • ライト この Verilog と VHDL 限定の関数は、Verilog の $mmwriteword2 関数と基本的には同じです。 ただし、マスクで "1" に設定されたビット位置だけが、"value" ( ビット文字列 ) からインス タンス ID <instance_id> のアドレス <address> にコピーされる点が異なります。インス タンス ID <instance_id> のアドレス <address> にある残りのビット位置は、前のビット 値が保持されます。この関数は成功すると 0 を返します。 MMAV ユーザ • ガイド 11/6/08 70 Verilog: $mmwritewordmasked (<instance_id>, <address>, "value", "mask") i2 = $mminstanceid("testbench.uut1"); success = $mmwriteword2(i2, 'h14, "00001111"); success = $mmwritewordmasked(i2, 'h14, "01010101", "00110011"); この例では、値 "00011101" がアドレス 'h14、インスタンス "i2" にライトされます。 VHDL: mmwritewordmasked (<instance_id>, <address>, "value", "mask", status) i2 := mmgetinstanceid("testbench.uut1"); mmwritewordmasked(i2, 0, "01010101", "00110011", status); Tcl: ( 使用できません。) 4.9 メモリの内容の保存と比較 デナリのメモリではいずれも、メモリの内容をファイルに保存したり、その保存ファイルと 比較したりすることができます。 これらの機能のために、mmsave、mmsaverange、および mmcomp という 3 つのコマンドがあ ります。最初の 2 つのコマンドでは、それぞれ内容全体またはアドレスの特定範囲だけを保 存することができます。3 つ目のコマンドでは、メモリの内容全体を指定ファイルと比較す ることができます。mmsave コマンドと mmsaverange コマンドの場合、設定できる出力デー タの形式は 16 進数だけです。mmcomp コマンドのファイル形式については、65 ページのセク ション 4.5.4「メモリ内容ファイルの形式」で説明しています。 Verilog と VHDL のコマンドの説明は、次のとおりです。正常に実行できたときには値 "0"、 エラー発生時には値 "-1" を返します。 Verilog: $mmsave("<instance name>,"<file name>"); $mmsaverange("<instance name>",”<file_name>",<start addr>,<end addr>); $mmcomp("<instance name>,"<file name>"); status = $mmsave("tb.mem.sdram0",”save.dat"); status = $mmsaverange("tb.mem.sdram0",”save.dat",'h0,'h1f); status = $mmcomp("tb.mem.sdram0",”save.dat"); MMAV ユーザ • ガイド 11/6/08 71 VHDL: mmsave("<instance name>",”<file name>"); mmsaverange("<instance name>",”<file name>",<start addr>,<end addr>); mmcomp("<instance name>",”<file name>"); status := mmsave("/tb/mem/sdram0",”save.dat"); status := mmsaverange("/tb/mem/sdram0",”save.dat",0,31); status := mmcomp("/tb/mem/sdram0",”save.dat"); Tcl: mmsave <instance name> <file name> mmsaverange <instance name> <file name> <start addr> <end addr> mmcomp <instance name> <file name> mmsave /tb/mem/sdram0 save.dat mmsaverange /tb/mem/sdram0 save.dat 0 31 mmcomp /tb/mem/sdram0 save.dat mmcomp コマンドを使用すると、指定ファイルを調べて、そこに列挙されたアドレスとデータ のペアのうち、比較対象メモリと一致しないものがないかどうかを判断することができます。 注意: mmcomp コマンドでは、その逆のこと ( つまり、メモリ全体を調べて、指定ファイル と比較すること ) は行いません。したがって、ファイルに記述されていないアドレス にライトしても、このコマンドはキャッチしません。その方向では比較を行わないか らです。 回避策として、特定の値を持たない複数の行をファイルに作成して、初期値に設定す ることができます。これを行うには、load.dat ファイルで mmload を実行した後に、 mmsave を使用して直ちに comp.dat として保存します。こうすることにより、アドレ スを指定しなかったすべての位置に初期値が自動的に挿入されます。そして、後から mmcomp コマンドを使用して、comp.dat と比較することができます。 注意: VHPI では、mmSave コマンドを直接使用することはできません。代替策として、 mmtcleval コマンドを使用することができます。 注意: システム • メモリでは、任意の位置にライトされたデータがメモリの「充填値」と一 致しても、システム • メモリが mmsave と mmsaverange のためにそのデータをダンプす ることはありません。 4.10 クロック • サイクル時間の再計算 一部のメモリ • クラスでは、 クロック • サイクル時間を再計算するオプションを使用すること ができます。この機能を有効にすると、デナリのメモリ • モデルはクロックの次の立ち上がり エッジでクロック • サイクルを再計算します。これは、"IrregularClock = 0" の設定 (43 ページ の「IrregularClock」を参照 ) がある場合に便利です。クロックに基づく一部のタイミング • パ ラメータの中には、デナリ • モデルがクロック • サイクル時間の変更を通知されないと、不正 確になるものもあるからです。 mmrecalculatecycle( "instance_name" ) MMAV ユーザ • ガイド 11/6/08 72 Verilog: success = $mmrecalculatecycle( "testbench.uut1" ); VHDL: success := mmtcleval("mmrecalculatecycle testbench.uut1"); Tcl: mmrecalculatecycle testbench.uut1 4.11 シミュレーション時の SOMA ファイルの再ロードとタイ ミング • パラメータの“オンザフライ”での変更 バージョン 3.00 から、メモリ • クラスのサブセットのために 2 つの新機能が追加されました。 これらの機能を使用すると、SOMA ファイルのパラメータを動的に変更できるだけでなく、 HDL ラッパで参照されているのとはまったく異なる SOMA ファイルにロードすることもで きます。現時点でこれらの機能が有効なるのは、次のメモリ • クラスです。 • DDR3-SDRAM • DDR2-SDRAM • DDR-SDRAM • FLASH-AMD • FLASH-INTEL • FLASH-NAND • FLASH-ONE-NAND • GDDR3 • GDDR4 • SDRAM • RLDRAM • FCRAM • RDRAM • QDR-SSRAM • NVM_DDR • MS • MS-PRO mmsomaset - 元の SOMA ファイルのごく少数の (<3) タイミング数を変更します。さらに変更 を行う場合は、次に述べるように mmsomaload を使用する方が効率的です。これを呼び出す には、pli ($mmsomaset) または mmtcleval を使用します。 MMAV ユーザ • ガイド 11/6/08 73 mmsomaset ("<instance_name>", "<parameter_name>", "<parameter_value>", "<parameter_units>"); シミュレーションはその新しい数でその時点から続行されます。メモリの内容は影響を受け ません。parameter_value フィールドと parameter_units フィールドの両方が必要であることに 注意してください。 元の SOMA ファイルで指定されているように、parameter_units は "ns" でナノ秒、"clk" で クロック時間の単位を表すことができます。 Verilog: success = $mmsomaset ( "tb.mem0", "toh", "15.0", "ns" ); VHDL: 次の Tcl コマンドでは mmtcleval を使用してください。 Cadence NC-VHDL を使用している場合: ex. mmtcleval"mmsomaset :tb:mem0 toh 15 ns"; Mentor Graphics ModelSim を使用している場合: ex. mmtcleval"mmsomaset /tb/mem0 toh 15 ns"; Tcl: mmsomaset /tb/mem0 toh 15 ns mmsomaload - 複数のタイミング値またはピン幅を変更します。複数のタイミング値を変更す る場合は、一連の mmsomaset コマンドよりこちらの方がさらに効率的です。チェック処理の 多くが一度しか行われず、しかも clks などに基づくタイミングの再計算も一度しか行われな いからです。この SOMA ファイルは、変更対象を内部に記述している必要があると同時に、 完全な SOMA ファイルでなければならないことに注意してください。 mmsomaload ("<instance_name>", "<file_name>"); mmsomaload が発行されると、メモリは再割り当てされ、内容がすべて破棄されます。ピン のサイズを変更し、そのサイズが、シミュレータの保持する値と異なると、警告が表示され ます。任意の信号のサイズがシミュレータの保持する値より大きいと、致命的なエラーが発 生します。シミュレータ側の値が、ピンに設定できる最大値です ( この幅は Verilog または VHDL のシェルからの幅です )。 初期設定ファイルは読み込まれず ( 今ここにはおそらく該当しないので )、まったく新しいメ モリで必要とされる手順をすべて実行する必要があります。ただし、デザイン内に他にメモ リがあっても、それらは影響を受けません。これは基本的には、そのメモリに関して「初め からやり直す」ことを意味します。ただし、シミュレーション時間は前回の続きから計測さ れるので、シミュレータを終了したり再コンパイルしたりする必要はありません。 実施時の注意:タイミングの変更だけが目的で、メモリのリセットを行わない場合は、代わ りに一連の mmsomaset コマンドを実行する必要があります。 MMAV ユーザ • ガイド 11/6/08 74 制限事項: • この方法でクラスを変更することはできません。いったん DDR メモリにしたら、常に DDR メモリのままとなります。 • ピンの幅を元の HDL シェルより広げることはできません。小さくしてから、元の HDL シェルの幅まで広げることはできます。 Verilog: success = $mmsomaload ( "tb.mem0", "new_soma.spc" ); VHDL: Cadence NC-VHDL を使用している場合: mmtcleval "mmsomaload :tb:mem0 new_soma.spc"; Mentor Graphics ModelSim を使用している場合: mmtcleval "mmsomaload /tb/mem0 new_soma.spc"; Tcl: mmsomaload tb.mem0 new_soma.spc 4.12 エラー • メッセージの制御 mmerrormessageson コマンドと mmerrormessagesoff コマンドを使用すると、 エラー報告 機能を柔軟にオンまたはオフにすることができます。これらの関数をいつでも呼び出して、 デナリ • モデルのエラー• メッセージの表示をオンまたはオフにすることができます。デフォ ルトでは、メッセージ表示は常にオンです。 Verilog: success = $mmtcleval("mmerrormessageson"); success = $mmtcleval("mmerrormessagesoff"); VHDL: 次の Tcl コマンドでは mmtcleval を使用してください。 mmtcleval "mmerrormessageson"; mmtcleval "mmerrormessagesoff"; Tcl: mmerrormessageson mmerrormessagesoff 上記コマンド以外にコマンドが 2 つあり、 シミュレーション時に履歴とトレース • ファイルの 生成をそれぞれ動的にオンまたはオフにすることができます。 MMAV ユーザ • ガイド 11/6/08 75 $mmdebugon - 履歴とトレース • ファイルの情報のウィンドウを作成できます。.denalirc ファイルで HistoryFile オプションと TraceFile オプションが有効であると、このコマン ドは、無効になります。成功すると、0 が返されます。 Verilog: initial #5000 success = $mmdebugon; VHDL: wait for 5000 ns; success := mmdebugon; $mmdebugoff - 履歴 / トレース情報のウィンドウを閉じます。成功すると、0 が返されます。 Verilog: initial begin #50000 success = $mmdebugon; #50000 success = $mmdebugoff; end VHDL: wait for 50000 ns; success := mmdebugon; wait for 50000 ns; success := mmdebugoff; end 4.13 クロック • サイクルの強制的な再計算 メモリ • クラスがこの機能をサポートしている場合、クロックの次の立ち上がりエッジで MMAV はクロック • サイクルを再計算します。これは IrregularClock = 0 の場合に便利で すが、至る所でクロック • サイクルが変わります。モデルに通知しないと、クロックに基づく タイミング • パラメータが不正確になることがあります。 Verilog: $mmrecalculatecycle( "instance_name" ) MMAV ユーザ • ガイド 11/6/08 76 4.14 4.14.1 RDRAM (Rambus) 固有モデルの考慮事項 RAMBUS 向け Turbo Channel Model 概要 Rambus の個々の Direct-RDRAM コンポーネント用の高パフォーマンス • モデルに加えて、デ ナリは "Turbo Channel Model" も提供しています。このモデルは市販されているどの DirectRDRAM チャネル • シミュレーション • モデルよりも高いパフォーマンスを発揮します。この Turbo Channel Model というオプションは、 シミュレーション • パフォーマンスを加速するアル ゴリズムを採用しており、精度を犠牲にすることなく個別の RDRAM インスタンスを 1 つの モデル • オブジェクトに「分割」します。ほとんどの場合、シミュレーション • パフォーマン スは、個々の RDRAM モデルの "n" 倍となります。ここで、"n" はシミュレーションする Rambus チャネル上の RDRAM コンポーネントの数を表します。 ライセンス 追加ライセンスである Denali_SIM_rdram_turbo は、 RDRAM Turbo Channel Model のシミュレー ションに必要です。このオプションについては、デナリソフトウエア社 ([email protected]) までお問い合わせください。 デバイス数 RDRAM Turbo Model を使用するには、汎用パラメータ device_number を指定する必要があり ます。この文字列パラメータは、1 つの Rambus チャネルで使用するデバイスの数を指定しま す。HDL レベルでは、1 つのインスタンスが 1 つのチャネルです。したがって、テストベン チで個々のデバイスからインスタンスを生成すべきではありません。 チャネル上のデバイスには、次の形式の名前が与えられます。 <channel_name>_d%d たとえば、チャネル • インスタンス名が ch1 であり、このチャネルに合計で 8 つのデバイスが ある場合、デバイス名は次のようになります。 ch1_d0, ch1_d1, ch1_d2, ch1_d3, ch1_d4, ch1_d5, ch1_d6, ch1_d7 mmload 関数を使用してメモリの内容をロードする際には、この命名規則に従う必要があり ます。 注意:汎用の device_number が定義されていないか 0 に等しい場合は、Turbo モードはオフに なります。つまり、インスタンスは 1 つのチャネル • インスタンスではなく、1 つのデバイス • インスタンスとして扱われます。この場合、チャネル上のすべてのインスタンスからインス タンスを作成する必要があります。シリアル • ピンを手動で接続する必要もあります。 デバイス ID Turbo モードでは、モデルはデバイス ID を 0、1、...、n-1 に自動的に設定します。mmload は 不要です。ただし、デフォルトの ID を有効にするために、checkInitialization の選択を解除す る必要があります。 MMAV ユーザ • ガイド 11/6/08 77 チャネルの反転 RAC モデル ( またはテストベンチ ) の中には、物理的な電圧レベルで ROW/COL/DQA/DQB を駆動するものもあります。パラメータ invertChannel が、PureView の SOMA ファイルで設 定されている場合、モデルでは結果として、論理信号 ROW/COL/DQA/DQB を内部で反転し ます。 チャネル遅延の設定 デナリ RDRAM Turbo Channel Model は、未使用の RDRAM 制御レジスタ 0xf にチャネル遅延 設定を格納します。0xf の最後の 3 ビットは、デナリ • チャネルの配線遅延を CFM/CTM サイ クルに関して 0 ~ 7 サイクルの範囲で指定するときに使用します。たとえば、次のパラメー タを見てください。 0f/'b0000000000000110; channel delay=6cyc このパラメータによって、チャネルの配線遅延はレジスタの TPARM 値と TCDLY1 値に追加 され、次のような tCAC リード • データ遅延が新たに設定されます。 tCAC = channel_delay + 3*tCYCLE + tCLS_C + tCDLY0_C + tCDLY1_C レジスタ 0xf のチャネル遅延は、マスタとの間の往復遅延であるため、CFM/CTM サイクルの 数 ( 半分のサイクル数ではありません ) として指定されることに注意してください。 .denalirc のオプション • WarnSuppress 通常のタイミングとプロトコルのエラー状況に加えて、デナリの RDRAM モデルは、次 の危険な操作についても警告を発行します。 − ライト • バッファが廃棄される前の上書き (WR-WR-RD-RD-RTR など ) − バンクが廃棄される前のプリチャージ ( ルール CR8) これらの警告は、次のように .denalirc ファイルの WarnSuppress パラメータを設定 することによって、表示しないようにすることができます。 WarnSuppress 1 • TimingChecksReportOnly このオプションをオンにすると、タイミング • エラーが発生したときに、メモリを破壊し てデータ • バス上に "X" を駆動するデナリ • モデルの機能がオフになります。 このオプショ ンを使用すると、タイミング • エラーが発生してもモデルはメッセージを発行するだけに なり、"X" を駆動することはなくなります。これは、エラーの初期評価で非常に便利な場 合があります。ただし、エラーがレポートされてもシミュレーションは続行されます。 TimingChecksReportOnly 1 MMAV ユーザ • ガイド 11/6/08 78 • TimingChecksStartTime デナリでは、特定の時刻にタイミング • チェックをオンにする機能も用意してあります。 これにより、 デナリ • モデルがタイミング • エラーのチェックを開始する前に、 リセットと デバイス初期化を行うための時間を確保することができます。構文については、次の例 を参照してください。 TimingChecksStartTime TimingChecksStartTime TimingChecksStartTime TimingChecksStartTime 0ps "20 us" "200ms" 200000 ns デバイス • リフレッシュのオプション デナリのどのメモリ•モデルにも、 高度なダイナミック•メモリ•アロケーション•アルゴリズム が採用されており、シミュレーション時のメモリ使用量が最小限に抑えられます。RDRAM Turbo Channel Model のメモリ要件は、さらに下げることができます。これを行うには、チャ ネル内の全デバイスではなく1つのデバイスでリフレッシュ•チェックを実施するように指定 します。汎用パラメータ device_number は、チャネル上の特定のデバイスについて、次のよう にリフレッシュ間隔を指定するときに使用します。 device_number = "32;RefreshCheckOneDev:1" 上記の例では、デバイス数が 32 のチャネルでインスタンスが作成され、リフレッシュ• チェッ クは 1 つのデバイスしか行われません。 注意:リフレッシュ用の各種コマンドは通常、チャネル • ブロードキャストを通じて発行され ます。したがって、1 つのデバイスしかチェックしないのにモデルの正確さが低下するよう なことがないようにする必要があります。 マルチバンク • リフレッシュのオプション マルチバンク • リフレッシュは、numBanksPerRefresh パラメータによって制御されます。リフ レッシュ• コマンドを 1 回実行すると複数のバンクがリフレッシュされる場合、それらのバン クは同じ下位のアドレス • ビットを共有することになります。例: numBanksPerRefresh 2 上記の設定をバンクが 16 あるデバイスで使用すると、最初のリフレッシュはバンク 0 と 8 で 行われます。次のリフレッシュはバンク 1 と 9 で行われ、以下同じように続きます。 MMAV ユーザ • ガイド 11/6/08 79 Turbo モード - 同一チャネル上でのサイズの異なるデバイスのサポート 以前には、同じチャネル上のデバイスはすべて、同じ SOMA ファイルを共有していました。 したがって、コンフィギュレーションは同じでなければなりませんでした。汎用パラメータ "device_number" の機能が拡張され、同じチャネル上でサイズの異なるデバイスがサポートさ れるようになりました。例: 1 つのチャネル上で 128 M デバイス 8 つと 64 M デバイス 16 からインスタンスを作成するに は、次のようにします。 device_number => "24;8:128M_800.spc;16:64M_800.spc"; memory_spec は既に無効であることに注意してください。 デナリの RDRAM バイト • オーダリングのオプション デナリの RDRAM モデルは、( ファイルのロードと保存で ) デュアルオクトをメモリ内で次の ように扱います。 DQA[8]...DQA[0] DQB[8]...DQB[0] ..... DQA[8]...DQA[0] DQB[8]...DQB[0] \..........................cfm clk 0 ................./ \................... cfm clk 7 ......................./ 0 71 72 143 その結果、ビット • オーダリングは次のようになります。 データ [0] はチック 0 の DQA[8]、データ [143] はチック 7 の DQB[0] マスク配列も同じバイト • オーダリングを使用して作成されるので、 デュアルオクトがリード されると、データは同じ順序で提示されます。 このバイト • オーダリングは RMC/RAC とは異なります。RMC/RAC では、デュアルオクトは 次のように DQA/DQB に分割されます。 DQB(clk 7) ...DQB(clk 0) \------------------------------/ 143 72 DQA(clk 7) ...DQA(clk 0) \......................................./ 71 0 メモリ内容ファイルの比較またはロードのためにRMC/RACのバイト•オーダリングを使用す る場合、このコンフィギュレーションを使用できるように、.denalirc の環境変数を設定す ることができます。 RdramRMCByteOrder 1 このケースでは、デナリの RDRAM モデルはデュアルオクトを上記のように RMC/RAC のバ イト • オーダリングで保存またはロードします。 MMAV ユーザ • ガイド 11/6/08 80 CHAPTER 5 5 MMAV の特別な検証機能 MMAV では、テストベンチに検証チェックを追加できます。また、物理メモリを論理メモリ • ビューに組み込むこともできます。これらの機能は回帰テストの一部として使用するための もので、システム全体が正常に機能しているかどうかを検証するのに役立ちます。シミュレー ションでメモリ • トランザクションが発生するたびにこれらを追跡して、 システムの多くの部 分を検証できます。この例として、電気通信パケットを扱うシステムを挙げることができま す。パケットがソースから受信され、メモリにライトされます。その後これらのパケットは メモリからリードされ、変更されてもう一度送信されます。このシステムの特性の 1 つとし て、メモリの特定のアドレスにパケットがライトされた場合、それがリードされた後でしか 次のパケットをそのメモリの位置にライトできないという性質があります。このシステムの 確認に役立つ検証機能は、メモリ内の位置が 2 回続けてライトされる場合にチェックを行う アサーションです。このアサーションでは、特定のメモリへのすべてのメモリ • アクセスが監 視され、ある位置への 1 回目と 2 回目のライトの間にリードが行われない場合、エラーが報 告されます。この機能を使用すると、システムでこのパケット • プロトコルが守られなかった ときにすぐに察知できます。 また MMAV により、物理メモリのコンポーネントについて、論理的にアドレス指定された ビューを作成することもできます。これらの論理的なビューは、デバッグおよびテストベン チの生成とサポートを行う場合に重要です。論理的にアドレス指定されたビューの例として、 複数の SDRAM デバイスを 1 つのメモリ • バンクに集める場合があります。SDRAM メモリの 論理的な 32 ビット • バンクは、8 ビットの SDRAM の物理インスタンス 4 つから作成できま す。論理メモリ • ビューを作成すると、このメモリ • ビューに対してロード、格納、比較、リー ド、およびライトができ、MMAV の関数が正しい物理インスタンスに自動的にアクセスし ます。 MMAV のもう 1 つの検証機能は、トランザクション • リストです。トランザクション • リスト により、メモリのセグメントで予想されるリード動作およびライト動作のシーケンスを検証 できます。リード / ライト動作、それらのアドレス、およびそれらの値 ( オプション ) は、 シーケンスでトランザクション • リストに追加されます。 トランザクション • リストに追加さ そのリード / ライトのシーケンスがトランザクション • リ れたメモリ • セグメントは監視され、 ストに登録されているリード / ライト動作と一致するかどうかが確認されます。シーケンス、 アドレス、または値が登録されたトランザクションのリストと一致しない場合、アサーショ ンがトリガされ、3 つのアクション ( 通知が発行される、メッセージが表示されてシミュレー ションが中止される、またはメッセージが表示されてシミュレーションが終了する ) のいず れかが実行されます。登録されたそれぞれのリード / ライトは、1 つのリード / ライトまたは N 個 (N > 0) のリード / ライトと比較できます。これは、それぞれの動作ベースで制御できます。 MMAV ユーザ • ガイド 11/6/08 81 5.1 メモリ • トランザクションのアサーションの設定 メモリの参照を追跡するアサーションを設定するには、シミュレーションのテストベンチで コマンドを実行し、アサーションを登録する必要があります。このコマンドにより、シミュ レーション中にアサーションを無効または有効にするときに使用できる一意の数字が返され ます。各コマンドとその構文については、次のセクションで説明します。 5.1.1 メモリ • アクセスのアサーション このアサーションにより、特定のメモリに指定された方法でアクセスが行われた場合にア サーションがトリガされます。このアサーションは、一般的には、不要なアクセスから特定 のアドレス範囲を保護することを目的としています。データではなくコードとして指定され たアドレス空間へのライトを登録できるため、そのアドレス空間に誤ったライトが行われる と、アサーションがトリガされてシミュレーションが停止します。このアサーションの構文 は、次のとおりです。 mmassert_access(<instance id>,"<access>","<action>",<start address>,<end address>,[<address increment>]); 各パラメータについては、以下で説明します。 <access> - <access> の使用可能な型を以下に示します。 • Read - メモリ位置のリード • Write - メモリ位置へのライト • ReadorWrite - リードまたはライトのいずれか • ReadnoWrite - 以前にライトされていないメモリ位置のリード • ReadRead - 同じメモリ位置への連続した 2 回のリード • WriteWrite - 同じメモリ位置への連続した 2 回のライト 注意: 上記のアクセスの型には、大文字と小文字の区別がありません。わかりやすくするた めこのように表記されています。 <action> - <action> の使用可能な値を以下に示します。 • Note - シミュレーション • ログの記録が印刷され、シミュレーションは続行します。 • Break - シミュレーション•ログの記録が印刷され、シミュレーションは中断(一時中止)し ます。 • Exit - シミュレーション • ログの記録が印刷され、シミュレーションは終了します。 • Callback - アサーションがトリガされると、Verilog のコールバックが生成されます。 <start address>、<end address>、<address increment> これらのエントリは、アサーションが適用されるアドレスの範囲を示します。開始アドレス と終了アドレス間の範囲内の連続したアドレス (addr increment=1)、または範囲内で選択され た他のアドレス (addr increment =/ 1) が、アドレスのインクリメント値として許可されてい ます。 MMAV ユーザ • ガイド 11/6/08 82 開始アドレスと終了アドレスの両方が与えられている場合は、追加のパラメータ <address increment> ( オプション ) を指定できます。このパラメータで、その特定のアドレス範囲内の アドレスのインクリメントの段階を指定できます。たとえば、開始アドレスが 20H、終了ア ドレスが 30H と指定されており、パラメータ <address increment> が 2 に設定されている場合 は、すべてのアサーション • チェックが 2 段階ごとに行われることを意味します。終了アドレ スの 30H に達するまで、20H、22H、24H などのアドレス位置で確認が行われます。開始アド レスおよび終了アドレスが指定されていない場合は、メモリ • インスタンス全体に対して確認 が行われます。また、開始アドレスしか指定されていない場合は、指定のアドレスからアド レス空間の最後まで確認が行われます。 例: 0x0 ~ 0x4000 の位置がライトされた場合にシミュレーションを停止するには、次のようにし ます。 Verilog: m_id = $mminstanceid("tb.mem.sdram0"); a_id = $mmassert_access(m_id,"write",”break",'h0,'h400,'h1); VHDL: m_id := mmgetinstanceid("/tb/mem/sdram0"); a_id := mmAssert_Access(m_id,"write",”break",0,400,1); Tcl: set id [mminstanceid tb.mem.sdram0] mmassert_access $id write break 0 1024 1 注意: アドレスの値 (1024) は 10 進数です。16 進数ではありません。 5.1.2 データ • アクセスのアサーション 任意のアクセス• アサーションを修飾して、 データ •チェック •コンポーネントを追加すること もできます。 リードまたはライトされるデータのみに基づいてトリガされるアクセス • アサー ションを作成できます。このアサーションは、リードまたはライトされている実際のデータ に対して指定されたデータの比較関数に基づいてトリガされます。マスク値を指定して、デー タの特定のビットのみを確認することもできます。このコマンドの構文は、次のとおりです。 mmassert_datavalue(<memory id>,"<access>",”<action>",<data value>,[<mask>], "<comparison>",<start address>,<end address>,<address increment>); <comparison> ビット単位でマスクが実行された後、得られたワードで比較が実行されます。使用可能な値 は次のとおりです。 • == は、アクセスされた(マスクされた)データが指定された(マスクされた)データと等し い場合に指定します。 • MMAV ユーザ • ガイド != は、アクセスされた(マスクされた)データが、指定された(マスクされた)データと等し くない場合に指定します。 11/6/08 83 > • は、 アクセスされた ( マスクされた ) データが、 指定された ( マスクされた ) データより大 きい場合に指定します。 • は、 アクセスされた ( マスクされた ) データが、指定された ( マスクされた ) データ以上 である場合に指定します。 • は、 アクセスされた ( マスクされた ) データが、 指定された ( マスクされた ) データより小 さい場合に指定します。 • は、 アクセスされた ( マスクされた ) データが、指定された ( マスクされた ) データ以下 の場合に指定します。 >= < <= <data value>、<mask> このエントリで、比較に使用するデータおよびマスク (16 進数形式 ) を指定できます。コン マ記号は、データ値とオプションのマスク値を区切る場合に使用します。マスクを指定しな い場合は、すべてのビットが比較されます。マスク値が与えられている場合は、アクセスさ れているデータのマスクされた部分のみが、指定されたデータと比較されます。そのデータ 位置のマスク • ビットが "1" である場合は、 比較が実行されます。 マスク • ビットが "0" である 場合、そのデータ位置の比較は考慮されません。 <start address>、<end address>、<address increment> これらのエントリは、アサーションが適用されるアドレスの範囲を示します。開始アドレス と終了アドレス間の範囲内の連続したアドレス (addr increment=1)、または範囲内で選択され た他のアドレス (addr increment =/ 1) が、アドレスのインクリメント値として許可されてい ます。 開始アドレスと終了アドレスの両方が与えられている場合は、追加のパラメータ <address increment> ( オプション ) を指定できます。このパラメータで、その特定のアドレス範囲内の アドレスをインクリメントさせる段階を指定できます。たとえば、開始アドレスが 20H、終 了アドレスが 30H と指定されており、パラメータ <address increment> が 2 に設定されている 場合は、すべてのアサーション • チェックが 2 段階ごとに行われることを意味します。終了ア ドレスの 30H に達するまで、20H、22H、24H などのアドレス位置で確認が行われます。開始 アドレスおよび終了アドレスが指定されていない場合は、メモリ • インスタンス全体に対して 確認が行われます。また、開始アドレスしか指定されていない場合は、指定のアドレスから アドレス空間の最後まで確認が行われます。 例: メモリで、0x4000 よりも大きいアドレスに 0x0 よりも大きい値がライトされた場合にシミュ レーションで記録するようにアサーションを設定するには、次のようにします。 Verilog: m_id = $mminstanceid("tb.mem.sdram0"); a_id = $mmassert_datavalue(m_id,"write",”note",'h0,'h1f,">”,'h400, 'h1ffff,'h1); MMAV ユーザ • ガイド 11/6/08 84 VHDL: m_id := mminstanceid("/tb/mem/sdram0"); a_id := mmassert_datavalue(m_id,"write",”note",”0",”00011111",”>",1024,131071, 1); Tcl: set m_id [mminstanceid tb.mem.sdram0] mmassert_datavalue $m_id write note 0 00011111 > 1024 131071 1 注意: アドレスの値 (1024、131071) は 10 進数です。16 進数ではありません。 5.1.3 グローバルなメモリ • アクセスのアサーション これまでのアサーションのコマンドでは、 特定のメモリ • インスタンスに対するアサーション が登録されます。以下のアサーションでは、テストベンチのすべてのメモリ • インスタンスに 特定のアサーションが設定されます。このようなアサーションを次に示します。 mmassert_uma("<action>"); このアサーションは、シミュレーション時、まだライトされていなかったり、ロード • コマ ンドで初期化されていなかったりするメモリ内のある位置でリードが行われるとトリガさ れます。 mmassert_rwa("<action>"); このアサーションは、メモリ内の 1 つの位置で、リードが発生する前に 2 回ライトが行われ るとトリガされます。 mmassert_rra("<action>"); このアサーションは、メモリ内の 1 つの位置で、ライトされる前に 2 回リードが行われると トリガされます。 Verilog: a_id = $mmassert_uma("break"); a_id = $mmassert_rwa("note"); a_id = $mmassert_rra("exit"); VHDL: a_id := mmassert_uma("break"); a_id := mmassert_rwa("note"); a_id := mmassert_rra("exit"); Tcl: mmassert_uma break mmassert_rwa note mmassert_rra exit MMAV ユーザ • ガイド 11/6/08 85 5.1.4 パリティ • チェックのアサーション パリティ• ビットで保護されたメモリがある場合、誤ったパリティでメモリのワードがリード またはライトされたときにトリガされるアサーションを設定できます。このコマンドの構文 は、次のとおりです。 mmassert_parity(m_id,"<access>",”<action>",<parity>,<start addr>,<end addr>, <addr increment>); パラメータ <parity> では、奇数のパリティが "1"、偶数のパリティが "0" としてエンコードさ れます。 例: 0 ~ 20 のアドレスでリードが行われ、データのパリティが奇数 ("1") ではない場合、メッセー ジが出力されます。 Verilog: m_id = $mminstanceid("tb.mem.sdram0"); a_id = $mmassert_parity(m_id, "read", "note", 1, 0, 20, 1); VHDL: m_id := mmgetinstanceid("/tb/mem/sdram0"); a_id := mmassert_parity(m_id, "read", "note", 1, 0, 20, 1); Tcl: set m_id [mminstanceid tb.mem.sdram0] mmassert_parity $m_id read note 1 0 20 1 5.2 アサーションの動的な有効化および無効化 次の MMAV 関数を使用して、テストベンチ内からアサーションを動的に有効化および無効化 ( 非アクティブ化 ) できます。 mmenableassertion(assertion_id); mmdisableassertion(assertion_id); 例: assertion_id は、アサーション定義の呼び出しに割り当てられる変数です。この例では、 assertion_id が "a_id" となっています。 a_id = $mmassert_parity(m_id, "read", "note", 1, 0, 20, 1); このアサーション定義を無効にするには、次のようにします。 status = $mmdisableassertion(a_id); MMAV ユーザ • ガイド 11/6/08 86 Verilog: status = $mmenableassertion(a_id); status = $mmdisableassertion(a_id); VHDL: status := mmenableassertion(a_id); status := mmdisableassertion(a_id); Tcl: mmenableassertion a_id mmdisableassertion a_id 特定のテスト用に簡単にアサーションを追加したり、変更したりできるよう、すべてのアサー ションを Verilog、VHDL、または Tcl の 1 つのファイルに配置し、mmdisableassertion の 呼び出しを使用してすべてのアサーションを無効にすることをお勧めします。その後、 mmenableassertion の呼び出しを使用して、特定のテストでアサーションを個別に有効に できます。 5.3 エラー挿入ルーチン シミュレーション時、デナリ • メモリにエラーを挿入し、ECC チェック • ロジック機能および ハードウエア • テスト機能を実行できます。エラー挿入ルーチンは 2 種類あります。最初の ルーチンでは、リード時、メモリのワイヤ上のランダムなビットが一定の間隔で不規則に反 転されます。このルーチンにより、実際のシステムでの信号の整合性エラーがシミュレーショ ンされます。 2 番目の種類のルーチンは、 デナリ • メモリ • モデルにおけるスタック • エラーお よびカップリング • エラーを生成できる、ハード故障ルーチンです。これは、実際のシステム 内の故障メモリ • デバイスを検出するソフトウエアまたはハードウエアをテストする場合に 役立ちます。これらの呼び出しの構文および説明を次に示します。 5.3.1 エラー挿入 デナリのリリース 2.900 からエラー挿入ルーチンが強化され、複数ビットのエラーに対応可 能となったため、より柔軟にエラーのランダム化を実行できます。 注意: 挿入されるエラーの頻度には制限があります。実装により、挿入間の最小間隔は 2 と なっています。 mmerrinject(<instance id>, "error_type_string"); <error_type_string> • seed <seed_value>:乱数のシード。デフォルトでは、システム時間がシードとして使用さ れます。このため、実行のたびに異なる結果が生成されます。反復可能なシーケンスを 取得するには、このオプションを使用する必要があります。 • reads <number_of_reads_per_error> <range>:1 つのエラーにつき行われるリード数を表 す整数値。2 番目の整数 ( オプション ) で、範囲を指定できます。デフォルト値は 100 です。 MMAV ユーザ • ガイド 11/6/08 87 • bits <bit number> <bit number 2> ...:オプションの整数フィールドで、ビット • エラーの さまざまな数値を示します。 たとえば、1 ビット • エラーおよび 2 ビット • エラーを作成す るには、1 と 2 の値を指定します。デフォルト値は 1(1 ビット • エラーのみ ) です。 • percent <percentage integer> <percentage integer 2>:それぞれの整数は、上記の -bits オプ ションで定義されるビット • エラーの発生数の分布を示すパーセンテージです。整数の合 計は 100 になる必要があります。デフォルトでは、それぞれの種類ごとに均等な割合に なります。 例: 1、2、および 4 ビットのエラーを、1 ビット • エラーは 80%、2 ビット • エラーは 15%、および 4 ビット • エラーは 5% の割合で生成します。5 ~ 10 リード後に、(12 のシードを使用して ) 不 規則なエラー発生が開始します。 Verilog: m_id = $mminstanceid("tb.mem.sdram0"); success = $mmerrinject(m_id, "-seed 12 -reads 5 10 -bits 1 2 4 -percent 80 15 5"); VHDL: m_id := mmgetinstanceid("/tb/mem/sdram0"); err_id := mmerrinject(m_id, "-seed 12 -reads 5 10 -bits 1 2 4 -percent 80 15 5"); Tcl: set m_id [mminstanceid tb.mem.sdram0] mmerrinject $m_id -seed 12 -reads 5 10 -bits 1 2 4 -percent 80 15 5 mmerrinject を使用したエラー挿入の設定を無効にするには、次のコマンドを使用します。 Verilog: success = $mmsetallerrinject(0); VHDL: m_id := mmgetinstanceid("/tb/mem/sdram0"); success := mmseterrinject(m_id, 0); -- Turns OFF error injection success := mmseterrinject(m_id, 1); -- Turns ON error injection Tcl: set m_id [mminstanceid tb.mem.sdram0] mmseterrinject $m_id 0 MMAV ユーザ • ガイド 11/6/08 88 または mmsetallerrinject 0 すべてのリードにエラー挿入を行うには、次のコマンドを使用します。 $mmerrinject (id, 1); /* inject every read */ 同様に、512 リードごとに 1 回ずつ 1 ビット • エラーを挿入する必要がある場合は、次のコマ ンドを使用します。 $mmerrinject (id, 512); /* inject error every 512th read*/ 「バックドア」リードでのエラー挿入の有効化 バックドア • リード (mmreadword を使用する場合、 または Specman や VERA などのテストベ ンチ • ツールからのリードの場合 ) では、デフォルトではエラー挿入が行われません。エラー 挿入は、デフォルトでは、ピンを介して実行されるリードでしか実行されません。ただし、 mmseterrinject の 3 番目のパラメータ ( オプション ) を次のように使用すると、 バックドア • リードのエラー挿入をオンにできます。 mmseterrinject(id, status, [backdoorstatus]); この関数により、指定したメモリ • インスタンスのエラー挿入がオンまたはオフになります。 <id> エラー挿入のメモリ ID を指定します。すべての場合に -1 となります。 <status> エラー挿入ステータスを指定します。値は 0 ( オフにする ) または 1 ( オンにする ) です。 [backdoorstatus] この引数はオプションです。値は 0 ( オフにする ) または 1 ( オンにする ) です。バックドア • リードのデフォルトでは、エラー挿入はオフです ( バックドア • リードとは、ピンではなく、 PLI または DDVAPI のインターフェイスを介したリードです )。バックドア • リードで有効に できるエラー挿入については、3 番目のパラメータを 1 に設定します。 Verilog: m_id = $mminstanceid("tb.mem.sdram0"); success = $mmsetallerrinject(m_id, 1, 1); // Turns ON backdoor error injection VHDL ( 現在、ModelSim VHDL のみサポートされています ): m_id := mmgetinstanceid("/tb/mem/sdram0"); success := mmseterrinject(m_id, 1, 1); -- Turns ON backdoor error injection MMAV ユーザ • ガイド 11/6/08 89 Tcl: set m_id [mminstanceid tb.mem.sdram0] mmtcleval("mmseterrinject $m_id 1 1"); 5.3.2 故障モデリング メモリの故障の作成 デナリのメモリ • デバイスには、論理メモリ故障を適用できます。故障ロジックおよび BIST ( ビルトイン • セルフ • テスト ) ロジックをテストしてメモリ配列を検証するときに、 これらの 機能は大変便利です。mmfault コマンドを次に示します。 mmfault(<instance id>,"<type>",<addr>,<bit>,<value>,<slave addr>,<slave bit>); <type> 有効な <type> フィールドを次に示します。 • stuck-at stuck-at 故障を指定すると、指定アドレスにある指定ビットが指定値で縮退するように固 定できます。 • transition transition 故障を指定すると、指定アドレスにある指定ビットの指定値を取得できなくなり ます。 • coupling coupling 故障を指定すると、指定アドレスにある指定ビットが遷移するときに、スレーブ • アドレスのスレーブ • ビット上での遷移が強制的に実行されます。 例: メモリ • インスタンス tb.mem.sdram0 のアドレス 0x20 のビット 5 を 1 でスタックするように設 定します。 Verilog: m_id = $mminstanceid("tb.mem.sdram0"); //Stick bit 5 of address=0x20 to "1" err_id = $mmfault(m_id, "stuck-at", 'h20, 'h5, 'h1); //Make bit 1 of address=0x20 unable to transition to a '0' err_id = $mmfault(m_id, "transition", 'h20, 'h1, 'h0); //In this example, a change in bit 0 at address 7 will cause a transition //to that value at bit 2 at address 20 (if that bit does not already have //the value). err_id = $mmfault(m_id, "coupling", 'h7, 'h0, 'h0, 'h20, 'h2); MMAV ユーザ • ガイド 11/6/08 90 VHDL: m_id := mminstanceid("/tb/mem/sdram0"); --Stick bit 5 of address=0x20 to "1" err_id := mmfault(m_id, "stuck-at", 16#20#, 5, 1, 0, 0); --Make bit 1 of address=0x20 unable to transition to a '0' err_id := mmfault(m_id, "transition", 16#20#, 1, 0, 0, 0); --In this example, a change in bit 0 at address 7 will cause a transition --to that value at bit 2 at address 20 (if that bit does not already have --the value) err_id := mmfault(m_id, "coupling", 7, 0, 0, 16#20#, 2); 注意: VHDL では、mmfault コマンドにはすべてのフィールドを使用する必要があります。し たがって、使用しないフィールドには "0" を設定する必要があります。 Tcl: --Stick bit 5 of address=0x20 (dec=32) to "1" mmfault tb.mem.sdram0 stuck-at 32 5 1 0 --Make bit 1 of address=0x20 (dec=32) unable to transition to a '0' mmfault tb.mem.sdram0 transition 32 1 0 # In this example, a change in bit 0 at address 7 will cause a transition # to that value at bit 2 at address 20 (dec=32) (if that bit does not # already have the value) mmfault tb.mem.sdram0 coupling 7 0 0 32 2 故障チェックの有効化 / 無効化 一度有効化されると、デナリのメモリの故障は常にアクティブになります。次のコマンドを 使用すると、故障の定義を無効にできます。 mmsetfault(<fault id>, <flag>); これにより、故障 ID ( 上記の例では err_id) によって指定される特定の故障が、オン ( フラ グ =1) またはオフ ( フラグ =0) になります。 mmsetallfault(<flag>); この場合は、すべての故障がオン ( フラグ =1) またはオフ ( フラグ =0) になります。 Verilog: success = $mmsetfault (5, 0); //Turn off(0) fault id=5 success = $mmsetallfault(0); //Turn off all faults MMAV ユーザ • ガイド 11/6/08 91 VHDL: success = $mmsetfault (5, 0); //Turn off(0) fault id=5 success = $mmsetallfault(0); //Turn off all faults Tcl: mmsetfault 5 0 #Turn off(0) fault id=5 mmsetallfault 0 #Turn off all faults 5.4 XML を使用した MMAV での論理アドレス指定 注意: 論理メモリが作成されると、テストベンチの階層の最上位に新しいインスタンスの名 前が生成されます。したがって、mmwriteword、mmreadword、mmsave などの他の MMAV コマンドを使用する場合、論理メモリの定義で指定されるインスタンス名を階 層なしで使用する必要があります。" address.space name='<name>' " という XML タグ は、新しい論理メモリ • インスタンスのインスタンス " 名 " を表します。 このセクションでは、MMAV でのシステム • メモリの作成方法について説明します。システ ム • メモリは仮想メモリまたは論理メモリと考えることもできますが、この章では、システ ム • メモリと呼びます。これらによってデザインの物理メモリの仮想ビューが提供され、デ バッグしやすいよう、ビュー上にデータが整理されます。たとえば、データとパリティ • ビッ トを区別したり、アドレスとデータのビットの順序を変更したり、メモリをインターリーブ したりすることなどができます。 バージョン 3.0 およびそれ以前のバージョンでは、すべてのシステム • メモリが PLI、VHDL、 または DDVAPI の呼び出しを介して作成されていました。複数の呼び出しでまずメモリが作 成された後、それらが追加されました。この実装には限界があり、ホールのない MxN グリッ ドにメモリを配置する必要がありました。新しい仕様は、非常に柔軟性のある XML になっ ています。3.0 のインターフェイスはまだサポートされていますが、メモリをより柔軟に整理 する場合は、新しい XML 形式の使用をお勧めします。3.0 のインターフェイスについては、 101 ページのセクション 5.5「PLI/FLI/Tcl を使用した、MMAV での論理アドレス指定」で説 明しています。 5.4.1 XML の基本 XML (Extensible Markup Language) の構文は大変簡単で、基本的な規則は少ししかありません。 XML は言語そのものではなく、ユーザが使用する言語の定義方法に関する基準です。デナリ では、システム • メモリの作成のために使用されています。構文は、タグ (< > で区切られま す )、内容、および属性の組み合わせです。XML を記述するときに考慮すべき規則を次に示 します。 • すべての開始タグは、一致する終了タグと組み合わせるか、または自己終了タグである 必要があります。 • タグをオーバーラップさせることはできません ( 正しくネストする必要があります )。 • XML 文書は、1 つのルート要素しか持つことができません。 • XML には大文字と小文字の区別があります。 MMAV ユーザ • ガイド 11/6/08 92 デナリの場合、ファイルまたは文字列のどちらからでも XML を受け入れることができます。 詳細については、100 ページのセクション 5.4.8「MMAV とのインターフェイス」を参照して ください。 まず、ルート要素について説明します。XML が含まれているファイルまたは文字列には、 ルート要素が 1 つ含まれている必要があり、このルート要素はデナリによって認識されるも のである必要があります。デナリでは将来、システム • メモリ以外についても XML でサポー トする予定であるため、最上位レベルのルートは "advanced.verification" です。 たとえば、MMAV で処理できる最も簡単な XML は次のとおりです。 <advanced.verification> </advanced.verification> この場合、何も実行されません。 対応するする終了タグが必要であることに注意してください。終了タグは、< > の中を "/" で 開始します。< と "/" の間にはスペースを入れません。XML をこのタグで開始および終了し ないと、MMAV で処理できません。 システム • メモリを定義する場合は、タグを <system.addressing> にします。したがって、空の システム宣言は次のようになります。 <advanced.verification> <system.addressing> <!-- This is a comment --> </system.addressing> </advanced.verification> インデントは必須ではありませんが、例では、わかりやすく表示するために使用されてい ます。 また、XML 内にコメントを挿入することもできます。構文は次のとおりです。 <!-- 5.4.2 comment --> 深さおよび幅の拡張 system.addressing のタグの間に、システム • メモリを作成できます。 それぞれのシステム • メモリは、address.space タグで定義されます。これらに、一意の名前、 幅、および深さを指定する必要があります。メモリの中に、物理メモリまたは他のシステム • メモリを配置できます。 MMAV ユーザ • ガイド 11/6/08 93 幅の拡張の例: <advanced.verification> <system.addressing> <!-- Four 16mb X 8 bit memories, width expanded --> <address.space name='ram' width='32' depth='16777216'> <place baseaddr='0' bitpos='0'> <memory name='testbench.i0' /> </place> <place baseaddr='0' bitpos='8'> <memory name='testbench.i1' /> </place> <place baseaddr='0' bitpos='16'> <memory name='testbench.i2' /> </place> <place baseaddr='0' bitpos='24'> <memory name='testbench.i3' /> </place> </address.space> </system.addressing> </advanced.verification> この例は、幅 32 ビット、深さ 16Mb の "ram" というシステム • メモリの作成方法を示していま す。このシステム • メモリは、幅 8 ビットの物理メモリ 4 つが、ビット位置 0、8、16、および 24 に並べて配置されて作成されています。 次の XML の論理メモリの例を示す図を参照してください。 0 31 testbench.i0 7 07 testbench.i1 testbench.i2 07 testbench.i3 0 7 0 "ram" 図 5-1: XML の論理メモリの例 - 幅の拡張 MMAV ユーザ • ガイド 11/6/08 94 深さの拡張の例: <advanced.verification> <system.addressing> <!-- Two 32mb X 16 bit memories, depth expanded --> <address.space name='myview' width='16' depth='64M'> <place baseaddr='0' bitpos='0'> <memory name='testbench.i5' /> </place> <place baseaddr='32M' bitpos='0'> <memory name='testbench.i6' /> </place> </address.space> </system.addressing> </advanced.verification> これは次のようになります。 15 0 0 testbench.i5 32M testbench.i6 "myview" 図 5-2: XML の論理メモリの例 - 深さの拡張 5.4.3 インターリーブ インターリーブは、影響を受けるメモリの位置にインターリーブ属性を配置し、それに応じ て baseaddr を調整して行います。 MMAV ユーザ • ガイド 11/6/08 95 インターリーブの 例: <advanced.verification> <system.addressing> <!-- Four 4k X 32 bit memories, interleaved --> <address.space name='cache' width='32' depth='16K'> <place baseaddr='0' bitpos='0' interleave='4'> <memory name='processor.c1' /> </place> <place baseaddr='1' bitpos='0' interleave='4'> <memory name='processor.c2' /> </place> <place baseaddr='2' bitpos='0' interleave='4'> <memory name='processor.c3' /> </place> <place baseaddr='3' bitpos='0' interleave='4'> <memory name='processor.c4' /> </place> </address.space> </system.addressing> </advanced.verification> これは次のようになります。 31 0 0 Processor.c1 1 Processor.c2 2 Processor.c3 3 Processor.c4 4 Processor.c1 5 Processor.c2 6 Processor.c3 7 Processor.c4 ...... ....... 16380 Processor.c1 16381 Processor.c2 16382 Processor.c3 16383 Processor.c4 "cache" 図 5-3: XML の論理メモリの例 - インターリーブの拡張 MMAV ユーザ • ガイド 11/6/08 96 5.4.4 アドレスのスクランブル 必要に応じて、アドレスのビットを配置し直すこともできます。105 ページのセクション 5.6 「アドレスのスクランブル」の例を次に示します。この例では、scram1 を介して tb.uut1 にア クセスする場合に使用される、各アドレスのビット 4 ~ 7 と 12 ~ 15 を入れ替えています。 <advanced.verification> <system.addressing> <address.space name='scram1' width='24' depth='1M'> <place baseaddr='0' bitpos='0' > <address.map bits='19:16 12:15 11:8 4:7 3:0' /> <memory name='tb.uut1' /> </place> </address.space> </system.addressing> </advanced.verification> 5.4.5 データ • ビットの並べ替えおよびマスキング データ • ビットを異なる順序で表示したり、それらのサブセットのみを特定の場所で使用した りすることもできます。 <advanced.verification> <system.addressing> <address.space name='data' width='30' depth='1M'> <place baseaddr='0' bitpos='0' > <data.map> <word bits='31:17 15:1' /> </data.map> <memory name='tb.uut2' /> </place> </address.space> <address.space name='parity' width='2' depth='1M'> <place baseaddr='0' bitpos='0' > <data.map> <word bits='16 0' /> </data.map> <memory name='tb.uut2' /> </place> </address.space> </system.addressing> </advanced.verification> 代わりに、以下を実行して address.space の幅を 32 に変更することで、これらを組み合わせて 右側にパリティがある 32 ビット • メモリを作成できます。 <word bits='31:17 15:1 16 0' /> MMAV ユーザ • ガイド 11/6/08 97 5.4.6 ホールの作成 この仕様では、システム • メモリに「ホール」を残すこともできます。ホールとは、物理シス テム • メモリまたは子システム • メモリによって占有されていない空間です。 空間を完全に指 定する必要はありません。たとえば、システム • メモリの一番下の 64K を空のままにする場合 は、64K に相当する baseAddr からメモリの配置を開始します。 5.4.7 統合 これらの概念をまとめる場合の例を次に示します。 256KB x 8 のメモリをビッグ • エンディアンの 32 ビット • ワードでアドレス指定します。 幅を 32KB x 64 で拡張し、リトル • エンディアンの 32 ビット • ワードでアドレス指定します。 <advanced.verification> <system.addressing> <address.space name='wide' width='64' depth='64K'> <place baseaddr='0' bitpos='0' > <data.map> <word bits='7:0 15:8 23:16 31:24' /> </data.map> <memory name='narrow' /> </place> <place baseaddr='0' bitpos='32' > <data.map> <word bits='31:0' /> <word bits='63:32' /> </data.map> <memory name= 'extra_wide' /> </place> </address.space> </system.addressing> </advanced.verification> 論理メモリの図 0 31 32 ワード 0 ワード 1 ワード 2 ワード 3 [7:0] [15:8] [23:16] [31:24] ワード 4 ワード 5 ワード 6 ワード 7 [7:0] [15:8] [23:16] [31:24] "narrow" MMAV ユーザ • ガイド 63 [31:0] [63:32] "extra_wide" 11/6/08 98 0 31 32 . . . 63 . . . ワード 256K これまでの例で仕様の大部分はわかりやすく説明されていますが、それぞれの XML 要素に ついて詳しく説明します。それぞれの要素の後に、その属性の説明があります。 <system.addressing> - 論理アドレス指定を記述するためのコンテナ。 <address.space> - 論理アドレス空間を記述します ( 必須項目:name、width、depth)。 − − − name - 物理メモリのインスタンス名に類似するアドレス空間の識別子。 width - このアドレス空間の各ワードのビット数。 depth - アドレス空間のワード数。 <memory> 物理メモリのインスタンスを指します ( 必須項目:name)。 − name - 物理メモリまたは子のシステム • メモリのインスタンス名。 <place> 物理メモリまたは論理アドレス空間内の論理アドレス空間の配置属性を指定します ( 必須項目:baseaddr、オプション:bitpos、interleave)。 − − − baseaddr - 論理空間内で子が開始されるアドレス。 bitpos - 子の LSB に対応する論理空間のビット数 (LSB = 0)。デフォルトは 0 です。 interleave - 子の内部の連続する位置間の論理空間のオフセット数値。たとえば、 インターリーブが 2 である場合、子のワードは論理アドレスに 1 つおきに対応しま す。同様に 2 番目のインターリーブを '2' に、その baseaddr を最初の baseaddr よ り 1 つ大きい値に設定し、もう 1 つの子をインターリーブできます。デフォルトは 1 です。つまり、この場合アドレスはスキップされません。 <data.map> 囲まれている位置 ( つまり <place>) を変更し、元のビット順 (width-1 : 0) の完全 なワード以外の方法で子を表示できるようにします。 MMAV ユーザ • ガイド 11/6/08 99 <word> - <data.map> に 1 つまたはそれ以上の <word> がある場合、配置されたメモリを表示 するためのビットの配置が記述されます ( 必須:bits)。 − bits - スペースで区切られた、ビット番号およびビット範囲のリスト。ビットには番 号が付きます。最初に最下位のビットに 0 が付けられます。ビット範囲は、コロンで 結合された 2 つのビット番号です。範囲は、開始から終了までのすべてのビットを表 します。範囲は昇順または降順のどちらも可能で、左側の番号が小さい場合は昇順、 大きい場合は降順になります ( 完全を期すため、ビット範囲が N:N である場合は、 ビット番号 N と同じであると考えます )。 <word> が 1 つである場合、配置されたメモリのビットを論理的に異なる順番で配置し直すこ とができます。本来の幅よりも広いバス幅でメモリを表示するには、"bits" 属性に (width-1) より大きいビット番号を含めることができます。ビット番号 N * width + B は、連続する N 番 目のワードのビット B を示します。上記の例の最初の <word> を参照してください。 本来のバス幅よりも狭い幅でメモリを表示するには、複数の <word> を使用します。このと き、"bits" 属性を使用して、論理ワード間でのワードのビットの割り当て方法を示します。上 記の例の 2 番目の <data.map> を参照してください。 <address.map> 囲まれている位置を変更し、昇順アドレスの連続した順番以外の方法で子を 表示できるようにします ( 必須:bits)。 − bits - 空白で区切られた、ビット番号およびビット範囲のリスト。ビットには番号が 付きます。最初に最下位のビットに 0 が付けられます。範囲について説明した、上記 の <word> の bits 属性を参照してください。 <address.map> の適用方法を理解するため、アドレス • マッピングがない状態での配置済みメ モリのアドレスの計算を考えてみます。囲まれているアドレス空間のアドレスから、子の baseaddr を減算し、そのインターリーブで割り、配置場所内の <data.map> によって決定され る子ワード対論理ワードの比を乗算します。これにより、論理アドレスが対応する子メモリ のアドレスを得ることができます。また、複数の子の位置からビットを組み合わせる <data.map> の場合は、その最初のアドレスを得ることができます。<address.map> が位置に 適用されるときには、計算されたこのアドレスのビットが、bits 属性の指定に従って再配置 されます。 5.4.8 MMAV とのインターフェイス ファイルまたはテストベンチの文字列にこれらのメモリを定義した後は、次の方法でデナリ の環境にメモリを作成できます。 Verilog: success = $mmxmleval("xmlString"); success = $mmxmlfile("filename"); VHDL: success := mmXmlEval(xmlString); success := mmXmlFile(filename); ルーチンの複数の呼び出しを作成できます。 すべてのシステム • メモリを同じファイルまたは 文字列のバッファに存在させることはできますが、必ずしもその必要はありません。 MMAV ユーザ • ガイド 11/6/08 100 $mminstanceid を使用してこのメモリのインスタンスIDを調べ、 後続の呼び出しで使用でき ます。後続の呼び出しでは、名前ではなく ID 番号が使用されます。 5.5 PLI/FLI/Tcl を使用した、MMAV での論理アドレス指定 デナリ MMAV のバージョン 3.1 のセクション 5.4「XML を使用した MMAV での論理アドレ ス指定」の前に、テストベンチの PLI/FLI または Tcl の呼び出しを使用して、幅、深さを拡張 し、インターリーブを行ったメモリを簡単に定義しました。最初のコマンドは、論理アドレ スの " 形 " を指定するために使用します。次にそれ以降のコマンドを使用して、特定の物理 メモリを論理的にアドレス指定されたメモリにマップします。 論理アドレスが作成されると、リード、ライト、保存、およびリストアに関する PLI/FLI/Tcl の標準的な関数を、物理メモリと同様に論理的にアドレス指定されたメモリで使用できます。 ただし、比較のコマンドは除きます。 これらのコマンドでサポートされる論理アドレスは、以下の組み合わせで作成されます。 5.5.1 幅の拡張 複数の物理メモリを組み合わせて、より多くのビットを持つ論理アドレスのワードを形成で きます。この方法で組み合わされた物理メモリは同じ幅である必要はありませんが、同じア ドレス空間を持つ必要があります。 5.5.2 深さの拡張 複数の物理メモリを組み合わせて、論理的にアドレス指定されたメモリでより大きいアドレ ス空間を形成できます ( 構成メモリのすべてのアドレス空間の合計に相当します )。この方法 で組み合わされた物理メモリは同じアドレス空間を保持する必要はありませんが、同じワー ド • サイズである必要があります。 5.5.3 インターリーブ 複数の物理メモリをインターリーブさせて、論理的にアドレス指定されたメモリ内のアドレ スを通過させることで、インターリーブされた物理メモリを繰り返し使用できます。インター リーブされた物理メモリは、同じ幅および深さである必要があります。 MMAV ユーザ • ガイド 11/6/08 101 5.5.4 マスキング マスクは、論理的にアドレス指定されたワードを定義するときに、物理メモリのワードの一 部のビットのみを選択する場合に使用できます。これらのビットはメモリ内で連続している 必要はありませんが、ビットを並べ替える仕組みは存在しません。マスキングは、論理的に アドレス指定されたメモリを構成するそれぞれの物理メモリに対して固定されています。ま た、深さが拡張されている場合、深さの拡張に関連しているすべての物理メモリについて、 マスクが一貫している必要があります。マスキングが使用される例として、物理メモリのワー ドが 2 つ ( またはそれ以上 ) の異なる値を表す場合が挙げられます。たとえば、最初の 4 ビッ トが優先される値、つまりポインタを表し、残りのビットがデータを表すとします。適切な マスクを使用することで、論理的にアドレス指定された 2 つのメモリを、これら 2 つの値に 対応させて定義できます。結果として得られる論理的にアドレス指定されたメモリは通常、 物理メモリの MxN 配列となり、インターリーブおよびマスクはある場合とない場合があり ます。 id = $mmcreatesysmem( "logically addressed memory name", "logically addressed memory instance id", width, depth, [numinterleaves] ); • logically addressed memory name - 論理的にアドレス指定されたメモリのインスタンス名 に対する、ユーザ指定の名前 • logically addressed memory instance id - 論理的にアドレス指定されたメモリのユーザ指定 インスタンス ID 注意:これは、mmload、mmsave、mmwriteword、mmreadword など、以降の MMAV コ マンドと共に使用されるインスタンス ID です。 • width - 幅の拡張で使用される物理メモリの数 • depth - 深さの拡張で使用される物理メモリの数 • interleaves - インターリーブのレベル このコマンドは、論理的にアドレス指定されたメモリのコンフィギュレーションを作成する ために使用されます。物理メモリは "MxN" の配列に配置され、インターリーブはある場合と ない場合があります。論理的にアドレス指定されたメモリに対応する ID が返されます。物理 メモリは論理的にアドレス指定されたメモリにマップされていないため、このコマンドの使 用後であっても、論理的にアドレス指定されたメモリはまだ使用可能な状態ではありません。 使用可能にするには、次のコマンドを使用します。 result = $mmaddtosysmem( <logically addressed memory id>, <instance id>, <width position>, <depth position>, [<interleave position>]) このコマンドを使用して、mmcreatesysmem コマンドで以前に作成された論理アドレスのメ モリに、物理メモリを追加します。この種類のコマンドは、メモリが使用可能になる前に、 mmcreatesysmem コマンドで定義されるマトリックスのすべての位置について発行される必 要があります。 logically addressed memory id - mmcreatesysmem によって返される論理的にアドレス指定さ れたメモリの ID MMAV ユーザ • ガイド 11/6/08 102 instance id - 論理的にアドレス指定されたメモリに追加される物理メモリの ID width position - このメモリが配置される MxN マトリックス内の幅の位置 ( 値は 0 ~ width-1 である必要があります )。 depth position - このメモリが配置される MxN マトリックス内の深さの位置 ( 値は 0 ~ depth1 である必要があります )。 interleave position - このメモリのインターリーブのレベル ( 値は 0 ~ interleave-1 である必要 があります )。 この関数は、成功した場合は 0 を、成功しなかった場合は -1 を返します。 result = $mmaddtosysmemmask( <logically_addressed_memory_id>, <physical_id>, "mask string" , <width position>, <depth position>, [interleave position]) この関数は、マスクのバイナリ表現を表す文字列が指定される点を除いて、以前説明した mmaddtosysmem と同じです。マスクは、特定の幅の位置のすべての物理メモリについて同じ である必要があることに注意してください。 この関数は、成功した場合は 0 を、成功しなかった場合は -1 を返します。 Verilog: m_id1 m_id2 m_id3 m_id4 = = = = $mminstanceid("tb.mem.sdram0"); $mminstanceid("tb.mem.sdram1"); $mminstanceid("tb.mem.sdram2"); $mminstanceid("tb.mem.sdram3"); vid = $mmcreatesysmem("logical", "new_memory_name", 2, 2, 1); success = $mmaddtosysmem(vid, m_id1, 0, 0, 0); success = $mmaddtosysmem(vid, m_id2, 1, 0, 0); success = $mmaddtosysmem(vid, m_id3, 0, 1, 0); success = $mmaddtosysmem(vid, m_id4, 1, 1, 0); VHDL: m_id1 m_id2 m_id3 m_id4 := := := := mmgetinstanceid("/tb/mem/sdram0"); mmgetinstanceid("/tb/mem/sdram1"); mmgetinstanceid("/tb/mem/sdram2"); mmgetinstanceid("/tb/mem/sdram3"); vid := mmcreatesysmem("logical", "new_memory_name", 2, 2, 1); success := mmaddtosysmem(vid, m_id1, 0, 0, 0); success := mmaddtosysmem(vid, m_id2, 1, 0, 0); success := mmaddtosysmem(vid, m_id3, 0, 1, 0); success := mmaddtosysmem(vid, m_id4, 1, 1, 0); MMAV ユーザ • ガイド 11/6/08 103 Tcl: set set set set m_id1 m_id2 m_id3 m_id4 [mminstanceid [mminstanceid [mminstanceid [mminstanceid tb.mem.sdram0] tb.mem.sdram1] tb.mem.sdram2] tb.mem.sdram3] set vid [mmcreatesysmem logical mmaddtosysmem $vid $m_id1 0 0 0 mmaddtosysmem $vid $m_id2 1 0 0 mmaddtosysmem $vid $m_id3 0 1 0 mmaddtosysmem $vid $m_id4 1 1 0 new_memory_name 2 2 1] 上記の例では、論理的にアドレス指定されたメモリが物理メモリの 2x2 の配列から作成され ます。 次の例では、論理的にアドレス指定された 2 つのメモリ ( データおよびポインタ ) が、マス クを使用して、幅 8 ビットの 2 つの物理メモリから作成されます。論理的にアドレス指定さ れた最初のメモリは、最初の物理メモリの 5 つの最上位ビットで構成されています。例では、 これが 5 ビットのポインタを表します。論理的にアドレス指定された 2 番目のメモリは、最 初の物理メモリの最下位のビットおよび 2 番目の物理メモリのすべてのビットから作成され ます。例では、これは 11 ビットの論理的にアドレス指定されたワードを表します。 Verilog: //Pointer m_id1 = $mminstanceid("tb.mem.sdram0"); m_id2 = $mminstanceid("tb.mem.sdram1"); vid = $mmcreatesysmem("logical", "data", 1, 1, 1); success = $mmaddtosysmemmask(vid, m_id1, "11111000", 0, 0, 0); //Data vid1 = $mmcreatesysmem("logical", "pointer", 2, 1, 1); success = $mmaddtosysmemmask(vid1, m_id1, "00000111", 0, 0, 0); success = $mmaddtosysmemmask(vid1, m_id2, "11111111", 1, 0, 0); VHDL: -- Pointer m_id1 := mmgetinstanceid("/tb/mem/sdram0"); m_id2 := mmgetinstanceid("/tb/mem/sdram1"); vid := mmcreatesysmem("logical", "data", 1, 1, 1); success := mmaddtosysmemmask(vid, m_id1, "11111000", 0, 0, 0); -- Data vid1 := mmcreatesysmem("logical", "pointer", 2, 1, 1); success := mmaddtosysmemmask(vid1, m_id1, "00000111", 0, 0, 0); success := mmaddtosysmemmask(vid1, m_id2, "11111111", 1, 0, 0); MMAV ユーザ • ガイド 11/6/08 104 Tcl: # Pointer set m_id1 [mminstanceid tb.mem.sdram0] set m_id2 [mminstanceid tb.mem.sdram1] set vid [mmcreatesysmem logical data 1 1 1] mmaddtosysmemmask $vid $m_id1 11111000 0 0 0 -- Data set vid1 [mmcreatesysmem logical pointer 2 1 1] mmaddtosysmemmask $vid1 $m_id1 00000111 0 0 0 mmaddtosysmemmask $vid1 $m_id2 11111111 1 0 0 5.6 アドレスのスクランブル アドレスのスクランブルを使用して、物理メモリから「スクランブルされた」メモリを作成 できます。スクランブルは、スクランブルされたアドレスに対する元のアドレスのビットご との変換で構成されます。これにより、特定のアドレスをメモリにマッピングする方法を再 定義できます。 mid = $mmaddressmap("scrambled memory name", memory_id, "<address map>", [output message level]); 説明: • scrambled memory name - スクランブルされたアドレスの新しく作成されスクランブル されたメモリ • memory_id - 「スクランブルされた」メモリにマップされる物理メモリ • "address map" - 物理アドレスから「クランブルされた」アドレスへのビットごとの変換 • [output message level] - ( オプション ) 物理アドレスから「スクランブルされた」アドレス への変換を示す詳しいメッセージ アドレス • マップの最初の整数は、スクランブルされたアドレスの最上位のビットの値を指定 します。つまり、最初の整数で、元のアドレスのどのビットがスクランブルされたアドレス の最上位のビットに使用されるかを指定します。同様に、最後の整数で最下位のビットが指 定されます。たとえば、4 ビット • アドレスのビットを入れ替える場合、アドレス • マップは "0 1 2 3" です。ここで、スクランブルされたアドレスの MSB は、元のアドレスのビット 0 で表 されます。LSB は、元のアドレスのビット 3 によって表されます。たとえば、このマッピン グでは、アドレス 0xa が 0x5 にスクランブルされます (1010 -> 0101)。 アドレス • マップで有効な整数は 0 .. n の範囲内で、n は、メモリ • インスタンスでアドレス指 定可能な最大のメモリ位置を表すのに必要なビットの数です。たとえば、0x1fffff がアドレス 指定可能な最大のメモリ位置である場合、21 のマッピング整数を指定する必要があります。 この場合、マッピング整数に有効な値は 0 ~ 20 です。 MMAV ユーザ • ガイド 11/6/08 105 スクランブル時に詳しいメッセージを表示するには、$mmaddressmap の引数 [output message level] に 1 の値を使用します。これにより、 標準出力に次のようなメッセージが表示されます。 *Denali* (write) scramble:address 255 maps to 8160 デフォルトの場合、stdout にこのようなメッセージは表示されません。 Verilog: mid = $mmaddressmap( "scram1", id1, "19 18 17 16 12 13 14 15 11 10 9 8 4 5 6 7 3 2 1 0", 1 ); このコマンドにより、スクランブルされたメモリ "scram1" へのすべてのライトおよびリード がスクランブルされます。このメモリは、物理メモリ 'id1' で構成されています。スクランブ ルのスキームは、特定のアドレスのビット 4 ~ 7 と 12 ~ 15 の入れ替えで構成されます。 VHDL: mid := mmaddressmap( "scram1", id1, "19 18 17 16 12 13 14 15 11 10 9 8 4 5 6 7 3 2 1 0", 1 ); Tcl: set id1 [mminstanceid tb.mem.sdram0] mmaddressmap scram1 $id1 "19 18 17 16 12 13 14 15 11 10 9 8 4 5 6 7 3 2 1 0" 1 5.7 スクラッチパッドのメモリ スクラッチパッドのメモリを使用して、C をベースとした簡単な MxN メモリ配列を作成でき ます。これは、キャッシュやエンベデッド • メモリの配列などのモデリングに大変便利です。 $mmcreatescratchpad(<name>,<width>,<depth>,<init_val>); • name - mmcreatescratchpad によって返されるスクラッチパッドの名前 • width - ビット単位のスクラッチパッドの幅 ( 整数 ) • depth - スクラッチパッドのワード数 ( 整数 ) • init_val - スクラッチパッドの最初のメモリの値 (0、1、x、X、"") このコマンドは、PLI または Tcl を介して使用できます。引数 init_val はオプションではあ りませんが、空の文字列 "" にすることができます。この場合、MMAV ではデフォルト値で ある "X" が使用されます。 例: 32 ビット x1024 のスクラッチパッドのメモリ "scratchpad1" を作成します。 Verilog: sp_id = $mmcreatescratchpad (scratchpad1, 32, 1024, 1); MMAV ユーザ • ガイド 11/6/08 106 VHDL: VHDL の場合、デナリでは func_lf.vhd (NC-VHDL 用 ) および func_mti.vhd (MTI 用 ) に 2 つの直接 関数を作成しています。 FUNCTION mmCreateScratchpad( name : STRING; width : INTEGER; depth : INTEGER; initvalue : STD_LOGIC_VECTOR ) return INTEGER; attribute FOREIGN of mmCreateScratchpad:function is "Clib:mmcreatescratchpad"; 2 回以上インスタンスが生成されるエンティティ/ アーキテクチャ内にこの呼び出しを置く場合、 VHDL の path_name 属性を使用することで、新しく作成されたスクラッチ • パッドのメモリへの パス名を一意にできます。 entity simple_mem is port ( a : in std_logic_vector (9 downto 0); data : inout std_logic_vector(7 downto 0); cs, we, clk : in std_logic ); end simple_mem; use work.memory_modeler.all; architecture behavior of simple_mem is signal width: integer := 8; signal size:integer := 1024; signal id: integer := -1 ; begin process begin id <= mmcreatescratchpad(simple_mem'path_name & "storage", width, size, "00000000"); wait; end process; これについて、次のようにテストベンチで 2 回インスタンスの生成が行われるとします。 i_simple_mem: simple_mem port map( a => tb_a, data => tb_data1, cs => tb_cs, we => tb_we, clk => tb_clk); j_simple_mem: simple_mem port map( a => tb_a, data => tb_data2, cs => tb_cs, we => tb_we, clk => tb_clk); MMAV ユーザ • ガイド 11/6/08 107 次のように一意のパス名が与えられます。 *Denali* Class: scratchpad Instance: ":simple_tb:j_simple_mem:simple_memstorage" Size: 1Kx8 *Denali* Memory id: 0 created of size 1024, width 8. *Denali* Class: scratchpad Instance: ":simple_tb:i_simple_mem:simple_memstorage" Size: 1Kx8 *Denali* Memory id: 1 created of size 1024, width 8. または、mmcreatescratchpad から返される ID でメモリを参照することもできます。 Tcl: set sp_id [mmcreatescratchpad scratchpad1 32 1024 1] 上記の例では、幅 32 ビット、深さ 1024 ワード ( 変更されるまで、それぞれに FFFFFFFF が含 まれています ) の scratchpad1 というスクラッチ • パッド • メモリが作成されます。変数 sp_id には、コマンドから返される整数値が含まれています。これは、作成されたメモリの ID です。次 のメッセージがデナリの履歴ファイルに表示されます。 *Denali* Memory id: 1 created of size 1024, width 32. その後、mmreadword と mmwriteword ( および他の MMAV の呼び出し ) を使用して、"1" ( お勧めしません ) または sp_id (Tcl の場合は $sp_id) を参照し、テストベンチからこのメ モリにアクセスできます。 また、PureView を使用して、これらのメモリ内容を表示することも できます。 MMAV ユーザ • ガイド 11/6/08 108 5.8 MMAV と Mentor Graphic's の Seamless HW/SW CoVerification 製品の併用 Mentor Graphic's の Seamless Hardware/Software Co-Verification 製品は、デナリ MMAV のバー ジョンとセットで販売されています。以前は、新しいデナリのリリースを Seamless と併用す る場合は、お客様に Seamless の新しいリリースをお待ちいただく必要がありました。デナリ および Seamless の両方が新しくリリースされたため、もうこのようなことはありません。 新しいデナリのリリースを現在の Seamless のリリースと併用するには、$CVE_HOME/denali にデナリの新しいリリースをインストールするだけで済みます。また、$CVE_HOME/denali を別の場所にあるデナリ MMAV のリリースにシンボリック • リンクさせることもできます。 この方法によりリリースをより簡単に変更し、古いリリースも維持できます。 Seamless とデナリの PureView を併用するには、第 2 章 「PureView : グラフィカル • ツールの使 用」および第 3 章 :「PureView でのメモリのデバッグ」を参照してください。 MMAV ユーザ • ガイド 11/6/08 109 5.9 エンベデッド ASIC メモリのための MMAV の使用 このセクションでは、MMAV でエンベデッド ASIC メモリを作成する方法について説明し ます。 デナリのエンベデッド• メモリ• ソリューションは、 標準的なベンダ •モデルに比べユーザビリ ティおよび検証機能が大幅に向上しています。デナリでは、レジスタ • ファイル、エンベデッ ド SRAM、エンベデッド DRAM、およびエンベデッド Flash について、MMAV 製品からシ ミュレーション • モデルを提供しています。これらの高品質モデルにより、デナリの事実上の 外部メモリ • モデルと同じ機能が提供されます。 デナリのエンベデッド • メモリ • ソリューションを使用する主なメリットとして、 これらのモ デルが、デナリのすべての検証ツールおよびデバッグ • ツールと連動する点が挙げられます。 デナリのすべてのメモリ • モデルの主な機能の一部を次に示します。 • ファイルからメモリに事前にロードできます。 • モデルに対して、 「バックドア」でリードおよびライトができます。 • メモリの内容を「ゴールデン」ファイルと比較できます。 • ファイルにメモリ内容を保存できます。 • メモリのトランザクションにアサーションをセットアップできます。 • エラー挿入機能および BIST 機能をセットアップできます。 • PureView を使用して、メモリ内容を対話形式で表示および編集できます。 デナリのモデルのもう 1 つの主な長所は、シミュレーションの占有領域が小さい点です。通 常、ベンダのモデルでは、メモリの記憶領域に大きな静的配列が使用されますが、デナリで はダイナミック • メモリ • アロケーションが使用され、シミュレーション時に使用されるメモ リしかアロケートされません。 デナリの PureView グラフィカル • デバッガを使用して、シミュレーション時にエンベデッド • メモリの内容を表示でき、シミュレーション中に内容を " オンザフライ " で編集できます。 MMAV ユーザ • ガイド 11/6/08 110 5.9.1 レジスタ • ファイル PureView を使用すると、独自のレジスタ • ファイルを簡単に作成できます。次の図を参照して ください。 図 5-4: PureView のレジスタ • ファイル • セクションの GUI Auxiliary ピンのセクションも存在することに注意してください。 これによりエンベデッド • デ バイスで共通の他のテスト • ピンなどを定義できます。これで Verilog または VHDL の正確な シェルを作成し、 デザインに接続できます。ASIC サプライヤのデータシートのレジスタ • ファ イルの特長を比較するだけで、簡単にデナリのレジスタ • ファイル • モデルを作成し、デザイ ンでインスタンスを生成できます。デザインにデナリのレジスタ • ファイルを追加すると、メ モリ• モデルのすべての機能を利用できます。 デナリがデファクトのメモリ •モデル •ソリュー ションとして位置付けられる理由は、まさにこの点にあります。 MMAV ユーザ • ガイド 11/6/08 111 5.9.2 エンベデッド SRAM デナリのエンベデッド SRAM モデルは、可能な限り多くのライブラリを対象とすることを目 的とした汎用モデルです。通常、ベンダのメモリには、ここで説明するモデルの機能のサブ セットが含まれています。 PureView のエンベデッド SRAM モデルのスクリーン • ショットを次に示します。 図 5-5: PureView のエンベデッド SRAM の GUI デナリのエンベデッド SRAM モデルでは複数のデータ • ポートを定義でき、これらをリー ド、ライト、またはリードとライトに柔軟に設定できます。 Read Pins Bit String フィールドおよび Write Pins Bit String フィールドは、I/O ポートのビッ ト • マップ用に指定する必要があります。"1" は使用可能なポート、"0" は使用不可能なポート を表します。たとえば、1 つのポートのメモリ部分に、次のように指定できます。 "Read Pins Bit String" = "1" "Write Pins Bit String" = "1" これは、データ入力ピンが 1 つ、データ出力ピンが 1 つあることを示します。2 つのポート のメモリについて、次のように指定するとします。 "Read Pins Bit String" = "10" "Write Pins Bit String" = "01" MMAV ユーザ • ガイド 11/6/08 112 この場合、ポート 0 にデータ入力ピンが 1 つあり、データ出力ピンがないことを示します。 ポート 1 にはデータ入力ピンがなく、データ出力ピンが 1 つあることを示します。 2 つのポートのメモリについて、次のように指定するとします。 "Read Pins Bit String" = "11" "Write Pins Bit String" = "11" この場合は、ポート 0 にデータ入力ピンおよびデータ出力ピン ( リード / ライト ) が 1 つずつ あることを示し、ポート 1 には、データ入力ピンおよびデータ出力ピンが 1 つずつあること を示します。 5.9.3 エンベデッド DRAM デナリでは、エンベデッド DRAM モデルも提供しています。今回、このモデルは、IBM の SA27-E および Cu-11 のエンベデッド DRAM モデルにも完全に対応しています。PureView の IBM エンベデッド DRAM モデルのスクリーン • ショットを次に示します。 図 5-6: PureView のエンベデッド DRAM の GUI MMAV ユーザ • ガイド 11/6/08 113 CHAPTER 6 6 MMAV テストベンチの統合 この章では、サポートされているさまざまなテストベンチ • インターフェイスと MMAV との 統合について説明します。 6.1 Verilog インターフェイス このセクションでは、Verilog テストベンチから MMAV を使用する方法について説明します。 6.1.1 MMAV と Verilog の概要 MMAV では、PLI を使用して Verilog を直接統合できます。PureView を使用することで、メ モリ • モデル • インスタンスの Verilog ラッパーを生成できます。 詳細については、 10 ページの 「PureView グラフィカル • ツールの使用」を参照してください。 注意: 現在、デナリでは、言語ごとに専用のラッパーをサポートしています。たとえば、 ミックスド • モードのシミュレーションでは、Verilog ラッパーを使用している場合、 Verilog テストベンチでしかインスタンスを生成できません。VHDL ラッパーを使用し ている場合は、VHDL テストベンチでしかインスタンスを生成できません。 また、MMAV では、メモリへのアクセス時に Verilog テストベンチへのコールバックを生成 できます。詳細については、20 ページの「[Simulation Environment]」を参照してください。 6.1.2 MMAV と Verilog のシミュレーション Cadence Verilog-XL Cadence Verilog シミュレータをモデルにリンクするには、Cadence リリースで提供される vconfig スクリプトを実行します。このスクリプトは、いくつかのオプションを対話形式で要 求してくるので、適切な設定環境情報を回答してください。回答が不明の場合は、<RETURN> キーを押してデフォルト値を選択してください。 veriuser.c ファイルの質問に対しては、たとえば、次のように ${DENALI}/verilog/ veriuser.c と入力します。 The user template file 'veriuser.c' must always be included in the link statement. What is the path name of this file? [veriuser.c] : ${DENALI}/verilog/veriuser.c MMAV ユーザ • ガイド 11/6/08 114 Verilog 実行ファイルにリンクされる他のファイルに関する質問に対しては、たとえば、次の ように ${DENALI}/verilog/denverlib.o と入力します。 List the files one at a time, terminating the list with a single '.' -----------> ${DENALI}/verilog/denverlib.o -----------> . このプログラムが完了すると、cr_vlog という名前のスクリプトが作成されます。このスク リプトを実行することにより、デナリ • モデルを含む新しい Verilog 実行ファイルが作成され ます。 コンパイルスクリプトの例は次のとおりです。 #!/bin/csh -f # # Script to create : Dynamic PLI library # set verbose mkdir $DENALI/verilog/lib # Verilog XL gcc -c $DENALI/verilog/veriuser.c \ -I$CDS_INST_DIR/tools/verilog/include -o $DENALI/verilog/veriuser.o \ # Linking step ld -G \ $DENALI/verilog/veriuser.o \ $DENALI/verilog/denverlib.o \ -o $DENALI/verilog/lib/libpli.so unset verbose Cadence NC-Verilog デナリ PLI を NC-Verilog にスタティックにリンクする ( すべてのプラットフォーム ): 1. CDS_INST_DIR 環境変数を NC-Verilog のインストールディレクトリに設定します。 % setenv CDS_INST_DIR <nc_install_dir> setenv INSTALL_DIR $CDS_INST_DIR setenv ARCH to sun4v or lnx86 as appropriate 2. $CDS_INST_DIR/tools/inca/files/Makefile.nc ファイルをワーキング•ディレクト リに Makefile としてコピーします。 % cp $CDS_INST_DIR/tools/inca/files/Makefile.nc Makefile 3. 以下のように Makefile のコピーを編集します。 VERIUSER_C ステートメントをデナリのコピーを指すように編集します。 VERIUSER_C = $(DENALI)/verilog/veriuser.c ステートメントにデナリ PLI オブジェクト • モジュールを追加します。 PLI_OBJECTS = $(DENALI)/verilog/denverlib.o MMAV ユーザ • ガイド 11/6/08 115 ダイナミック • リンクに使用する ARCH_RELOCATE_OPT 定義をコメントにします。 # ARCH_RELOCATE_OPT = ... 4. スタティックな実行形式コードを構築します。 % make static Synopsys VCS VCS で MMAV を実行する場合、シミュレータにデナリのメモリ • モデルをリンクする必要が あります。他の Verilog PLI と異なり、VCS は veriuser.c を使用しません。その代わり、PLI テーブルを読むことによってどの PLI 関数が存在するかを確認します。 VCS を実行する場合は、例は次のように、既存のコマンド • ラインに pli.tab ファイルとオ ブジェクト • ファイルの場所を追加して MMAV とリンクさせます。 vcs -M -P $DENALI/verilog/pli.tab \ -LDFLAGS "$DENALI/verilog/denverlib.o" \ <your verilog files> 注意: 特定のプラットフォーム ( 特に Linux) では、次のような「ダイナミック • リンク • ライ ブラリ」(-ldl を使用 ) とリンクさせる必要があります。 vcs -M -P $DENALI/verilog/pli.tab \ -LDFLAGS "$DENALI/verilog/denverlib.o" -ldl \ <your verilog files> これで、simv を使用できようになります。 デナリ VCS PLI テーブル • ファイル $DENALI/verilog 内に、 2 つの VCS PLI テーブル • ファイル (pli.tab と pli-fast.tab) があ ります。 pli.tab ファイルは、ACC 機能が有効になる領域がデザイン全体となるように "*" ワイルド カードを使用しています。 通常、初期化パフォーマンスの問題が発生しないようであれば、$DENALI/verilog/pli.tab を使用するようにしてください。 pli-fast.tab ファイルは、ACC 機能が有効になる領域を制限するために、%TASK ワイルド カードを使用しています。これによって、シミュレーション実行時の初期化が高速になり ます。 このファイルを使用する際に以下のようなエラー•メッセージが表示されることがあります。 Error: acc__handle_by_name: Object memory_spec not found この場合は、デナリのタスクが 1 つ以上の領域で使用されており、タスクをモジュールごと に有効にするか、または $DENALI/verilog/pli.tab 内でワイルドカード "*" を使用するこ とによって有効にする必要があります。 MMAV ユーザ • ガイド 11/6/08 116 Mentor Graphics ModelSim Modelsim 用の PLI アプリケーションの指定 PLI アプリケーションはシミュレータによってダイナミックにロードされるため、どのアプ リケーションをロードするかを指定する必要があります ( 各アプリケーションはダイナミッ クにロード可能なライブラリでなければなりません )。詳細については、 『ModelSim User's Manual』の「Compiling and linking PLI/VPI C applications」を参照してください。 注意: pliapp2 リファレンスと pliappn リファレンスはデナリの PLI アプリケーションではあ りませんが、複数の PLI オブジェクトとデナリの PLI のリンク方法を説明するために 例を示してあります。 ModelSim 用の PLI アプリケーションを指定するには、次の 3 つの方法があります。ModelSim 用のデナリ PLI 共有オブジェクト • ファイルは、Unix/Linux の場合は mtipli.so です。この ような共有ライブラリの使用方法は、次のように指定します。 1. modelsim.ini ファイル内の Veriuser エントリのリストとして Unix: Veriuser = $DENALI/mtipli.so pliapp2.so pliappn.so 2. PLIOBJS 環境変数のリストとして Unix: setenv PLIOBJS "$DENALI/mtipli.so pliapp2.so pliappn.so" \ 3. シミュレータの -pli 引数として ( 複数の引数を使用可能 ) Unix: % vsim -pli $DENALI/mtipli.so -pli pliapp2.so -pli pliappn.so PLI アプリケーションの複数の指定方法を同時に使用することができます。システム • ライブ ラリは上記の順序でロードされます。どの場合も、ライブラリへのパス内で環境変数の参照 を使用することができます。 ModelSim のタイムスケール ModelSim でシミュレーションを実行するとき、デナリのタイムスタンプが正しく記録される ように、ModelSim シミュレータではデザイン • モジュールの最小時間精度が使用されます。 つまり、 "-t" タイムスケール • コマンド • ライン • オプションを使用して時間精度を指定する必 要はありません。 "-t" タイムスケール • オプションを使用すると、タイミング • チェックに使用 されるタイムスタンプが間違っているというタイミング • エラー• メッセージが誤って表示さ れます。 Aldec Rivera-PRO および Active-HDL デナリ • モデルは、Verilog モジュールとしてインスタンス化することができます。このモデル は、denali.so 共有オブジェクト • ライブラリ (Solaris、Linux) を介して Riviera-PRO と通信 します。ライブラリは Riviera-PRO および Active-HDL と共に配布されます。 MMAV ユーザ • ガイド 11/6/08 117 Verilogデザインでデナリ • メモリ• モデルをインスタンス化するには、次の手順を実行します。 • $DENALI 環境変数をデナリ • インストール • ディレクトリに設定します。この変数は、シ ミュレータ (Riviera-PRO または Active-HDL) を実行する前に設定する必要があります。 • denali.so 共有オブジェクト • ライブラリ (Solaris、Linux) を、シミュレータに表示される PLI アプリケーションのリストに追加します。 • メモリ • モデルを制御するためのデナリ Verilog プロシージャおよびタスクは、denali.so 共 有オブジェクト • ライブラリ (Solaris、Linux) にあります。Verilog コードでこれらのタスク および関数を使用する場合、これらのタスクと関数が適切な引数を受け取っていること を確認します。 致命的なエラー ( モデル • コンフィギュレーションを持つファイルが見つからない場合など ) が検出されるとデナリ • メモリ • モデルは終了し、シミュレーションが停止し、シミュレータ が終了する場合があります。コマンド • ライン • モードでシミュレーションを実行すると、エ ラーの原因を示すメッセージが OS コンソール • ウィンドウに表示されます。Riviera-PRO GUI または Active-HDL を使用すると、GUI が閉じます。エラーの原因を確認するには、現在の ディレクトリに作成される denali.error ファイルを参照してください。 6.1.3 コールバックの処理 MMAV Verilog コールバック • インターフェイスには、 モデル • コールバック初期化およびハン ドリングの機能があります。 コールバック • インターフェイス denaliMemCallback モジュールには、モデル内でイベントが発生すると、モデルによって 変更される整数変数が含まれています。この変数が変更されると、テストベンチ内でプロシー ジャ • ブロックがトリガされ、コールバック • イベントが処理されます。 コールバック初期化 デナリ MMAV Verilog コールバックを使用するには、他の Verilog ファイルと共に $DENALI/ ddvapi/verilog/ddvapi.v ファイルをコンパイルする必要があります。このファイルに含 まれているタスクによって、 コールバック • ルーチンを実装するための必須タスクが提供され ます。 コールバックは、MMAV アサーションがトリガされると生成されます。MMAV アサーショ ンを設定する場合、"callback" <action> タイプを使用する必要があります。コールバック • ア サーションの設定方法については、82 ページの「メモリ • トランザクションのアサーションの 設定」を参照してください。 モデル•イベント(またはモデル• イベントのセット)に対するコールバックをセットアップす るには、 モデル • インスタンスのコールバックに付加される denaliMemCallback モジュール をインスタンスします。 各モデル • インスタンスに対応する別のコールバック • インスタンス が存在するため、各モデル • インスタンスのコールバックは、独立したプロシージャ • ブロッ クによって処理されます。 denaliMemCallback モジュールがインスタンス化されると、モデル • インスタンス ID を持 つ setCallback() を呼び出して、有効なイベントを denaliMemCallback.Event 変数に付 加することによって、モデル • コールバックがセットアップされます。 MMAV ユーザ • ガイド 11/6/08 118 例 ( リードまたはライトの発生によるインスタンス testbench.uut1 でのコールバックの セットアップ ): denaliMemCallback cb (); denaliMemTrans trans (); integer id0, asrt0, i; initial begin id0 = $mminstanceid ("testbench.uut1"); asrt0 = $mmassert_access (id0, "ReadorWrite", "callback", 0, 'h7FFFFFFF); // Enable All the Callback Types for (i = 0; i < DENALI_CB_TOTAL; i = i + 1) cb.enableReason [i] = i; cb.setCallback (id0); #1000000000; $finish; end コールバック • ハンドリング モデルからのコールバックの処理は、denaliMemCallback インスタンス内のイベント変数 によってトリガされた always ブロックで実行されます。シミュレーションの任意の時点で、 モデル内のさまざまな場所で同時に複数のコールバック • イベントが発生している場合があ ります。コールバック • モデルは、モデル内でトリガされたイベントのリストを処理し、後続 の getCallback() 呼び出しごとにコールバック • モジュールのレジスタ変数を指定します。 この関数によって、追加イベントが存在する間は 1 が返され、最後のイベントが処理される と 0 が返されます。 MMAV ユーザ • ガイド 11/6/08 119 getCallback() 関数の呼び出しごとに、 reason およびトランザクション ID (transId) 変数が 次に使用可能なコールバック • イベントと共にロードされます。次に、transId が、 denaliMemCallback transGet() タスクに渡され、イベントに関連付けられている実際の パケットを検索します。 always @(cb.Event) begin while (cb.getCallback(id0)) begin trans.transGet (cb.transId); $display $display $display $display $display $display $display $display ( ( ( ( ( ( ( ( "time "reason "assertion "reason "address "width "data "mask : : : : : : : : %0t" %0s" %0h" %0h" %0h" %0h" %0h" %0h" , , , , , , , , $time cb.reasonStr (cb.reason) trans.assertion trans.reason trans.address trans.width trans.data trans.mask ); ); ); ); ); ); ); ); $display; end $display; end denaliMemCallback レジスタ enableReason enableReason は、 有効にするすべてのコールバック•イベントを指定するための32ビット値 の配列です。これらの値は、setCallback() タスクの呼び出しの前にユーザがロードする 必要があります。setCallback() は、ロケーション enableReason[0] から始まるこの配 列全体をステップ • スルーし、 最初の未初期化領域まで指定された各コールバック • イベント を有効にします。最初の未初期化領域より上の enableReason[ ] 値はすべて無視されます。 この配列にロードされた値は、DENALI_CB_* などの ddvapi.vh の DENALIDDVCBpointT セ クションで定義された使用可能なコールバック • イベントのセットから取得する必要があり ます。 Event Event は、モデル • コールバック関数に付加される整数変数です。有効な内部イベントがモデ ルで発生すると、Event 変数が変更されます。この変数の値が変更されると、テストベンチ内 のプロシージャ • ブロックがトリガされ、現在のコールバック • イベントが処理されます。 MMAV ユーザ • ガイド 11/6/08 120 reason reason は、 現在のコールバック • イベントを識別する整数値変数で、getCallback() 関数に よってロードされます。 同じシミュレーション時刻に複数のコールバック • イベントが発生す ると、reason が更新され、後続の getCallback() 呼び出しごとに次に使用可能なイベント が識別されます。 transId transId は、 現在のコールバック•イベントに関連付けられているトランザクションを識別する 整数値変数で、getCallback() 関数によってロードされます。同じシミュレーション時刻に 複数のコールバック • イベントが発生すると、transId が更新され、後続の getCallback() 呼び出しごとに次に使用可能なイベントのトランザクションが識別されます。 denaliMemCallback タスクおよび関数 setCallback() モデル • インスタンス内でコールバックをセットアップし、 選択されたコールバック • イベン トを denaliMemCallback モジュールの Event 変数に付加します。setCallback() を呼び 出す前に、有効にするコールバック • イベントが enableReason 配列内で初期化されている 必要があります。 task setCallback; input [31:0] instId; instId は、 デナリ • インスタンス ID ( ハンドル ) であり、 特定の MMAV インスタンスを識別し ます。 getCallback() 現在のシミュレーション時刻にモデルからのコールバック • イベント全体をステップ • スルー します。reason および transId 変数を設定し、後続の getCallback() 呼び出しごとに次に 使用可能なイベントを識別します。イベントが検出されると、戻り値は 1'b1 となります。ま たは、イベントがすべて処理され、使用可能なイベントが存在しない場合は、1'b0 となります。 function getCallback; input [31:0] instId; instId は、 デナリ • インスタンス ID ( ハンドル ) であり、 特定の MMAV インスタンスを識別し ます。 clearCallback() デナリ • インスタンス ID が指定されたコールバックをクリアします。 function clearCallback; input [31:0] instId; MMAV ユーザ • ガイド 11/6/08 121 instId は、 デナリ • インスタンス ID ( ハンドル ) であり、 特定の MMAV インスタンスを識別し ます。 reasonStr() コールバック理由を ASCII 文字列として返します。 function [30*8:1] reasonStr; input [31:0] reason; case (reason) DENALI_CB_None DENALI_CB_Read DENALI_CB_Write DENALI_CB_ReadOrWrite DENALI_CB_ReadNoWrite DENALI_CB_ReadRead DENALI_CB_WriteWrite default endcase endfunction : : : : : : : reasonStr reasonStr reasonStr reasonStr reasonStr reasonStr reasonStr = = = = = = = "None"; "Read"; "Write"; "ReadOrWrite"; "ReadNoWrite"; "ReadRead"; "WriteWrite"; : reasonStr = "INVALID"; reason は、 $DENALI/ddvapi/verilog/ddvapi.vh で定義される DENALIDDVCBpointT 値の 1 つです。例: $display ( "access : %0s" , cb.reasonStr (cb.reason)); これは、上記リストの reason 文字列の 1 つを表示します。 MMAV ユーザ • ガイド 11/6/08 122 6.2 VHDL インターフェイス このセクションでは、VHDL テストベンチから MMAV を使用する方法について説明します。 6.2.1 MMAV と VHDL の概要 MMAV では、各シミュレータ固有の C インターフェイスを使用して VHDL を直接統合でき ます。PureView を使用する場合、VHDL ラッパーには各シミュレータ固有の情報があるため、 使用するシミュレータを選択して、 メモリ • モデル • インスタンスのラッパーを生成する必要 があります。詳細については、10 ページの「PureView グラフィカル • ツールの使用」を参照 してください。 注意: 現在、デナリでは、言語ごとに専用のラッパーをサポートしています。たとえば、 ミックスド • モードのシミュレーションでは、Verilog ラッパーを使用している場合は、 Verilog テストベンチでしかインスタンスを生成できません。VHDL ラッパーを使用し ている場合は、VHDL テストベンチでしかインスタンスを生成できません。 6.2.2 MMAV と VHDL のシミュレーション Synopsys VCS VHDL 内からデナリ呼び出しにアクセスするには、次の手順を実行する必要があります。 1. $DENALI/vhpi/memory_modeler.vhd ファイルをコンパイルします。 2. 以下をエンティティのトップ • レベルに含めます。 use work.Memory_Modeler.all; Mentor Graphics ModelSim Mentor Graphics ModelSim を使用して MMAV および VHDL のシミュレーションを実行するに は、次のように入力します。 #!/bin/csh -fx rm -rf work vlib work vcom $DENALI/mti/memory_modeler.vhd vcom *.vhd vsim -c testbench -do 'run -all' MMAV ユーザ • ガイド 11/6/08 123 Cadence NC-VHDL (Leapfrog) Cadence NC-VHDL を使用して MMAV および VHDL のシミュレーションを実行するには、次 のように入力します。 /bin/rm -rf WORK mkdir WORK ncvhdl -v93 -m -work WORK $DENALI/leapfrog/memory_modeler.vhd ncvhdl -v93 -m -work WORK *.vhd ncelab -messages -update WORK.TESTBENCH:BEHAVIOR ncsim -messages -input -logfile simulation.log -LOADFMI $DENALI/ libdenfmi:den_FMIPtr WORK.TESTBENCH:BEHAVIOR Aldec Rivera-PRO および Active-HDL デナリ • モデルは、VHDL モジュールとしてインスタンス化することができます。 注意: バージョン 2007.06 までの Riviera-PRO の前バージョンおよびバージョン 7.3 までの Active-HDL の前バージョンでサポートされていたのは、Verilog インスタンス生成の みでした。 モデルは、denali.so 共有オブジェクト • ライブラリを介して Riviera-PRO と通信します (Solaris、Linux)。ライブラリは Riviera-PRO および Active-HDL と共に配布されます。 VHDL デザインでデナリ • メモリ • モデルをインスタンス化するには、次の手順を実行します。 • $DENALI 環境をデナリ • インストール • ディレクトリに設定します。この変数は、シミュ レータ (Riviera-PRO または Active-HDL) を実行する前に設定する必要があります。 10 ページの「PureView • PureView で生成された VHDL ラッパー• ファイル ( 詳細については、 グラフィカル • ツールの使用」を参照 ) で、形式が異なるアーキテクチャの属性を次の形 式となるように編集します。 attribute foreign of <architecture> : architecture is "VHPI \ denali;initDenali" MMAV ユーザ • ガイド 11/6/08 124 現在、PureView では、[Options] > [Simulation Environment] > [VHDL] を選択しても、 リストに表示される他のシミュレー Riviera-PRO または Active-HDL はリストされません。 タのラッパー • ファイルを生成して、形式の異なる属性が上記の仕様と一致するように編 集することは可能です。 次の例は、PureView を使用して生成した後、Aldec の要件に一致するように編集したサン プル • モデルです (regfile001.vhdl ファイル )。 -- Entity: regfile001 -- SOMA file: /home/joe/mems/regfile001.soma -- Initial contents file: -- Simulation control flags: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; ENTITY regfile001 IS GENERIC ( memory_spec: string := "regfile001.soma"; init_file: string := "init.txt"; sim_control: string := "" ); PORT ( addressWR : in STD_LOGIC_VECTOR(14 downto 0); dataIn : in STD_LOGIC_VECTOR(7 downto 0); we : in STD_LOGIC; clk : in STD_LOGIC; addressRD : in STD_LOGIC_VECTOR(14 downto 0); dataOut : out STD_LOGIC_VECTOR(7 downto 0); cs : in STD_LOGIC ); END regfile001; ARCHITECTURE behavior of regfile001 is attribute foreign: string; attribute foreign of behavior: architecture is "VHPI denali; initDenali"; BEGIN END behavior; • メモリ • モデルを制御するためのデナリ VHDL プロシージャと関数は、 memory_modeler.vhd パッケージ内にあります。VHDL コードで 3 つの関数を使用する場合、Memory_Modeler パッケージをコンパイルし、適切な library ステートメントと use ステートメントを追加 します。パッケージのソース • コードを入手するには、Riviera-PRO または Active-HDL イ ンストール • ディレクトリにある memory_modeler.vhd ファイルにアクセスします。 注意: このインターフェイスについては、Aldec 社にお問い合わせください。 MMAV ユーザ • ガイド 11/6/08 125 6.3 SystemC インターフェイス MMAV では、SystemC を直接統合できます。PureView を使用することで、メモリ • モデル • イ ンスタンスの SystemC ラッパーを生成できます。デナリの SystemC 統合では、Yukon C イン ターフェイスを使用してシミュレーション • パフォーマンスを大幅に向上させます。 6.3.1 MMAV と SystemC の概要 SystemC は、主にシステム • レベルの設計に使用される C++ シミュレーション環境です。 SystemC は、C++ クラス • ライブラリと、動作レベルおよびレジスタ転送レベルのシミュレー ション•カーネルで構成されるモデリング•プラットフォームです。 SystemC自体の詳細につい ては、http://www.systemc.org を参照してください。 SystemC 環境と MMAV の統合は、次の内容で構成されます。 • MMAV モデル用 SystemC ラッパー • デナリ • ライブラリ • ラッパーとデナリ Yukon ライブラリ間のインターフェイスに使用されるインテグレー ション • ファイル MMAV モデル用 SystemC ラッパーは、PureView インターフェイスを使用して生成できます。 [Options] > [Simulation Environment] > [SystemC] を選択します。ラッパーが生成されると、 SystemC テストベンチでトップ • レベルの sc_module のインスタンスを生成できます。 6.3.2 MMAV と SystemC のシミュレーション メモリ • モデルの DDR クラスを使用した例については、 $DENALI/yukon/example ディレクトリ を参照してください。このディレクトリには、サンプルのテストベンチと、MMAV と SystemC をリンクするための Makefile もあります。 $DENALI リリースの yukon ディレクトリには、関連するデナリ • ライブラリ (libyukon.o および libyukon.so) があります。 このディレクトリのREADMEファイルの説明に従って例をコンパイルおよび実行することを お勧めします。これによって、使用する環境が適切に設定され、適切なデナリ • ライセンスが 機能します。 GNU C++ コンパイラはバージョン 2.95 以降を使用する必要があります。 SystemC の例は、バージョン 2.95.2 を使用して検証済みです。 この例を正常に実行したら、この例をコピーし、使用する環境と目的に合わせて変更します。 この例には、次の 3 つの C++ ファイルがあります。 • main.cc このファイルはテストベンチの例です。このファイルは実際のテストベンチと置き換え られます。この例に示すように、保留になっているトランザクションを正常にダンプす るために、シミュレーションの終了時に DENALIterminate を呼び出すことが重要です。 • simulator.cc このファイルは、Yukon インターフェイスを介してデナリと SystemC のインターフェイ スの役目をするファイルです。 MMAV ユーザ • ガイド 11/6/08 126 • ddr.cc このファイルは、PureView を使用して生成されたモデル用のデナリ • ラッパーです。 MMAV ユーザ • ガイド 11/6/08 127 6.4 Specman インターフェイス このセクションでは、Specman 環境で MMAV を使用する方法について説明します。 このマニュアルで説明するコールバック • メソッドを使用するには、Specman 3.3.1 以降を使用 して MMAV バージョン 3.2 が実行されている必要があります。 Specman によってデナリ MMAV を使用する方法の詳細については、 『Specman Elite Denali MMAV Interface Guide』の第 14 章の「Usage and Concepts Guide for Specman 」を参照してくだ さい。これらのマニュアルは、Cadence Specman リリースの docs ディレクトリにあります。 6.4.1 MMAV と Specman の概要 ユーザは、 デナリ • メモリ • モデルにアクセスしたり、デナリ • メモリ • モデルからアクティビ ティを取得したりできます。 Specman Elite/ Denali Interface (SNDI) には、以下を使用して、e テストベンチからデナリ • メモ リと通信する方法が 2 つあります。 • e に移植されたデータ • ドリブン検証 (DDV) 手法 • コールバック メモリには、デナリ DDV API 関数を使用してアクセスできます。 Specman からデナリ • メモリ • モデルにアクセスするには、最初に通常どおり PureView を使用 して HDL シェルを作成し、テストベンチまたは DUT でこのシェルのインスタンスを生成し ます。詳細については、10 ページの「PureView グラフィカル • ツールの使用」を参照してく ださい。 SNDI インターフェイス用にあらかじめ定義されたユーザによるアクセス可能な e 構造体が 2 sn_denali の 1 つのグローバル • インス つあります (sn_denali および sn_denali_unit)。 タンスには、 グローバル • ベースでメモリ • モデルと対話するために 4 つのメソッドが関連付 けられています。2 番目の構造の sn_denali_unit は、組み込みリード / ライト • メソッドに アクセスできるようにするために継承する必要がある抽象ユニット • タイプです。 これを実行 するには、Spec-man Elite SN_DENALI_MEMORY_UNIT テンプレート • マクロを使用します。こ のマクロを使用するには、幅を指定する必要があります。以下はその例です。 <' SN_DENALI_MEMORY_UNIT demo_denali64 using width = 64;// model width must // be defined extend sys { mem1: demo_denali64 is instance; keep mem1.hdl_path() == "/top/mem1"; }; '> SNDI は、sn_denali_unit の最初のインスタンスが生成されると、自動的に初期化されま す。この初期化時に、デナリ共有ライブラリがロードされ、デナリ • シミュレータが初期化さ SN_DENALI_MEMORY_UNIT インスタンスが API の対応するインスタンスに結合されます。 れ、 MMAV ユーザ • ガイド 11/6/08 128 次の図は、Specman、デナリ、および検証環境の関係を示しています。 図 6-1: 検証環境 6.4.2 MMAV と Specman のシミュレーション Mentor Graphics ModelSim Mentor Graphics ModelSim を使用して MMAV および Specman のシミュレーションを実行する には、次の手順を実行します。 1. 環境変数を設定します。 SPECMAN_AUTO_PRE_COMMANDS=false; export SPECMAN_AUTO_PRE_COMMANDS SN_AUTO_PRE_COMMANDS=false; export SN_AUTO_PRE_COMMANDS 2. デナリを含む共有ライブラリ libqvlsn_basic.so を作成します。 sn_compile.sh -sim qvl -l "$DENALI/mtipli.so" 3. 作成した共有ライブラリを使用します。 SPECMAN_LIBQVL=`pwd`/libqvlsn_basic.so; export SPECMAN_LIBQVL 4. コンパイル前にクリーン • アップします。 rm -rf verilog/specman.v work vlib work 5. Verilog スタブ • ファイルを作成します。 specman -commands "define VERILOG_ENV; load e_code/mem_top.e; write stubs -verilog verilog/specman.v;" 6. verilog をコンパイルします。 vlog verilog/tb.v verilog/essram.v verilog/specman.v +incdir+verilog 7. 次のコマンドで Specview と ModelSim GUI が起動したら、次の手順を実行します。 − シミュレータ GUI プロンプトで sn を入力した後、RETURN キーを押します。 MMAV ユーザ • ガイド 11/6/08 129 − Specman GUI で、テストケース ($DENALI/example/specman/e_code/mem_tc1.e or e_code/mem_tc2.e) をロードします。 − − − Specman GUI で [Test] をクリックします。 RETURN キーを押して、シミュレータ GUI に移動します。 ModelSim GUI で run -all を入力し、シミュレーションを実行します。 specview -p "define VERILOG_ENV;\ set wave -mode=interactive mti; load e_code/mem_mti_wave; \ load e_code/mem_top;" \ vsim -keepstdout tb specman specman_wave & Synopsys VCS Synopsys VCS 使用して MMAV および Specman のシミュレーションを実行するには、次の手 順を実行します。 1. スタブ • ファイル specman.v を作成します。 specman -commands "define VERILOG_ENV; load e_code/mem_top.e; write stubs -verilog verilog/specman.v;" 2. デナリを含むシミュレータ -Specman リンク実行ファイルをコンパイルします。 sn_compile.sh -vcs_flags -vcs_flags -vcs_flags -vcs_flags -sim vcs \ "+incdir+verilog" \ "-I verilog/tb.v verilog/essram.v verilog/specman.v" \ "-P $DENALI/verilog/pli.tab" \ "-LDFLAGS $DENALI/verilog/denverlib.o" 3. 次のコマンドで Specview および VCS GUI が起動したら、次の手順を実行します。 − シミュレータ GUI プロンプトで $sn を入力した後、RETURN キーを押します。 − Specman GUI で、テストケース (e_code/mem_tc1.e or e_code/mem_tc2.e) をロード します。$DENALI/example/specman を参照してください。 − Specman GUI で [Test] をクリックします。 − RETURN キーを押して、シミュレータ GUI に移動します。 − 波形ビューアに HDL 信号を追加します。 − vcs GUI プロンプトで「.」を入力し、シミュレーションを実行します。 specview -p "define VERILOG_ENV; load e_code/mem_top.e;" vcs \ -Mupdate -o ./vcs_specman -RIG verilog/tb.v verilog/essram.v \ verilog/specman.v & MMAV ユーザ • ガイド 11/6/08 130 6.4.3 コンフィギュレーション • レジスタおよびメモリへのアクセス MMAV インターフェイスとの Specman の統合によって、メモリをリード / ライトできるよう になります。 SNDI メソッド Specman Elite/ デナリ • インターフェイス • メソッドは、DDVAPI を介して sn_denali タイプお よび sn_denali_unit タイプに移植されている MMAV の関数です。この統合によって、 Specman 環境のままデナリ • データ • ドリブン検証インターフェイスへのアクセスが可能にな ります。ただし、すべての MMAV 関数が Specman に統合されているわけではありません。e コード内で使用できるのは Specman デナリのあらかじめ定義されたメソッドのみです。 また、e は unknown 値を理解しないため、SNDI インターフェイスでは、unknown 値をリード し、 デナリ • メモリ • モデルにライトするためのメソッドが開発されています。read_unk() や write_unk() がその例です。 sn_denali メソッドと sn_denali_unit メソッドの詳細については、 Specmanインストール • ディレクトリの using_sn_denali_interface.pdf を参照してください。 6.4.4 sn_denali_unit を拡張してすべての MMAV 関数をメソッドとし て含める MMAV のすべての関数が sn_denali_unit のメソッドに移植されているわけではありませ ん。これらのメソッドを含めるために sn_denali_unit を簡単に拡張できます。これを示す 単純なコードは次のとおりです。 MMAV ユーザ • ガイド 11/6/08 131 // Sample Code Snippet for extending sn_denali_unit <' define SN_DENALI_ADDR_SIZE 32; //Define the Max Addr Size in Bits define SN_DENALI_DATA_SIZE 512; // Define the Max Data Size in Bits define SN_DENALI_SMALL_STRING_SIZE 96; // Define the Max String Size in // Bits define SN_DENALI_STRING_SIZE 2048;// Define the Max String Size in Bits extend sn_denali_add_on { instance : string; mem_id : uint; !verilog_instance : list of byte; str_e2v(e_string : string): list of byte is { var packed_str: list of byte; packed_str = pack(packing.network, e_string); result = packed_str[1..]; // skip the first 0 byte }; // End Method str_e2v }; // End Struct sn_denali_add_on extend sn_denali_unit { run() is also { add_on.instance = me.full_hdl_path(); add_on.verilog_instance = add_on.str_e2v(add_on.instance); add_on.mem_id = me.get_id(); }; verilog function '~/$mmassert_uma' ( action : SN_DENALI_SMALL_STRING_SIZE ) : 1; assert_uma ( action : string ) @sys.any is { var packed_val : list of byte; var status : uint (bits:1); packed_val = add_on.str_e2v(action); status = '~/$mmassert_uma'(packed_val) ; check that (status == 0) else dut_error(appendf("%12d ns (%s) ERROR: Denali method call to assert_uma(%s) failed RC=%d", sys.time,add_on.instance,packed_val,status)); }; '> MMAV ユーザ • ガイド 11/6/08 132 この e ファイルによって MMAV のすべての関数が sn_denali_unit にメソッドとして拡張 されるわけではありませんが、代表的な関数は拡張されます。MMAV 関数が追加されたこと で、メモリ • サブシステム用のテスト環境を構築できます。 ここで定義されているメソッドは、$DENALI/example/sndi_example/sn33_denali.e に あります。 6.4.5 波形でのメモリ • トランザクションの表示 Specman Elite を使用することで、波形ウィンドウで信号を表示できるだけでなく、メモリの イベントまたはトランザクションも表示できます。次の図は、memory_0 のアクションが波 形ウィンドウに表示された様子を示しています。 図 6-2: 波形ウィンドウに表示されたイベントの波形 6.4.6 テストケースの例 $DENALI/example/specmanディレクトリからコールバックが含まれている基本的なサンプ ルにアクセスできます。この例には、SRAM、SDRAM、SMROM、および ESSRAM の例が含 まれています。 また、$DENALI/examples/specman には SNDI の詳細な例があります。このテストケース では、SNDI からのコールバックと共に、デナリからのシステム • メモリを使用します。 MMAV ユーザ • ガイド 11/6/08 133 6.5 Vera インターフェイス このセクションでは、Vera テストベンチから MMAV を使用する方法について説明します。 Vera でデナリ MMAV を使用する方法の詳細については、$VERA_HOME/lib/denali/ README_DDVAPI を参照してください。 6.5.1 MMAV と Vera の概要 デナリのデータ • ドリブン検証 (DDV) 手法は Vera に移植されています。MMAV-Vera 関数およ びタスクについては、$VERA_HOME/lib/denali/denali_ddv.vrh を参照してください。 MMAV で使用可能な関数の一部は、MMAV-Vera インターフェイスに統合されません。この ようなデナリ関数は、 デナリTCLインタープリタから呼び出してアクセスします。 Vera DirectC 関数 DenaliDDVTclEval() を使用して、デナリ TCL インタープリタから TCL ルーチンを実 行できます。この TCL ルーチンによって、デナリ関数のいずれかが呼び出されるか、いずれ かの TCL スクリプトが実行されます。 次の例は、この呼び出しによって実行される TCL スクリプトを示しています。 // Tcl call from within Vera Testbench integer iErr; iErr = DenaliDDVTclEval ("source MyDenaliTclFile.tcl"); // Tcl Routine -- MyDenaliTclFile.tcl mmsaverange /tb/mem/sdram0 save.dat 0 31 mmcomp /tb/mem/sdram0 golden.dat この例では、 メモリ • インスタンス /tb/ mem/sdram0 のアドレス 0 ~ 31 の内容が save.dat ファイルに保存され、メモリ /tb/mem/ sdram0 全体の内容がゴールデン • ファイル golden.dat と比較されます。 MMAV ユーザ • ガイド 11/6/08 134 アーキテクチャ 次の図は、MMAV-Vera インターフェイス • アーキテクチャを示しています。 図 6-3: MMAV と Vera のアーキテクチャの概要 6.5.2 MMAV と Vera のシミュレーション シミュレータで MMAV および Vera を使用するには、最初にマニュアルの指示に従って適切 なライブラリをリンクします。 Vera 環境で MMAV を使用するための手順は次のとおりです。 1. Vera からデナリ • メモリ • モデルにアクセスするには、最初に PureView を使用して HDL シェルを作成し、テストベンチまたは DUT でこのシェルのインスタンスを生成します。 詳細については、 10ページの 「PureViewグラフィカル•ツールの使用」を参照してください。 2. Vera に移植された DDV 関数へのアクセスを取得するには、 ヘッダ • ファイルを Vera テス トベンチにインクルードする必要があります。 #include <denali_ddv.vrh> 注意: MMAV は、これまでの CAPI インターフェイスをサポートしていません。MMAV Vera インターフェイスでは、DDVAPI を使用します。DDVAPI 関数の詳細については、 $DENALI/doc/ddvapi.pdf を参照してください。 このマニュアルには、CAPI から DDVAPI への移行についての説明も記載されています。Vera のドキュメント『$VERA_HOME/ lib/denali/README_DDVAPI』には、CAPI から DDVAPI への変更内容について記載さ れています。 3. Vera テストベンチからデナリ • メモリを初期化します。詳細については、136 ページの 「Vera テストベンチからのデナリ • メモリ • モデルの初期化」を参照してください。 4. コールバックをセットアップします ( オプション )。詳細については、137 ページの「コー ルバックの処理」を参照してください。 MMAV ユーザ • ガイド 11/6/08 135 5. 必要に応じて、Vera テストベンチから他のデナリ関数を呼び出します ( オプション )。詳 細については、139 ページの「Vera テストベンチからの他のデナリ関数の使用」を参照し てください。 6. デナリ、Vera、およびシミュレータをリンクし、テストベンチを実行します。 Synopsys VCS Synopsys VCS 使用して MMAV および Vera のシミュレーションを実行するには、次のように 入力します。 #! /bin/sh -f vera -cmp display.vr make -f Makefile_vcs 注意: Makefile_vcs は、$DENALI/example/vera/denali_vera.tar.gz に用意されています。 $VERA_HOME/lib/denali/README_DDVAPI ファイルでも、別のプラットフォームの run スクリプトが用意されています。 6.5.3 Vera テストベンチからのデナリ • メモリ • モデルの初期化 任意の関数を使用してデナリ • メモリ • モデルにアクセスするには、最初に Vera 内からシミュ レータ API を初期化する必要があります。この手順は、 デナリ • メモリ • モデルが Vera と対話 するために実行される必要があり、メモリの事前ロード、バックドア • リード / ライトの発行、 メモリの内容のダンプなどの他のデナリ関数を発行する前に呼び出す必要があります。 メモリ • シミュレータ API の初期化は、シミュレーション時に 1 回だけ呼び出す必要がありま す。初期化を呼び出すには、Vera 内から DENALDDVIinitialize 関数を呼び出します。 DENALIDDVinitialize (string init, string reportFunc, var integer unknownsP, string elabDone, string clientName); 引数 init タイプ string reportFunc string unknownsP var integer 説明 これらの 2 つの引数は、エクスポートされた VERA タスクの 名前を付ける文字列が、デナリによるコールバックの初期化お よびアクセス時に登録されるように指定します。Null 文字列引 数は、コールバックを無効にします。 この変数は、シミュレータにアドレス内容データに unknown を保存する方法を通知します。オプションには 3 つの形式が あります。 • • • MMAV ユーザ • ガイド 11/6/08 unknownsNBit1- 不明ビットはデータのビットごとに保存 されます。 unknowns1Bit1 - 不明ビットはデータのアドレス内容ごと に保存されます。 unknowns0Bit0 - 不明ビットはデータのアドレス内容ごと に保存されます。 136 引数 elabDone タイプ string clientName string 説明 エクスポートされた VERA タスクの名前がシミュレーション の開始時にデナリによって呼び出されるように指定します。こ れは、クライアントがメモリの所有権を取得するというまれな 事例でのみ設定されます。一般的には、設定する必要はありま せん。Null 文字列引数は、このコールバックを無効にします。 クライアント名を指定します。 例: integer iErr; iErr = DenaliDDVinitialize( "DramInitCbk", "DramAccCbk1", iUnkMode,"", "DDVAPI Denali Vera Example"); この例では、成功の場合、iErr に 0 が返されます。 6.5.4 コールバックの処理 コールバック • タスクは、初期中または AccessSetCallback 関数の呼び出し後に宣言され ます。 Vera および MMAV インターフェイスには次の 3 種類のコールバックがあります。 • 初期化コールバック • アクセス • コールバック • 反復コールバック 詳細については、$VERA_HOME/lib/denali/README_DDVAPI を参照してください。 MMAV ユーザ • ガイド 11/6/08 137 次の例は、コールバックの例を示します。 integer iErr; iErr = DenaliDDVaccessSetCallback("regCbFunc"); export task regCbFunc(integer id, integer access, integer portNum) { bit [31:0] bData; bit [31:0] bMask; bit [63:0] address; integer iWidth, iErr; integer memId; iErr = DenaliDDVgetIdByName("testbench.i0", memId); if (id == memId) { iErr = DenaliDDVaccCbkGetDataAndMask( iWidth, bData, bMask, address); } } この例では、成功の場合、iErr に 0 が返されます。 すべてのコールバックを無効にしたり、 特定のメモリ • コールバックのみを無効にしたりでき ます。 すべてのコールバックを無効にするには、次のように入力します。 iErr = DenaliDDVTclEval("mmdisablecallbackall"); 特定のメモリのコールバックを無効にするには、次のように入力します。 iErr = DenaliDDVTclEval("mmdisablecallback -user <instance_id>"); すべてのコールバックまたは特定の 1 つのメモリ • インスタンスのみを無効にした場合、 それ ぞれのコールバックを有効にできます。 iErr = DenaliDDVTclEval("mmenablecallback -user <instance_id>"); MMAV ユーザ • ガイド 11/6/08 138 コールバックのブロックキング割り当て コールバック関数として設定された Vera エクスポート • タスクは、ブロックされずに返され ます。このようなブロックは、明示的には "@(posedge clock)" などによって、暗黙的には HDL 信号のリードまたはライトによって発生し、 信号に関連付けられたクロック • エッジをブロッ クキングします。 コールバック応答のブロッキング • コードを実行する必要がある場合、このコードは、コール バック • タスクから fork-join-none コンストラクトの個別のスレッドで作成可能です。ただし、 メインのコールバック • スレッドは、ブロックキングされずに返されます。 コールバック • コードは、ブロックが実行されるように記述できます。このような場合、最初 のコールバックがアクティブである間に 2 番目のコールバックが発生する場合があります。 Vera では、この状態を検知して、2 番目のコールバックを破棄します。 Vera では、コールバック • ブロック • エラーを 2 回検出します。最初のエラーは、コールバッ クが「非同期的に」返されなかった場合 ( ブロック未実行 ) で、この場合、最初のコールバッ クがアクティブであっても 2 番目のコールバックが発生します。両方の場合とも、エラーの DENALIerror_NoError の代わりに DENALIerror_Unknown が 発生が Vera によって示され、 デナリに返されます。 ただし、Vera DirectC 関数呼び出し DenaliDDVwarnDiscardedCbk(1) が実行された場合、 エラー • メッセージまたは警告メッセージがいずれの場合も出力されます。 6.5.5 Vera テストベンチからの他のデナリ関数の使用 必要に応じて、Vera テストベンチから他のデナリ関数を使用できます。これはオプションです。 次の例を参照してください。この例では、DenaliDDVgetIdByName によって特定のインス タンス名に対応するインスタンス ID が返され、DenaliDDVload によってファイル file.dat のデータを持つメモリ•インスタンスがロードされます。また、 この例は、DenaliDDVTclEval を使用した mmsomaset の使用方法も示しています。 integer id; integer iErr; integer unk = 0; string string string string inst = file = init = access iErr iErr iErr iErr DenaliDDVinitialize("", "", unk, "", "API"); DenaliDDVgetIdByName(inst, id); DenaliDDVload(id, file); DenaliDDVTclEval("mmsomaset testbench.i0 tds 0.4 ns"); = = = = "testbench.i0"; "file.dat"; ""; = ""; この例では、成功の場合、iErr によって 0 が返されます。 MMAV ユーザ • ガイド 11/6/08 139 6.5.6 テストケースの例 テストケースは、$DENALI/example/vera/denali_vera.tar.gz からダウンロードでき ます。 テストケースの例では、デナリ -Vera インターフェイスの多くの共通の機能を示すために、 DRAM を使用します。 図 6-4: デナリ -Vera の例の図 MMAV ユーザ • ガイド 11/6/08 140 6.6 6.6.1 NTB インターフェイス MMAV と NTB の概要 MMAV は、NTB テストケースをサポートするネイティブ • クラスベースのオブジェクト指向 インターフェイスを備えています。このインターフェイスは、NTB クラスと、メモリへのア クセスを追跡し、バックドア • リード / ライトを実行するためのメソッドで構成されます。ま た、このような NTB クラスを使用して、(PLI ベース ) Verilog プロシージャ • インターフェイ スで使用可能なその他の操作を実行することもできます。 6.6.2 MMAV と NTB のシミュレーション このセクションでは、Synopsys VCS シミュレータを使用した MMAV と NTB のシミュレー ションについて説明します。 Synopsys VCS Synopsys VCS 使用して MMAV および NTB のシミュレーションを実行するには、次の手順を 実行します。 1. Verilog および Vera ソース / テストベンチ • ファイルと共に denaliMem.vr ファイルと denaliMemVrIf.c ファイルをコンパイルします。 2. デナリ Verilog ライブラリ (denverlib.o) にリンクします。 vcs \ -ntb +vc+allhdrs \ -M -P $DENALI/verilog/pli.tab \ -CFLAGS "-DDENALI_USE_NTB=1 -I/usr/local/include -I${DENALI} I${DENALI}/ddvapi -c " \ -LDFLAGS "-rdynamic $DENALI/verilog/denverlib.o" \ $DENALI/ddvapi/vera/denaliMemVrIf.c \ -ntb_define DENALI_USE_NTB=1 $DENALI/ddvapi/vera/denaliMem.vr \ +incdir+$DENALI/ddvapi/verilog \ *.vr *.v; 注意: この例で使用される '-rdynamic' フラグは、Linux 専用です。 6.6.3 インスタンスとトランザクション • クラス NTB メモリ • アクセス機能によって、メモリ • リファレンスを追跡して、リード / ライト動作 を実行できます。 メイン • クラスは次のとおりです。 • 142 ページの「クラス denaliMemInstance」 • 153 ページの「クラス denaliMemInstanceList」 MMAV ユーザ • ガイド 11/6/08 141 • 154 ページの「クラス denaliMemTransaction」 これらのクラスの各フィールドでは、フィールド値の取得に必要な get<field_name> アクセ ス • メソッドがフィールドに関連付けられています。また、すべてのライト可能なフィールド には、フィールド値の設定に必要な set<field_name> があります。このようなフィールドはパ ブリックであるため、これらのフィールドに直接アクセスすることができます。 ステータス • コードを返すメソッドはすべて、失敗の場合は "-1" を、成功の場合は "0" を返し ます。別途指定されていない限り、デフォルトのコンストラクタのみを使用できます。 set<field_name> メソッドと get<field_name> メソッドの指定フィールド名の最初の文字は大文 字です。したがって、Address の値を取得する場合、メソッドは getAddress となります。 クラス denaliMemInstance NTB 環境で MMAV を使用してメモリにアクセスするには、denaliMemInstance のインス タンスを生成します。denaliMemInstance は、テストベンチでインスタンス生成されたか、 コンフィギュレーション空間などのデナリ • モデルによって作成されたメモリ • インスタンス に対応します。 次のセクションでは、denaliMemInstance クラスについて説明します。 コンストラクタ task new(string instName, string cbTaskName = "") 引数 名前 instName タイプ string 説明 cbTaskName string コールバック • タスク名。 インスタンス名。 説明 新しいインスタンス • オブジェクトを作成します。 instName は完全なパス名である必要があり、 コンストラクタに対して cbTaskName を null に できます。ただし、明示的な DPI コールバック • タスクを定義する場合、コールバック • ポイ ントをモニタ用に追加する前に設定する必要があります。 注意: cbTaskName フィールドの使用は、お勧めしません。 戻り値 このタスクは、新しく作成されたオブジェクトを返します。 MMAV ユーザ • ガイド 11/6/08 142 例 denaliMemInstance inst; inst = new("ddr0"); メソッド 名前 getId() 説明 getInstName() インスタンス名を取得します。 setCbTaskName() DPI コールバック • タスク名を設定します。 getCbTaskName() DPI コールバック • タスク名を取得します。 setCallback() メモリへのアクセス時のコールバックを設定します。 write() メモリ内容をライトします。 read() メモリ内容を返します。 tclEval() 埋め込み Tcl インタープリタを使用して Tcl コマンドを実行します。 ReadCbT() このタスクは、リード・コールバックが発生すると呼び出されます。 WriteCbT() このタスクは、ライト・コールバックが発生すると呼び出されます。 DefaultCbT() このタスクは、有効なコールバックが発生すると呼び出されます。 LoadCbT() このタスクは、ロード・コールバックが発生すると呼び出されます。 LoadDoneCbT() このタスクは、ロード完了コールバックが発生すると呼び出されます。 ResetCbT() このタスクは、リセット・コールバックが発生すると呼び出されます。 CompCbT() このタスクは、比較コールバックが発生すると呼び出されます。 CompDoneCbT() このタスクは、比較完了コールバックが発生すると呼び出されます。 ReadEiCbT() このタスクは、現在のメモリ • リード動作にエラーが挿入されると呼び出されます。 ID を取得します。 getId() デナリ • メモリへのアクセスに使用される ID を取得します。 構文 virtual function integer getId() 引数 なし 戻り値 この関数は、ID を返します。 MMAV ユーザ • ガイド 11/6/08 143 例 denaliMemInstance inst; inst = new("ddr0"); $display("MemId = %d\n ", inst.getId()); getInstName() インスタンス名を取得します。 構文 virtual function string getInstName() 引数 なし 戻り値 この関数は、インスタンス名を返します。 例 denaliMemInstance inst; inst = new("ddr0"); $display("InstName = %s", inst.getInstName()); setCbTaskName() DPI コールバック • タスク名を設定します。 注意: デナリでは、ユーザ定義の DPI タスクの使用をお勧めしません。 構文 virtual task setCbTaskName(string cbTaskName) 引数 名前 cbTaskName タイプ string 説明 コールバック • タスク名。 戻り値 なし MMAV ユーザ • ガイド 11/6/08 144 例 denaliMemInstance inst; inst = new("ddr0"); inst.setCbTaskName("myCbFunc"); getCbTaskName() DPI コールバック • タスク名を取得します。 注意: デナリでは、ユーザ定義の DPI タスクの使用をお勧めしません。 構文 virtual function string getCbTaskName() 引数 なし 戻り値 この関数は、コールバック • タスク名を返します。 例 denaliMemInstance inst; inst = new("ddr0"); inst.setCbTaskName("myCbFunc"); $display("TaskName = %s", inst.getCbTaskName()); setCallback() メモリへのアクセス時のコールバックを設定します。 構文 virtual function integer setCallback(DENALIDDVCBpointT cbRsn) 引数 名前 cbRsn MMAV ユーザ • ガイド タイプ DENALIDDVCBpointT 説明 コールバックの理由。 11/6/08 145 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 integer status; denaliMemInstance inst; inst = new("ddr0"); status = inst.setCallback(DENALI_CB_Write); write() メモリ内容をライトします。 構文 virtual function integer write(var denaliMemTransaction tr) 引数 名前 tr タイプ 説明 denaliMemTransaction ライト動作のデータ、アドレス、およびその他の関連フィー ルドを含んでいます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 MMAV ユーザ • ガイド 11/6/08 146 例 task writeMem(reg [63:0] addr) { integer i; integer status; reg [7:0] data [*]; denaliMemTransaction tr = new; tr.setAddress(addr); data = new[8]; // memory width is 64 bits for (i = 0; i < 8; i++) { data[i] = 'h10 + i; } tr.setData(data); status = mem.write(tr); printf("## MEM WRITE : %x -> ", tr.getAddress()); for (i = 0; i < data.size(); i++) { printf("%x ", data[i]); } printf("\n"); } program main { denaliMemInstance mem; mem = new("ddr0"); writeMem('h569); } read() メモリ内容を返します。 構文 virtual function integer read(var denaliMemTransaction tr) 引数 名前 tr タイプ denaliMemTransaction 説明 リード動作のアドレスおよびその他の関連フィールドを含 んでいます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 MMAV ユーザ • ガイド 11/6/08 147 例 task readMem(reg [63:0] addr) { integer i; integer status; reg [7:0] data [*]; denaliMemTransaction tr = new; tr.setAddress(addr); status = mem.read(tr); tr.getData(data); printf("## MEM READ : %x -> ", tr.getAddress()); for (i = 0; i < data.size(); i++) { printf("%x ", data[i]); } printf("\n"); } program main { denaliMemInstance mem; mem = new("ddr0"); readMem('h68); } tclEval() 埋め込み Tcl インタープリタを使用して Tcl コマンドを実行します。 構文 virtual function integer tclEval(string cmd) 引数 名前 cmd タイプ string 説明 Tcl コマンド。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 MMAV ユーザ • ガイド 11/6/08 148 例 integer status; denaliMemInstance inst; inst = new("ddr0"); status = inst.tclEval("mmsetvar tracefile -gzip denali.trc.gz"); ReadCbT() このタスクは、リード・コールバックが発生すると呼び出されます。このタスクは、コール バック DENALI_CB_Read が有効で、ユーザ定義コールバック • タスクが設定されていない場 合にのみ呼び出されます。 構文 virtual task ReadCbT(var denaliMemTransaction tr) 引数 名前 tr タイプ denaliMemTransaction 説明 リード動作のアドレスおよびその他の関連フィールドを含 んでいます。 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 162 ページの「テストケースの例」の例を参照してください。 戻り値 なし WriteCbT() このタスクは、ライト・コールバックが発生すると呼び出されます。このタスクは、コール ユーザ定義コールバック • タスクが設定されていない場 バック DENALI_CB_Write が有効で、 合にのみ呼び出されます。 構文 virtual task WriteCbT(var denaliMemTransaction tr) MMAV ユーザ • ガイド 11/6/08 149 引数 名前 tr タイプ 説明 denaliMemTransaction ライト動作のデータ、アドレス、およびその他の関連フィー ルドを含んでいます。 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 162 ページの「テストケースの例」の例を参照してください。 戻り値 なし DefaultCbT() このタスクは、有効なコールバックが発生し、ユーザ定義コールバック • タスクが設定されて いない場合に呼び出されます。 構文 virtual task DefaultCbT(var denaliMemTransaction tr) 引数 名前 tr タイプ 説明 denaliMemTransaction 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 162 ページの「テストケースの例」の例を参照してください。 戻り値 なし LoadCbT() このタスクは、ロード・コールバックが発生すると呼び出されます。 構文 virtual task LoadCbT(var denaliMemTransaction tr) MMAV ユーザ • ガイド 11/6/08 150 引数 名前 tr タイプ 説明 denaliMemTransaction 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 戻り値 なし LoadDoneCbT() このタスクは、ロード完了コールバックが発生すると呼び出されます。 構文 virtual task LoadDoneCbT(var denaliMemTransaction tr) 引数 名前 tr タイプ 説明 denaliMemTransaction 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 戻り値 なし ResetCbT() このタスクは、リセット・コールバックが発生すると呼び出されます。 構文 virtual task ResetCbT(var denaliMemTransaction tr) 引数 名前 tr MMAV ユーザ • ガイド タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 11/6/08 151 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 戻り値 なし CompCbT() このタスクは、比較コールバックが発生すると呼び出されます。 構文 virtual task CompCbT(var denaliMemTransaction tr) 引数 名前 tr タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 戻り値 なし CompDoneCbT() このタスクは、比較完了コールバックが発生すると呼び出されます。 構文 virtual task CompDoneCbT(var denaliMemTransaction tr) 引数 名前 tr MMAV ユーザ • ガイド タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 11/6/08 152 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 戻り値 なし ReadEiCbT() このタスクは、現在のメモリ • リード動作にエラーが挿入されると呼び出されます。 構文 virtual task ReadEiCbT(var denaliMemTransaction tr) 引数 名前 tr タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 説明 denaliMemInstance を拡張して、このタスクを独自に実装できます。 戻り値 なし クラス denaliMemInstanceList このクラスは、 インスタンスが生成されたすべてのデナリ • メモリ • インスタンスのコンテナ です。 注意: デナリでは、このクラスの使用をお勧めしません。このクラスは、コールバック • ポ イントでインスタンス名を検索するために使用されていましたが、MMAV NTB の新し いコールバック手法が代わりに使用されるようになりました。 getInstanceFromId() 指定したインスタンス ID のインスタンス名を取得します。 構文 function denaliMemInstance getInstanceFromId(integer id) 引数 名前 id MMAV ユーザ • ガイド タイプ 説明 整数 インスタンス ID。 11/6/08 153 戻り値 この関数は、メモリ • インスタンス • オブジェクト名を返します。 クラス denaliMemTransaction このクラスは、メモリへのアクセス動作に関連するフィールドを含んでいるデータ構造です。 コンストラクタ function new() 説明 リードまたはライトに使用されるこのクラスの新しいメモリ • トランザクション • オブジェク トを作成します。 戻り値 この関数は、メモリ • トランザクション • オブジェクトを返します。 例 denaliMemTransaction tr; tr = new; フィールド 名前 rand (Y/N) コールバック N タイプ 説明 DENALIDDVCB コールバック理由。 pointT 幅 Y アドレス Data [] Y 整数 reg [63:0] リードまたはライト対象のアドレス位置。 Y reg [7:0] ライトするデータまたはリード専用データ。 Mask [] Y reg [7:0] 使用するマスク (1 の場合はライト )。 MMAV ユーザ • ガイド 11/6/08 データの幅 ( 単位はビット )。 154 メソッド 名前 説明 getCallback() コールバック理由を返します。 getWidth() メモリ幅を取得します ( 単位はビット )。 setAddress() リードまたはライト対象のアドレス位置を設定します。 getAddress() アドレス位置を返します。 setData() ライトする必要があるデータを設定します。 getData() リードまたはライトされるデータ配列を返します。 getDataSize() データ • サイズを返します。 setMask() リードまたはライトされるデータに使用するマスクを設定します (1= ライト )。 getMask() データに使用されるマスクを返します。 getMaskSize() マスク • サイズを返します。 printInfo() トランザクション • オブジェクトの内容を出力します。 getCallback() コールバック理由を返します。 構文 virtual function DENALIDDVCBpointT getCallback() 引数 なし 説明 コールバック • ポイントでトランザクション • オブジェクトが取得されると、 この関数によっ てコールバック理由が返されます。 戻り値 この関数は、コールバック理由を返します。 例 virtual task WriteCbT(var denaliMemTransaction tr) { printf("Callback : %s\n", tr.getCallback()); super.WriteCbT(tr); } getWidth() メモリ幅を取得します ( 単位はビット )。 構文 virtual function integer getWidth() MMAV ユーザ • ガイド 11/6/08 155 引数 なし 戻り値 この関数は、メモリ幅を返します。 例 virtual task WriteCbT(var denaliMemTransaction tr) { printf("Memory Width : %d\n", tr.getWidth()); super.WriteCbT(tr); } setAddress() リードまたはライト対象のアドレス位置を設定します。 構文 virtual task setAddress(reg [63:0] Address) 引数 名前 アドレス タイプ reg [63:0] 説明 アドレスを指定します。 戻り値 なし 例 denaliMemTransaction tr = new; tr.setAddress('h100); getAddress() アドレス位置を返します。 構文 virtual function reg [63:0] getAddress() 引数 なし MMAV ユーザ • ガイド 11/6/08 156 戻り値 この関数は、アクセス中のアドレスを返します。 例 printf("## MEM WRITE : %x -> ", tr.getAddress()); setData() ライトする必要があるデータを設定します。 構文 virtual task setData(reg [7:0] Data [*]) 引数 名前 Data [*] タイプ reg [7:0] 説明 データを指定します。 戻り値 なし 例 tr.setData(data); status = mem.write(tr); getData() リードまたはライトされるデータ配列を返します。 構文 virtual task getData(var reg [7:0] Data [*]) 引数 名前 Data [*] タイプ reg [7:0] 説明 データ配列。 戻り値 この関数は、リードまたはライトされるデータ配列を返します。アクセスされたデータは、 Data 引数で返されます。 MMAV ユーザ • ガイド 11/6/08 157 例 integer status; reg [7:0] data *;denaliMemTransaction tr = new; tr.setAddress('h100); status = mem.read(tr); tr.getData(data); getDataSize() データ • サイズを返します。 構文 virtual function integer getDataSize() 引数 なし 戻り値 この関数は、データ配列のサイズを返します。 例 virtual task WriteCbT(var denaliMemTransaction tr) { printf("Data Size : %d\n", tr.getDataSize()); super.WriteCbT(tr); } setMask() リードまたはライトされるデータに使用するマスクを設定します (1= ライト )。 構文 virtual task setMask(reg [7:0] Mask [*]) 引数 名前 Mask [*] タイプ reg [7:0] 説明 マスクを指定します。 戻り値 なし MMAV ユーザ • ガイド 11/6/08 158 例 integer i; reg [7:0] mask [*]; denaliMemTransaction tr = new; tr.setAddress('h40); mask = new[8]; // our memory width is 64 bits for (i = 0; i < 8; i++) { mask[i] = 'b01010101; } tr.setMask(mask); getMask() Mask 引数のデータに使用されるマスクを返します。 構文 virtual task getMask(var reg [7:0] Mask [*]) 引数 名前 Mask [*] タイプ 説明 整数 データ • マスクを指定します。 戻り値 この関数は、リードまたはライトされるマスク配列を返します。アクセスされたマスクは、 Mask 引数で返されます。 例 virtual task WriteCbT(var denaliMemTransaction tr) { integer i; reg [7:0] mask [*]; tr.getMask(mask); printf("## MASK : "); for (i = 0; i < mask.size(); i++) { printf("%x ", mask[i]); } super.WriteCbT(tr); } MMAV ユーザ • ガイド 11/6/08 159 getMaskSize() マスク • サイズを返します。 構文 virtual function integer getMaskSize() 引数 なし 戻り値 この関数によって、マスク配列のサイズが返されます。 例 virtual task WriteCbT(var denaliMemTransaction tr) { printf("Mask Size : %d\n", tr.getMaskSize()); super.WriteCbT(tr); } printInfo() トランザクション • オブジェクトの内容を出力します。 構文 virtual task printInfo(integer arrayDepth = 32) 引数 名前 arrayDepth タイプ 説明 整数 出力する必要がある配列要素の最大数を指定します。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual task DefaultCbT(var denaliMemTransaction tr) { tr.printInfo(); super.DefaultCbT(tr); } MMAV ユーザ • ガイド 11/6/08 160 6.6.4 コールバックの処理 MMAV では、メモリへのアクセス時に NTB テストベンチへのコールバックを生成できます。 MMAV NTB コールバック • インターフェイスには、モデル • コールバック初期化およびハンド リングの機能があります。 このために、適切なコールバックをデバイスに追加する必要があります。コールバック関数 は、denaliMemInstance ( インスタンス • クラス ) を拡張して、組み込みコールバック関数 (cbTaskName パラメータを設定せずに指定 ) をオーバーロードして、設定できます。仮想タ スクは、クラスのコールバック理由ごとにオーバーロードできます。 コールバック処理の詳細な例については、162 ページの「テストケースの例」を参照してく ださい。 MMAV ユーザ • ガイド 11/6/08 161 6.6.5 テストケースの例 次の例は、DDR メモリのインスタンス化しバックドア • リードとライトを示しています。ま た、コールバック処理のための denaliMemInstance クラスの拡張についても示されてい ます。 #include "denaliMemTypes.vrh" task writeMem(reg [63:0] addr) { integer i; integer status; reg [7:0] data [*]; denaliMemTransaction tr = new; tr.setAddress(addr); data = new[8]; // memory width is 64 bits for (i = 0; i < 8; i++) { data[i] = 'h10 + i; } tr.setData(data); status = mem.write(tr); printf("## MEM WRITE : %x -> ", tr.getAddress()); for (i = 0; i < data.size(); i++) { printf("%x ", data[i]); } printf("\n"); } task readMem(reg [63:0] addr) { integer i; integer status; reg [7:0] data [*]; denaliMemTransaction tr = new; tr.setAddress(addr); status = mem.read(tr); tr.getData(data); printf("## MEM READ : %x -> ", tr.getAddress()); for (i = 0; i < data.size(); i++) { printf("%x ", data[i]); } printf("\n"); } continued... MMAV ユーザ • ガイド 11/6/08 162 ...continued class MyDenaliMemInstance extends denaliMemInstance { task new(string instName) { super.new(instName); } virtual task WriteCbT(var denaliMemTransaction tr) { printf("**********************************\n"); tr.printInfo(); printf("**********************************\n"); WriteCbT = super.WriteCbT(tr); } virtual task ReadCbT(var denaliMemTransaction tr) { printf("**********************************\n"); tr.printInfo(); printf("**********************************\n"); ReadCbT = super.ReadCbT(tr); } } program main { integer status; MyDenaliMemInstance mem; denaliMemTransaction tr; status = denaliMemInit(); if (status == -1) { error("Denali DDV-MMAV initialization failed. Cannot continue ...\n"); exit(1); } mem = new("simple_tb.simple_mem.storage"); status = mem.setCallback(DENALI_CB_Read); status = mem.setCallback(DENALI_CB_Write); writeMem('h68); readMem('h68); while (1) { @(posedge CLOCK); } @(posedge CLOCK); } MMAV ユーザ • ガイド 11/6/08 163 6.7 SystemVerilog インターフェイス このセクションでは、SystemVerilog テストベンチで MMAV を使用する方法について説明し ます。 6.7.1 MMAV と SystemVerilog の概要 MMAV は、SystemVerilog テストベンチをサポートするネイティブ • クラスベースのオブジェ クト指向インターフェイスを備えています。このインターフェイスは、SV クラスと、メモリ へのアクセスを追跡し、 バックドア • リードおよびライトを実行するためのメソッドで構成さ れます。(PLI ベース ) Verilog プロシージャ • インターフェイスの他の動作は、このような SV クラスでも実行可能です。 6.7.2 MMAV と SystemVerilog のシミュレーション このセクションでは、いくつかの一般的に使用される Verilog シミュレータのシミュレーショ ン手順について説明します。 Mentor Graphics Questa Mentor Graphics Questa を使用して MMAV および SV のシミュレーションを実行するには、次 の手順を実行します。 1. デナリのインストール • ルート • ディレクトリに環境変数 $DENALI を設定します。 2. SystemVerilog シミュレータのパスを設定します。 3. PureView を使用して、MMAV モデル • シェルを生成します。詳細については、10 ページ の「PureView グラフィカル • ツールの使用」を参照してください。 4. user.sv テストベンチを作成します。 5. SV ファイルをコンパイルします。-dpiheader オプションを使用すると、次の C コンパ イルに使用されるヘッダ • ファイルが作成されます。 vlog \ +incdir+$DENALI/ddvapi/sv -dpiheader denaliMemSvIf.h \ $DENALI/ddvapi/sv/denaliMem.sv *.sv *.v 6. C ファイルをコンパイルおよびリンクします。これらのファイルには、C データ構造を SV に変換する ( または SV を C データ構造に変換する ) コードが含まれています。 gcc -c -g -fPIC -I$MTI_HOME/include -I. -I$DENALI \ -I$DENALI/ddvapi $DENALI/ddvapi/sv/denaliMemSvIf.c 7. 共有オブジェクトを作成します。 gcc -shared -o denaliMemSvIf.so \ $DENALI/mtipli.so 8. 不要なファイルをすべて削除します。 rm -f denaliMemSvIf.h denaliMemSvIf.o MMAV ユーザ • ガイド 11/6/08 164 9. シミュレーションを実行します。'-svlib <lib>' オプションを使用すると、作成したインター フェイス共有オブジェクトがロードされます。-dpioutoftheblue 1 オプションを使用 すると、 PLI 1.0 から呼び出された C コードから SV エクスポート • タスクを呼び出すこと ができます。-pli <lib> オプションを使用すると、C モデルを含むデナリ • ライブラリ がロードされます。 vsim -c top -sv_lib denaliMemSvIf -do "run -all; quit" -pli \ $DENALI/mtipli.so -dpioutoftheblue 1 Cadence NC-Verilog Cadence NC-Verilog を使用して MMAV および SV のシミュレーションを実行するには、次の 手順を実行します。 1. デナリのインストール • ルート • ディレクトリに環境変数 $DENALI を設定します。 2. SystemVerilog シミュレータのパスを設定します。 3. PureView を使用して、MMAV モデル • シェルを生成します。詳細については、10 ページ の「PureView グラフィカル • ツールの使用」を参照してください。 4. user.sv テストベンチを作成します。 SV ファイルをコンパイルします。-dpiheader オプションを使用すると、次の C コンパイ ルに使用されるヘッダ • ファイルが作成されます。ncverilog +sv \ +elaborate \ +ncdpiheader+denaliMemSvIf.h \ +licq \ +define+DENALI_SV_NC \ +incdir+$DENALI/ddvapi/sv \ $DENALI/ddvapi/sv/denaliMem.sv 5. C ファイルをコンパイルします。これらのファイルには、C データ構造を SV に変換する ( または SV を C データ構造に変換する ) コードが含まれています。 gcc -c -g -fPIC -DDENALI_SV_NC=1 \ -I$CDS_TOOLS/include -I. -I$DENALI \ -I$DENALI/ddvapi \ $DENALI/ddvapi/sv/denaliMemSvIf.c -m32 6. C ファイルをリンクします。 ld -G -o denaliMemSvIf.so denaliMemSvIf.o $DENALI/verilog/ libdenpli.so -melf_i386 7. 共有オブジェクトを作成します。 gcc -shared -o denaliMemSvIf.so \ $DENALI/mtipli.so 8. シミュレーションを実行します。 ncverilog +loadpli1=$DENALI/verilog/libdenpli.so:den_PLIPtr \ +access+rw \ +nbasync \ +sv \ +sv_lib=$PROJ_HOME/run/denaliMemSvIf.so \ +incdir+$DENALI/ddvapi/sv \ +licq \ +define+DENALI_SV_NC \ *.sv *.v MMAV ユーザ • ガイド 11/6/08 165 Synopsys VCS Synopsys VCS 使用して MMAV および SV のシミュレーションを実行するには、次の手順を 実行します。 1. デナリのインストール • ルート • ディレクトリに環境変数 $DENALI を設定します。 2. SystemVerilog シミュレータのパスを設定します。 3. PureView を使用して、MMAV モデル • シェルを生成します。詳細については、10 ページ の「PureView グラフィカル • ツールの使用」を参照してください。 4. user.sv テストベンチを作成します。 SV ファイルをコンパイルします。 vcs -CFLAGS "-DDENALI_SV_VCS=1 -I${DENALI} \ -I${DENALI}/ddvapi -g -c" \ -sverilog +vcs+lic+wait \ -ntb_opts svp -ntb_opts rvm -ntb_opts dtm \ -Mupdate -P $DENALI/verilog/pli.tab \ -LDFLAGS "-rdynamic $DENALI/verilog/denverlib.o" \ -debug_pp +ntb_enable_solver_trace=0 \ +dmprof \ +define+DENALI_SV_VCS \ +incdir+$DENALI/ddvapi/sv \ $DENALI/ddvapi/sv/denaliMemSvIf.c \ $DENALI/ddvapi/sv/denaliMem.sv \ *.sv *.v 5. シミュレーションを実行します。 ./simv -l vcs.log 6.7.3 コンフィギュレーション • レジスタおよびメモリへのアクセス SystemVerilog メモリ • アクセス関数は、すべてのデナリ検証 IP 製品で使用できます。 これらの 関数を使用すると、メモリ • リファレンスを追跡して、リード / ライト動作を実行できます。 メイン • クラスは次のとおりです。 • クラス denaliMemInstance • クラス denaliMemTransaction これらのクラスの各フィールドでは、フィールド値の取得に必要な get<field_name> アクセ ス • メソッドがフィールドに関連付けられています。また、すべてのライト可能なフィールド には、フィールド値の設定に必要な set<field_name> があります。このようなフィールドはパ ブリックであるため、これらのフィールドに直接アクセスすることができます。 ステータス • コードを返すメソッドはすべて、失敗の場合は "-1" を、成功の場合は "0" を返し ます。 set<field_name> メソッドと get<field_name> メソッドの指定フィールド名の最初の文字は大文 字です。したがって、Address の値を取得する場合、メソッドは getAddress となります。 MMAV ユーザ • ガイド 11/6/08 166 いくつかのフィールドは rand とマークされ、SV のランダム関数によってそれらの値が生成 されます。 クラス denaliMemInstance メモリにアクセスするための SystemVerilog 環境で、denaliMemInstance のインスタンスを 生成します。denaliMemInstance は、テストベンチでインスタンス生成されたか、コンフィ ギュレーション空間などのモデルによって作成されたメモリ • インスタンスに対応します。 次のセクションでは、denaliMemInstance クラスについて説明します。 コンストラクタ function new(string instName, string cbFuncName = "") ; フィールド 名前 instName cbFuncName rand (Y/N) タイプ 説明 N string インスタンス名。 N string コールバック関数名。 instName は完全なパス名である必要があり、 コンストラクタに対して cbFuncName を null に できます。ただし、明示的な DPI コールバック関数を定義する場合、コールバック • ポイント をモニタ用に追加する前に設定する必要があります。 注意: cbFuncName フィールドの使用は、お勧めしません。 メソッド 名前 new() 説明 getInstName() インスタンス名を取得します。 getId() ID を取得します。 getSize() メモリのサイズを取得します。 getWidth() メモリの幅を取得します。 setCbFuncName() DPI コールバック関数名を設定します。 新しいインスタンス • オブジェクトを作成します。 getCbFuncName() DPI コールバック関数名を取得します。 setCallback() メモリへのアクセス時のコールバックを設定します。 write() メモリ内容をライトします。 read() メモリ内容を返します。 tclEval() 埋め込み Tcl インタープリタを使用して Tcl コマンドを実行します。 tclEvalGetResult() 埋め込み Tcl インタープリタを使用して Tcl コマンドを実行し、文字列パラメータの 結果を返します。 setBackdoorCbMode() この関数は、パラメータ値 0 で呼び出され、バックドア • アクセス • コールバックを 無効にします。1 に設定すると、このコールバックは有効になります。 ReadCbF() この関数は、リード・コールバックが発生すると呼び出されます。 WriteCbF() MMAV ユーザ • ガイド この関数は、ライト・コールバックが発生すると呼び出されます。 11/6/08 167 名前 DefaultCbF() 説明 この関数は、有効なコールバックが発生し、コールバック関数が設定されていない 場合に呼び出されます。 LoadCbF() この関数は、ロード・コールバックが発生すると呼び出されます。 LoadDoneCbF() この関数は、ロード完了コールバックが発生すると呼び出されます。 ResetCbF() この関数は、リセット・コールバックが発生すると呼び出されます。 CompCbF() この関数は、比較コールバックが発生すると呼び出されます。 CompDoneCbF() この関数は、比較完了コールバックが発生すると呼び出されます。 ReadEiCbF() この関数は、現在のメモリ • リード動作にエラーが挿入されると呼び出されます。 new() 新しいインスタンス • オブジェクトを作成します。 構文 function new(string instName, string cbFuncName = "") ; 引数 名前 instName タイプ string 説明 cbFuncName string コールバック名。 インスタンス名。 説明 指定のインスタンスから起動できるように新規パケットを作成し、新規作成した空のパケッ トを指すパケット • ハンドルを返します。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; inst = new("i0"); getId() ID を取得します。 構文 virtual function int getId() ; 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 MMAV ユーザ • ガイド 11/6/08 168 例 denaliMemInstance inst; inst = new("i0"); $display("MemId = %d\n ", inst.getId()); getInstName() インスタンス名を取得します。 構文 function string getInstName() ; 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; inst = new("i0"); $display("InstName = %s", inst.getInstName()); getSize() メモリのサイズを取得します。 構文 virtual function longint unsigned getSize() ; 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; inst = new("i0"); $display("MemSize = %d\n ", inst.getSize()); getWidth() メモリの幅を取得します。 構文 virtual function int unsigned getWidth() ; MMAV ユーザ • ガイド 11/6/08 169 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; inst = new("i0"); $display("MemWidth = %d\n ", inst.getWidth()); getCbFuncName() DPI コールバック関数名を取得します。 注意: デナリでは、ユーザ定義 DPI 関数の使用をお勧めしません。 構文 function string getCbFuncName() ; 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; inst = new("i0"); inst.setCbFuncName("myCbFunc"); $display("FuncName = %s", inst.getCbFuncName()); setCallback() この関数は、メモリへのアクセス時のコールバックを設定するために使用されます。 構文 function integer setCallback(DENALIDDVCBpointT cbRsn) ; 引数 名前 cbRsn タイプ DENALIDDVCBpointT 説明 コールバック理由。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 MMAV ユーザ • ガイド 11/6/08 170 int status; denaliMemInstance inst; inst = new("i0"); status = inst.setCallback(DENALI_CB_Write); write() この関数によって、メモリ内容がライトされます。 構文 function int write(ref denaliMemTransaction trans); 引数 名前 trans タイプ denaliMemTransaction 説明 ライト動作のデータ、アドレス、およびその他の関連フィー ルドを含んでいます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 function void writeData(reg [63:0] addr); reg [7:0] data []; denaliMemTransaction trans; trans = new; trans.setAddress(addr); data = new[4]; data[0] = 'h01; data[1] = 'h34; data[2] = 'h78; data[3] = 'h90; trans.setData(data); assert(inst.write(trans) == 0); endfunction denaliMemInstance inst; inst = new("i0"); inst.writeData('h569); MMAV ユーザ • ガイド 11/6/08 171 read() この関数は、メモリ内容を返します。 構文 function int read(ref denaliMemTransaction trans); 引数 名前 trans タイプ denaliMemTransaction 説明 リード動作のアドレスおよびその他の関連フィールドを含 んでいます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 task readData(reg [63:0] addr); reg [ 7:0] data []; int status; denaliMemTransaction trans; string str; trans = new; trans.setAddress(addr); assert(ddr_II_Den.read(trans) == 0) trans.getData(data); for (int i = 0; i < data.size(); i++) begin $swrite(str, "%s%0h", str, data[i]); end $display("******** Data Read = %s", str); endtask tclEval() 埋め込み Tcl インタープリタを使用して Tcl コマンドを実行します。 構文 function int tclEval(string cmd); 引数 MMAV ユーザ • ガイド 11/6/08 172 名前 cmd タイプ string 説明 Tcl コマンド。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; inst = new("i0"); assert(inst.tclEval("mmsetvar tracefile -gzip denali.trc.gz") == 0); tclEvalGetResult() 埋め込み Tcl インタープリタを使用して Tcl コマンドを実行し、文字列パラメータの結果を返 します。 構文 function int tclEvalGetResult(string cmd, output string result, input int resultSize = 1024); 引数 名前 cmd タイプ string 説明 result string Tcl 評価の結果。 resultsize int 結果の最大サイズ。 Tcl コマンド。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; string res; int status; inst = new("i0"); status = inst.tclEvalGetResult("mmsetvar tracefile -gzip denali.trc.gz", res); $display("status = %d / res = %s", status, res); MMAV ユーザ • ガイド 11/6/08 173 setBackdoorCbMode() この関数は、パラメータ値 0 で呼び出され、バックドア • アクセス • コールバックを無効にし ます。1 に設定すると、このコールバックは有効になります。 注意: コールバック処理時のテストベンチ • コードによって、同時に同じデルタ • サイクルで 別のアクセス• コールバックを発生させるデナリMMAV バックドア•メソッドが呼び出 された場合、一部のシミュレータではこれを処理できない場合があります。バックド ア • メソッドが別のコールバック内から呼び出されるようにするには、メモリ • インス タンスのバックドア • アクセス • コールバックを無効にするようにしてください。 構文 virtual function int setBackdoorCbMode(bit onOrOff); 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemInstance inst; inst = new("testbench.i1"); // this will turn off backdoor access cb's for inst assert(inst.setBackdoorCbMode(0)); ReadCbF() この関数は、リード・コールバックが発生すると呼び出されます。このタスクは、コールバッ ク DENALI_CB_Read が有効で、コールバック関数が設定されていない場合にのみ呼び出され ます。 構文 virtual function int ReadCbF(ref denaliMemTransaction trans) ; 引数 名前 trans タイプ denaliMemTransaction 説明 リード動作のアドレスおよびその他の関連フィールドを含 んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 MMAV ユーザ • ガイド 11/6/08 174 virtual function int ReadCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.ReadCbF(trans); endfunction WriteCbF() この関数は、ライト・コールバックが発生すると呼び出されます。このタスクは、コールバッ ク DENALI_CB_Write が有効で、コールバック関数が設定されていない場合にのみ呼び出さ れます。 構文 virtual function int WriteCbF(ref denaliMemTransaction trans) ; 引数 名前 trans タイプ 説明 denaliMemTrans ライト動作のデータ、アドレス、およびその他の関連フィールド action を含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int WriteCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.WriteCbF(trans); endfunction DefaultCbF() この関数は、有効なコールバックが発生し、コールバック関数が設定されていない場合に呼 び出されます。 構文 virtual function int DefaultCbF(ref denaliMemTransaction trans) ; 引数 MMAV ユーザ • ガイド 11/6/08 175 名前 trans タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールド を含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int DefaultCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.DefaultCbF(trans); endfunction LoadCbF() この関数は、ロード・コールバックが発生すると呼び出されます。 構文 virtual function int LoadCbF(ref denaliMemTransaction trans) ; 引数 名前 trans タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールド を含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int LoadCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.LoadCbF(trans); endfunction MMAV ユーザ • ガイド 11/6/08 176 LoadDoneCbF() この関数は、ロード完了コールバックが発生すると呼び出されます。 構文 virtual function int LoadDoneCbF(ref denaliMemTransaction trans) ; 引数 名前 trans タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールド を含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int LoadDoneCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.LoadDoneCbF(trans); endfunction ResetCbF() この関数は、リセット・コールバックが発生すると呼び出されます。 構文 virtual function int ResetCbF(ref denaliMemTransaction trans) ; 引数 名前 trans タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールド を含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 MMAV ユーザ • ガイド 11/6/08 177 例 virtual function int ResetCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.ResetCbF(trans); endfunction CompCbF() この関数は、比較コールバックが発生すると呼び出されます。 構文 virtual function int CompCbF(ref denaliMemTransaction trans); 引数 名前 trans タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールド を含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int CompCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.CompCbF(trans); endfunction CompDoneCbF() この関数は、比較完了コールバックが発生すると呼び出されます。 構文 virtual function int CompDoneCbF(ref denaliMemTransaction trans) ; MMAV ユーザ • ガイド 11/6/08 178 引数 名前 trans タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールドを 含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int CompDoneCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.CompDoneCbF(trans); endfunction ReadEiCbF() この関数は、現在のメモリ • リード動作にエラーが挿入されると呼び出されます。 構文 virtual function int ReadEiCbF(ref denaliMemTransaction trans) ; 引数 名前 trans タイプ denaliMemTransaction 説明 動作のデータ、アドレス、およびその他の関連フィールド を含んでいます。 説明 denaliMemInstance を拡張して、このメソッドを独自に実装できます。 ReadEiCbF() コールバック関数は、$mmerrinject() 関数と共に動作し、主に DRAM での ECC 検証のために使用されます。 $mmerrinject() 関数の使用方法の詳細については、$DENALI/doc/mmav/mmavUserGuide.pdf にある『MMAV User's Guide』を参照してください。 MMAV ユーザ • ガイド 11/6/08 179 次の例は、$mmerrinject() 関数の使用方法を示します。 denaliMemInstance inst; inst = new("i0"); assert(inst.tclEval("mmerrinject id -seed 12 –reads 1000 1200 –bits 1 2 4 –percent 80 15 5") == 0); この例のモデルでは、1 ビット、2 ビット、および 4 ビット • エラーをそれぞれ 80%、15%、お よび 5% の割合で生成し、1000 ~ 1200 のリード動作にランダムにエラーが挿入されます。 1000 ~ 1200 の範囲の特定の N 回リード動作はランダムで、特定のビットが反転します。 $mmerrinject() 関数呼び出しには、いくつかのバリエーションがあります。たとえば、範 囲を指定する必要がない場合、"-reads 1000" と指定すれば、インスタンスの 1000 リード 動作ごとにエラーを挿入できます。 注意: ReadEiCbF() 関数は、常に true で、エラーが挿入される N 回リード動作についてト リガされます。Data フィールドは、値を返し、このときのマスクは !=NULL になり ます。Mask[i] = 1 は、Data[i] が実際のメモリ内容で、Mask[i]=0 は、Data[i] が反転 (0->1 または 1->0) することを示します。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int ReadEiCbF(ref denaliMemTransaction trans); void'(trans.printInfo()); return super.ReadEiCbF(trans); endfunction MMAV ユーザ • ガイド 11/6/08 180 クラス denaliMemTransaction このクラスは、メモリへのアクセス動作に関連するフィールドを含んでいるデータ構造です。 コンストラクタ function new() ; フィールド 名前 rand (Y/N) コールバック N 幅 Y アドレス Data [] Mask [] タイプ 説明 DENALIDDVCB コールバック理由。 pointT データの幅 ( 単位はビット )。 Y 整数 reg [63:0] Y reg [7:0] ライトするデータまたはリード専用データ。 Y reg [7:0] 使用するマスク (1= ライト )。 リードまたはライト対象のアドレス位置。 メソッド 名前 説明 new() メモリ • トランザクション • オブジェクトを作成します。 printInfo() トランザクション • オブジェクトの内容を出力します。 AVM メソッド clone() AVM オブジェクトのコピーを返します。 comp() 2 つのトランザクション • オブジェクトを比較します。 convert2string() オブジェクトの文字列表現を返します。 VMM メソッド psdisplay() is_valid() 文字列として読み取り可能な形式で、このインスタンスによって記述されたトランザ クションまたはデータの現在の値のイメージを返します。 任意で指定した kind または形式に従って、このインスタンスによって記述されたト ランザクションまたはデータの現在の値が有効で、エラーがないかどうかを確認しま す。 注意 : このメソッドはまだ実装されていません。 copy() オブジェクト•インスタンスの現在の値を、指定したオブジェクト•インスタンスにコ ピーします。目的のオブジェクト • インスタンスが指定されていない場合、新しいイ ンスタンスが割り当てられます。 allocate() オブジェクト • インスタンスと同じ種類の新しいインスタンスを割り当てます。 compare() 指定した kind に従って、オブジェクト • インスタンスの現在の値と、指定したオブ ジェクト • インスタンスの現在の値を比較します。値が同じ場合は、TRUE を返しま す (0 以外の場合など )。 byte_pack() 配列の指定されたオフセットから 8'h00 に設定されたバイトまで、アクション記述子 の名前をバイトの指定されたダイナミック配列にパックします。 注意 : このメソッドはまだ実装されていません。 byte_unpack() 指定されたダイナミック配列の指定されたオフセットから8'h00に設定されたバイト まで、指定されたバイト数がアンパックされているか、配列の最後に達している場 合、アクション記述子の名前をアンパックします。 注意 : このメソッドはまだ実装されていません。 byte_size() 記述子の内容のパックに必要な数のバイトを返します。 注意 : このメソッドはまだ実装されていません。 MMAV ユーザ • ガイド 11/6/08 181 new() 新しいメモリ • トランザクション • オブジェクトを作成します。 構文 function new() ; 説明 リードまたはライトに使用されるこのクラスの新しいメモリ • トランザクション • オブジェク トを作成します。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 denaliMemTransaction trans; trans = new; printInfo() トランザクション • オブジェクトの内容を出力します。 構文 virtual function integer printInfo(integer arrayDepth = 32) ; 引数 名前 arrayDepth タイプ 説明 整数 出力する必要がある配列要素の最大数を指定します。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int DefaultCbF(ref denaliMemTransaction tr); assert(tr.printInfo() == 0); return super.DefaultCbF(tr); endfunction clone() AVM オブジェクトのコピーを返します。 MMAV ユーザ • ガイド 11/6/08 182 構文 virtual function denaliMemTransaction clone() ; 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 static denaliMemTransaction trQ [$]; virtual function int DefaultCbF(ref denaliMemTransaction tr); trQ.push_front(tr.clone()); return super.DefaultCbF(tr); endfunction comp() 2 つのトランザクション • オブジェクトを比較します。 構文 virtual function bit comp(input denaliMemTransaction item) ; 引数 名前 item タイプ 説明 denal 現在のオブジェクトの比較対象のオブジェクトを指定します。 iMemTransaction 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 static denaliMemTransaction trQ [$]; virtual function int DefaultCbF(ref denaliMemTransaction tr); if ((trQ.size == 1) && (tr.comp(trQ[0]))) begin $display("Match found!"); end return super.DefaultCbF(tr); endfunction convert2string() オブジェクトの文字列表現を返します。 MMAV ユーザ • ガイド 11/6/08 183 構文 virtual function string convert2string() ; 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 例 virtual function int DefaultCbF(ref denaliMemTransaction tr); tr.convert2string(); return super.DefaultCbF(tr); endfunction psdisplay() 文字列として読み取り可能な形式で、このインスタンスによって記述されたトランザクショ ンまたはデータの現在の値のイメージを返します。 構文 virtual function string psdisplay(string prefix = ""); 説明 この文字列には、複数行のイメージを分割するための改行文字が含まれている場合がありま す。出力の各行には、指定した接頭辞を使用する必要があります。 戻り値 文字列として読み取り可能な形式で、このインスタンスによって記述されたトランザクショ ンまたはデータの現在の値のイメージを返します。 is_valid() 注意: この関数はまだ実装されていません。 任意で指定した kind または形式に従って、このインスタンスによって記述されたトランザク ションまたはデータの現在の値が有効で、エラーがないかどうかを確認します。 構文 virtual function bit is_valid(bit silent = 1, int kind = -1); 説明 任意で指定した kind または形式に従って、このインスタンスによって記述されたトランザク ションまたはデータの現在の値が有効で、エラーがないかどうかを確認します。オブジェク トの内容が有効な場合は、TRUE を返します (0 以外の場合など )。それ以外の場合は、FALSE を返します。kind 引数の意味 ( および使用方法 ) は記述子固有で、このメソッドのユーザ拡 張によって定義されます。 MMAV ユーザ • ガイド 11/6/08 184 silent が TRUE の場合 (0 以外の場合など )、内容が無効でもエラーまたは警告メッセージは発 行されません。silent が FALSE の場合、内容が無効でも警告またはエラー • メッセージが発行 される場合があります。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 copy() オブジェクト • インスタンスの現在の値を、 指定したオブジェクト • インスタンスにコピーし ます。目的のオブジェクト • インスタンスが指定されていない場合、新しいインスタンスが割 り当てられます。 構文 virtual function vmm_data copy(vmm_data to = null); 説明 オブジェクト • インスタンスの現在の値を、 指定したオブジェクト • インスタンスにコピーし ます。目的のオブジェクト • インスタンスが指定されていない場合、新しいインスタンスが割 り当てられます。ターゲット • インスタンスのリファレンスを返します。次の単純な実装は機 能しません。コンストラクタのコピーは、表面的なコピーです。オブジェクトでインスタン スが生成されたオブジェクト ( ログによって参照され、プロパティを通知するオブジェクト など ) は、コピーされず、両方のコピーは、同じサービス • インターフェイスのリファレンス を共有します。また、to 引数が null の場合、このケースは適切に処理されません。 戻り値 この関数によって、ターゲット • インスタンスのリファレンスが返されます。 allocate() オブジェクト • インスタンスと同じ種類の新しいインスタンスを割り当てます。 構文 virtual function vmm_data allocate(); 説明 新しいインス オブジェクト • インスタンスと同じ種類の新しいインスタンスを割り当てます。 タンスのリファレンスを返します。これは、基本的なクラス • タイプを使用してライトされた ジェネリック • コードで、クラス • ファクトリを実装して、ユーザ定義の派生クラスのインス タンスを作成するときに役立ちます。 戻り値 この関数によって、成功の場合は 0 が返され、失敗の場合はゼロ以外の値が返されます。 MMAV ユーザ • ガイド 11/6/08 185 compare() 指定した kind に従って、 オブジェクト • インスタンスの現在の値と指定したオブジェクト • イ ンスタンスの現在の値を比較します。 値が同じ場合は、 TRUE を返します (0 以外の場合など )。 構文 virtual function bit compare(input vmm_data to, output string diff, input int kind = -1)' 説明 指定した kind に従って、オブジェクト • インスタンスの現在の値と指定したオブジェクト • インスタンスの現在の値を比較します。値が同じ場合は、TRUE を返します (0 以外 )。値が 異なる場合は、FALSE が返され、検出された最初の差異のテキスト記述が、指定した文字列 変数で返されます。別の比較関数 ( 完全比較、rand プロパティのみの比較、プロトコルなどに 物理的に実装されたすべてのプロパティの比較など ) を実装するために、kind 引数が使用さ れる場合があります。 戻り値 値が同じ場合、この関数によって 0 が返されます。 byte_pack() 注意: この関数はまだ実装されていません。 配列の指定されたオフセットから 8'h00 に設定されたバイトまで、アクション記述子の名前 をバイトの指定されたダイナミック配列にパックします。 構文 virtual function int unsigned byte_pack(ref logic [7:0] bytes[], input int unsigned offset = 0, input int kind = -1); 説明 デフォルトの実装時に、配列の指定したオフセットから 8'h00 に設定されたバイトまで、ア クション記述子の名前を、バイトの指定したダイナミック配列にパックします。配列のサイ ズは、適切に変更されます。 戻り値 この関数によって、配列に追加されたバイト数が返されます。 byte_unpack() 注意: この関数はまだ実装されていません。 指定されたダイナミック配列の指定されたオフセットから 8'h00 に設定されたバイトまで、 指 定されたバイト数がアンパックされているか、配列の最後に達している場合、アクション記 述子の名前をアンパックします。 構文 MMAV ユーザ • ガイド 11/6/08 186 virtual function int unsigned byte_unpack(const ref logic [7:0] bytes[], input int unsigned offset = 0, input int len = -1, input int kind = -1); 説明 デフォルトの実装時に、指定されたダイナミック配列の指定されたオフセットから 8'h00 に 設定されたバイトまで、指定されたバイト数がアンパックされているか、配列の最後に達し ている場合、アクション記述子の名前をアンパックします。 戻り値 この関数は、アンパックされたバイト数を返します。 byte_size() 注意: この関数はまだ実装されていません。 記述子の内容のパックに必要な数のバイトを返します。 構文 virtual function int unsigned byte_size(int kind = -1); 説明 このメソッドは、パックが実際に実行されないため、記述子が必要とするバイト数を通知す るだけであれば、vmm_data::byte_pack() よりも効率的です。 データが別の方法で解読またはパックされる場合、kind 引数を使用して、使用する解釈また はパックを指定できます。 戻り値 この関数は、この記述子の内容のパックに必要なバイト数を返します。 コールバック処理 デナリでは、メモリへのアクセス時に SystemVerilog テストベンチへのコールバックを生成で きます。 SystemVerilog コールバック • インターフェイスには、モデル • コールバック初期化およびハン ドリングの機能があります。 このために、適切なコールバックをデバイスに追加する必要があります。コールバック関数 は、denaliMemInstance ( インスタンス • クラス ) を拡張して、組み込みコールバック関数 (cbFuncName パラメータを設定せずに指定 ) をオーバーロードして、設定できます。仮想関 数は、クラスのコールバック理由ごとにオーバーロードできます。次のテストケースの例を 参照してください。 MMAV ユーザ • ガイド 11/6/08 187 テストケースの例 module top; import DenaliSvMem::*; /* extend the denaliMemInstance */ class MyMemInstance extends denaliMemInstance; function new (string instName); super.new (instName); endfunction /* overload the write callback function */ virtual function int WriteCbF (ref denaliMemTransaction trans); $display ("WriteCbF ()"); void'(trans.printInfo()); return super.WriteCbF (trans); endfunction /* overload the read callback function */ virtual function int ReadCbF (ref denaliMemTransaction trans); $display ("ReadCbF ()"); void'(trans.printInfo ()); return super.ReadCbF (trans); endfunction endclass continued... MMAV ユーザ • ガイド 11/6/08 188 ...continued MyMemInstance inst; task init_tb(); assert(denaliMemInit() == 0); // instantiate MyMemInstance for the momory model/configuration space inst = new("top.i0"); // set the read and write callback points assert(inst.setCallback(DENALI_CB_Write) == 0); assert(inst.setCallback(DENALI_CB_Read) == 0); endtask initial begin init_tb(); writeData('h569); readData('h569); end function void writeData(reg [63:0] addr); reg [7:0] data []; denaliMemTransaction trans; trans = new; trans.setAddress(addr); data = new[4]; data[0] = 'h01; data[1] = 'h34; data[2] = 'h78; data[3] = 'h90; trans.setData(data); assert(inst.write(trans) == 0); endfunction function void readData(reg [63:0] addr); reg [7:0] data []; int status; denaliMemTransaction trans; trans = new; trans.setAddress(addr); assert(inst.read(trans) == 0); trans.getData(data); $display("Data = %x", data); endfunction endmodule MMAV ユーザ • ガイド 11/6/08 189 MMAV ユーザ • ガイド 11/6/08 190 APPENDIX A A 技術サポート デナリでは、自社製品の技術問題を解決するための迅速かつ簡単な手順を用意しています。 シミュレーション中にデナリ • ツールに問題があると思われた場合は、 次の 3 つの手順を実行 してください。シミュレーションに関係がない場合は、手順 3 に進みます。 手順 1:デナリ MMAV FAQ を確認する。 デナリ MMAV FAQ は、http://www.denali.com/support にあります。数多くのよくある質問が FAQ ナレッジ • データベースに追加されているので、最初にこのサイトを確認してください。 FAQ で解決できない場合は、手順 2 に進みます。 手順 2:シミュレーションの結果を生成する。 履歴ファイルとトレース • ファイルは、モデルの動作を再現するために不可欠です。これらの ファイルを生成するには、ローカルな .denalirc ファイルで次の行のコメントを解除してか らシミュレーションを実行します。 HistoryFile <historyfile.his> HistoryDebug On TraceFile <tracefile.trc> この履歴ファイルとトレース • ファイルは、 特定のメモリ • インスタンスに制限することがで きます。これを実行するために、.denalirc ファイルには次の項目を制御する 2 つの設定が あります。 TracePattern TracePattern を使用すると、特定のインスタンス名パラメータのみを取り込むことによって、 トレース • ファイル ( 上記を参照 ) のサイズを制限することができます。*, ?, [] などのシェル 「グロブ」パターンを使用することができます。また、TraceFile のコメントを解除する必 要があります。 たとえば、"sdram" というパターンを持つメモリ • インスタンスのみをトレースするには、次 の構文を使用します。 TracePattern *sdram* MMAV ユーザ • ガイド 11/6/08 191 HistoryPattern HistoryPattern を使用すると、特定のインスタンス名パラメータのみを取り込むことによって、 トレース • ファイル ( 上記を参照 ) のサイズを制限することができます。*, ?, [] などのシェル 「グロブ」パターンを使用することができます。 たとえば、 "sdram" というパターンを持つメモリ • インスタンスのみの履歴を記録するには、 次 の構文を使用します。 HistoryPattern *sdram* 手順 3:シミュレーション • ファイルを圧縮する。 履歴ファイルおよびトレース • ファイルが非常に大きい場合があるため、電子メールのメッ セージに添付する前にこれらのファイルを ( シミュレーション時に使用された SOMA ファイ ルも一緒に ) 圧縮することをお勧めします。たとえば、ファイルを圧縮するには次の手順を 実行できます。 tar cf mail.tar <historyfile.his> <tracefile.trc> gzip mail.tar this will result in a "mail.tar.gz" file which you can E-mail to "[email protected]". 手順 4:電子メールのメッセージを作成する。 [email protected] 宛ての電子メールには、次の情報を記載してください。 • 特定のエラー• メッセージや予期していなかった動作のタイム • スタンプを含む体験した 問題の簡潔な説明 • シミュレーション環境 ( シミュレータ、オペレーティング • システムなど ) • 連絡先 ( 電話番号、返信先の電子メールアドレスなど ) • 電子メール • メッセージの添付ファイルとして mail.tar.gz ファイル ( 手順 2 から ) この手順を実行することで、 デナリ • サポート • スタッフが素早く効果的に技術的な問題に対 応できるようになります。 MMAV ユーザ • ガイド 11/6/08 192 A.1 デナリ履歴ファイル デナリの履歴ファイルには、 デナリ • メモリ • モデルに関する非常に重要なデバッグ情報が含 まれています。履歴ファイルはすべてのバス • トランザクションをデコードし、すべてのメモ リ • イベントを記録します。必要に応じて、さらに多くのデバッグ情報を履歴ファイルで捕捉 するように選択することができます。これについては後述します。 A.1.1 デナリの履歴ファイルについて (.denalirc の HistoryFile) .denalirc ファイルの HistoryFile パラメータを設定してデフォルトの履歴ファイルを生 成するように選択した場合、基本的なメモリのリード / ライト動作に加え、デコードされた メモリのコマンドも表示されます。その履歴ファイルの例は次のとおりです。 Instance Time Action Address Value testbench.uut1 LOAD FILE: init2.dat testbench.uut1 LOAD FILE: done testbench.uut1 LOAD FILE: init.dat testbench.uut1 LOAD FILE: done testbench.uut1 15 ns Cycle: 1 Command Nop testbench.uut1 105 ns Cycle: 4 Command Precharge All testbench.uut1 135 ns Cycle: 5 Command Mode Register Set testbench.uut1 135 ns Setting Burst Length = 8 Cas Latency = 2 interleave testbench.uut1 165 ns Cycle: 6 Bank 1 Command Activate testbench.uut1 195 ns Cycle: 7 Command Nop testbench.uut1 315 ns Cycle: 11 Bank 0 Command Activate testbench.uut1 345 ns Cycle: 12 Command Nop testbench.uut1 465 ns Cycle: 16 Bank 0 Command Write 000040+0 000 (1FF) testbench.uut1 465 ns MASKED SIM WRITE testbench.uut1 495 ns Cycle: 17 Command Nop 000041+0 001 (1FF) testbench.uut1 495 ns MASKED SIM WRITE 000042+0 002 (1FF) testbench.uut1 525 ns MASKED SIM WRITE testbench.uut1 555 ns MASKED SIM WRITE 000043+0 003 (1FF) 000044+0 004 (1FF) testbench.uut1 585 ns MASKED SIM WRITE 000045+0 005 (1FF) testbench.uut1 615 ns MASKED SIM WRITE testbench.uut1 645 ns MASKED SIM WRITE 000046+0 006 (1FF) 000047+0 007 (1FF) testbench.uut1 675 ns MASKED SIM WRITE testbench.uut1 795 ns Cycle: 27 Bank 0 Command Read testbench.uut1 825 ns Cycle: 28 Command Nop 000040+0 000 testbench.uut1 825 ns SIM READ 000041+0 001 testbench.uut1 855 ns SIM READ testbench.uut1 885 ns SIM READ 000042+0 002 000043+0 003 testbench.uut1 915 ns SIM READ 000044+0 004 testbench.uut1 945 ns SIM READ testbench.uut1 975 ns SIM READ 000045+0 005 testbench.uut1 1005 ns Cycle: 34 Command Burst Stop 000046+0 006 testbench.uut1 1005 ns SIM READ MMAV ユーザ • ガイド 11/6/08 193 A.1.2 HistoryDebug モード (.denalirc の HistoryFile と HistoryDebug) .denalirc ファイルで HistoryDebug オプションをオンにすると、追加デバッグ情報を入手で きます。この情報は、特定のメモリ • デバイスの内部設定を決定するときに役立ちます。デ バッグありのサンプルの DRAM 履歴ファイルを以下に示します。 Instance testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 testbench.uut1 MMAV ユーザ • ガイド Time Action Address Value LOAD FILE: init2.dat LOAD FILE: done LOAD FILE: init.dat LOAD FILE: done 15 ns Debug: Cycle 1: State Bank 0: idle 1: idle 15 ns Cycle: 1 Command Nop 45 ns Debug: Cycle 2: State Bank 0: idle 1: idle 75 ns Debug: Cycle 3: State Bank 0: idle 1: idle 105 ns Debug: Cycle 4: State Bank 0: idle 1: idle 105 ns Cycle: 4 Command Precharge All 135 ns Debug: Cycle 5: State Bank 0: idle 1: idle 135 ns Cycle: 5 Command Mode Register Set 135 ns Setting Burst Length = 8 Cas Latency = 2 interleave 165 ns Debug: Cycle 6: State Bank 0: Mode Register Access 1: Mode Register Access 165 ns Cycle: 6 Bank 1 Command Activate 195 ns Debug: Cycle 7: State Bank 0: idle 1: active 195 ns Cycle: 7 Command Nop 225 ns Debug: Cycle 8: State Bank 0: idle 1: active 255 ns Debug: Cycle 9: State Bank 0: idle 1: active 285 ns Debug: Cycle 10: State Bank 0: idle 1: active 315 ns Debug: Cycle 11: State Bank 0: idle 1: active 315 ns Cycle: 11 Bank 0 Command Activate 345 ns Debug: Cycle 12: State Bank 0: active 1: active 345 ns Cycle: 12 Command Nop 375 ns Debug: Cycle 13: State Bank 0: active 1: active 405 ns Debug: Cycle 14: State Bank 0: active 1: active 435 ns Debug: Cycle 15: State Bank 0: active 1: active 465 ns Debug: Cycle 16: State Bank 0: active 1: active 465 ns Cycle: 16 Bank 0 Command Write 465 ns Debug: Write (0, 000, 040) 000040+0 000 (1FF) 465 ns MASKED SIM WRITE 495 ns Debug: Cycle 17: State Bank 0: active 1: active 495 ns Cycle: 17 Command Nop 495 ns Debug: Write (0, 000, 041) 000041+0 001 (1FF) 495 ns MASKED SIM WRITE 525 ns Debug: Cycle 18: State Bank 0: active 1: active 525 ns Debug: Write (0, 000, 042) 000042+0 002 (1FF) 525 ns MASKED SIM WRITE 555 ns Debug: Cycle 19: State Bank 0: active 1: active 555 ns Debug: Write (0, 000, 043) 000043+0 003 (1FF) 555 ns MASKED SIM WRITE 585 ns Debug: Cycle 20: State Bank 0: active 1: active 585 ns Debug: Write (0, 000, 044) 000044+0 004 (1FF) 585 ns MASKED SIM WRITE 615 ns Debug: Cycle 21: State Bank 0: active 1: active 615 ns Debug: Write (0, 000, 045) 000045+0 005 (1FF) 615 ns MASKED SIM WRITE 645 ns Debug: Cycle 22: State Bank 0: active 1: active 645 ns Debug: Write (0, 000, 046) 000046+0 006 (1FF) 645 ns MASKED SIM WRITE 675 ns Debug: Cycle 23: State Bank 0: active 1: active 675 ns Debug: Write (0, 000, 047) 000047+0 007 (1FF) 675 ns MASKED SIM WRITE 705 ns Debug: Cycle 24: State Bank 0: active 1: active 735 ns Debug: Cycle 25: State Bank 0: active 1: active 765 ns Debug: Cycle 26: State Bank 0: active 1: active 795 ns Debug: Cycle 27: State Bank 0: active 1: active 795 ns Cycle: 27 Bank 0 Command Read 825 ns Debug: Cycle 28: State Bank 0: active 1: active 825 ns Cycle: 28 Command Nop 825 ns Debug: Read (0, 000, 040) 000040+0 000 825 ns SIM READ 855 ns Debug: Cycle 29: State Bank 0: active 1: active 855 ns Debug: Read (0, 000, 041) 000041+0 001 855 ns SIM READ 885 ns Debug: Cycle 30: State Bank 0: active 1: active 885 ns Debug: Read (0, 000, 042) 11/6/08 194 testbench.uut1 885 ns SIM READ 000042+0 002 testbench.uut1 915 ns Debug: Cycle 31: State Bank 0: active 1: active testbench.uut1 915 ns Debug: Read (0, 000, 043) 000043+0 003 testbench.uut1 915 ns SIM READ testbench.uut1 945 ns Debug: Cycle 32: State Bank 0: active 1: active testbench.uut1 945 ns Debug: Read (0, 000, 044) 000044+0 004 testbench.uut1 945 ns SIM READ testbench.uut1 975 ns Debug: Cycle 33: State Bank 0: active 1: active testbench.uut1 975 ns Debug: Read (0, 000, 045) 000045+0 005 testbench.uut1 975 ns SIM READ testbench.uut1 1005 ns Debug: Cycle 34: State Bank 0: active 1: active testbench.uut1 1005 ns Cycle: 34 Command Burst Stop testbench.uut1 1005 ns Debug: Read (0, 000, 046) 000046+0 006 testbench.uut1 1005 ns SIM READ これらの追加的なデバッグコメントから、次のような貴重な情報が提供されます。 1. バンクの状態 (DRAM デバイスの場合 ): testbench.uut1 945 ns Debug: Cycle 32: State Bank 0: active 1: active 2. DRAM をデコードするために使用するデコードされたバンク、行、および列のアドレス: testbench.uut1 975 ns Debug: Read (0, 000, 045) この場合、このリード動作では、バンクアドレスが 0x0、行アドレスが 0x000、列アドレスが 0x045 になります。 MMAV ユーザ • ガイド 11/6/08 195 A.2 履歴ファイルについて 記述する履歴ファイルには、いくつかのトランザクションがあります。次に示されているデ バッグ • エントリは、HistoryDebug をオンにした場合にのみ履歴ファイルに発生します。 A.2.1 A.2.2 SIM READ エントリ インスタンス名 時間 アクション testbench.uut1 25095 ns SIM READ testbench.x A.2.4 A.2.5 000060+0 リード • データ 024 MASKED SIM ライト • エントリ インスタンス名 A.2.3 アドレス + オフセット 時間 202500 ps アクション アドレス + オフセット MASKED SIM WRITE 00002+0 ライト • データ ( マスク ) 0000C (3FFFF) デバッグ • リード インスタンス名 時間 デバッグ testbench.uut1 945 ns Debug: アクション ( バンク • アドレス、 行アドレス、列アドレス ) Read (0, 000, 044) デバッグ • ライト インスタンス名 時間 testbench.uut1 615 ns デバッグ アクション ( バンク • アドレス、 行アドレス、列アドレス ) Debug: Write (0, 000, 045) ファイル • ロード インスタンス名 testbench.uut1 testbench.uut1 32-Bit-Data 32-Bit-Data MMAV ユーザ • ガイド アクション (VIRT=" 論理 " メモリ ):ファイル名 / 実行 LOAD FILE: init.dat LOAD FILE: done VIRT LOAD FILE: mem32x8.dat VIRT LOAD FILE: done 11/6/08 196 記号 .denalirc 55 A AssertionMessages 46, 54 B [Bit-blast Pins] 21 C ClockStableCycles 43, 53 [Close Window] 34 [Contents Table Origin] 34 coupling 故障 90 D DDR-II 55 DDR-II SDRAM 固有の .denalirc パラメータ 48 [Debug] 34 DenaliMemCallback 120 denaliMemCallback 118, 120, 121 DenaliOwn 36, 55 DenaliOwnClass 36, 55 denaliPcieCallback 118 denalirc 38 DifferentialClockChecks 45, 54 DifferentialClockSkew 46 DifferentialClockSkewClock Skew 46 DRAM 11 E eDRAM 54 EiMessages 45, 54 enableReason 120 ErrorCount 54 ErrorMessages 44, 53 ErrorMessagesStartTime 44, 53 eSSRAM 55 ESSRAM 固有の .denalirc パラメータ 49 Event 120 ExitOnErrorCount 44, 53 F FAQ 8 G getCallback() 121 H HDL シェル 22 HistoryDebug 39, 52, 191 HistoryDebugLoad 39, 52 HistoryFile 39, 52 HistoryInSimLog 39, 52 HistoryPattern 43, 53 I IBM-EDRAM 固有の .denalirc パラメータ 47 InitChecks 53 InitChecksPauseTime 45, 53 InitialMemoryValue 41, 53 InitMessages 42, 53 InitMrsAddressStable 48, 54 MMAV ユーザ • ガイド 11/6/08 197 IrregularClock 43, 53 L LicenseQueueRetryDelay 40, 52 LicenseQueueTimeout 40, 52 M [Memory Contents] ウィンドウ 33 Mentor Graphics ModelSim 固有の .denalirc パラメータ 49 Mentor Graphics Seamless HW/SW Co-Verification 固有の .denalirc パラメータ 49 Mentor Seamless 109 mmassert_access 83 MMAV での論理アドレス指定 92 mmbreak 59 mmcomp 71 mmCreateScratchpad 107 mmcreatescratchpad 106, 108 mmdebugoff 76 mmdebugon 76 mmdisablecallback 60 mmdisablecallbackall 60 mmenablecallback 60 mmerrinject 87 mmerrormessagesoff 75 mmerrormessageson 75 mmexit 59 mmfault 90 mmgetids 59 mmgetinfobyid 59 mmgetinstanceid 67 mminstanceid 67 mmload 64 mmnote 59 mmreadword 69 mmreadword2 69 mmreadword3 69 mmrecalculatecycle 72 mmreset 68 mmsave 71 mmsaverange 71 mmsetaccesscallbackmask 61 mmsetallerrinject 88 mmsetallfault 91 mmsetfault 91 mmSetFillValue 63 mmsetvar 55 mmsomaload 74 mmsomaset 73, 74 mmstartpureview 30 mmTclCallback 58 mmTclEval 57 mmtcleval 55, 73 mmtime 59 mmwriteword 69 mmwriteword2 69 mmwriteword3 69 mmwriteword4 69 mmwriteword5 69 mmwritewordmasked 70, 71 ModelSim 55 ModelSimTimeDefinitionToggle 48, 49, 50, 51, 52, 55 ModelSim での Tcl の使用 57 MMAV ユーザ • ガイド 11/6/08 198 N NCSIM 57 NCSIM での Tcl の使用 57 O OffChipDriveImpedanceChecks 55 [Open Instance] 34 OutputTiming 53 P PureSpec ヘルプとマニュアル 8 PureView 10, 29 R RAMBUS 77 RAMBUS - .denalirc のオプション 78 RAMBUS - Turbo モード 80 RAMBUS - チャネル遅延の設定 78 RAMBUS - デバイス ID 77 RAMBUS - デバイス数 77 RAMBUS - デバイス • リフレッシュのオプション 79 RAMBUS - マルチバンク • リフレッシュのオプション 79 RandomOutputDelay 43, 53 RDRAM (Rambus) 固有のオプション 44 RDRAM 固有の .denalirc パラメータ 47 RDRAM - バイト • オーダリングのオプション 80 ReadDQSContentionCheck 41, 53 reason 121 [Refresh] 34 RefreshChecks 41, 53 RefreshOnReadWrite 41, 53 RLDRAM 54 RldramInitCyclesCheck 48, 54 RldramInitRefreshChecks 48 RLDRAM 固有の .denalirc パラメータ 48 [Run Tcl Command] 34 S [Save SOMA] 19 [Save SOMA As] 19 [Save Source] 19 [Save Source As] 19 Seamless 55 setCallback 120 [Show Last Read] 34 [Show Last Write] 34 SimulationDatabase 36, 40, 52 SimulationDatabaseBuffering 41, 52 SimulationDatabasePattern 40, 52 [SOMA Output Format] 20 SOMA ファイルの再ロード 73 SRAM 11 [STD_ULOGIC for VHDL Ports] 21 SuppressPortContention 55 SuppressRefreshInfoMessages 54 SuppressUnknownAddrReadError 46 T Tcl 57 TclInterp 44, 45, 54 Tcl インターフェイス 56 MMAV ユーザ • ガイド 11/6/08 199 Tcl コールバック • ヘルパのコマンド 59 TimingChecks 41, 53 TimingChecksReportOnly 47, 78 TimingChecksStartTime 47, 79 TraceBackdoorReadWrite 54 TraceBackdoorReadWrite 0 46 TraceFile 39, 52, 191 TracePattern 42, 53 TraceTimingChecks 39, 52 TrackAccessFromInit 45, 54 transGet 120 transId 120, 121 transition 故障 90 V [Value Format] 34 Vera インターフェイス 概要 142, 167 シミュレーション 164 Verilog コールバック 118 W WarnSuppress 47 X XML の基本 92 あ アサーション 82 アサーションの動的な有効化および無効化 86 アサーション • メッセージ 46 アドレス 62 アドレス指定方式 62 アドレスのスクランブル 97, 105 い インターリーブ 95, 101 インターリーブの例 96 え エラー • カウント変数 45 エラー挿入 87 エラー • メッセージの制御 75 エンベデッド ASIC/FPGA 11 き 技術サポート 8, 191 規則、表記 7 く グローバルなメモリ • アクセスのアサーション 85 クロック • サイクルの再計算 72, 76 こ コールバック 118 コールバック • インターフェイス 118 顧客サポート 8 故障チェックの有効化 / 無効化 91 故障モデリング 90 MMAV ユーザ • ガイド 11/6/08 200 し シミュレーション Vera インターフェイス 164 シミュレータ • キューイング 56 縮退故障 90 出力タイミング 44 初期化チェック 44 す スクラッチパッドのメモリ 106 た タイミング • パラメータの変更 73 て データ • アクセスのアサーション 83 データ • ビットの並べ替えおよびマスキング 97 デナリ技術サポート 8 と トランザクション • サマリ 35 トランザクション履歴 35 は 「バックドア」リードでのエラー挿入の有効化 89 バックドア • リード / ライトのトレース 46 幅の拡張 93, 94, 101 パリティ • チェックのアサーション 86 ひ 表記規則 7 ふ ファイルからのメモリのロード 63 深さの拡張 93, 95, 101 不揮発性 / フラッシュ • メモリ 11 ま マスキング 102 マスクされたメモリ • ライト 70 め メモリ • アクセスのアサーション 82 メモリ • アドレスの判定 62 メモリ内容ファイルの形式 65 メモリの故障の作成 90 メモリの初期化 62 メモリの内容の保存と比較 71 メモリのパリティ • ビットのビット位置 66 メモリのホール 98 メモリのリードとライト 69 ら ライセンスに関するソリューション 56 ライセンスのチェックアウト 56 り 履歴ファイル 191, 193 MMAV ユーザ • ガイド 11/6/08 201 れ レジスタ • ファイル固有の .denalirc パラメータ 46 MMAV ユーザ • ガイド 11/6/08 202
© Copyright 2024 Paperzz