MMAV - Denali Software

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