目次
- 1. はじめに
- 2. 拡張ストローブ制御の概要
- 3. 乱数発生の関数の仕組みと使用
- 4. ストローブ制御パラメータの詳細仕様
- 5. 実装と設定例
- 6. テスト戦略と品質保証
- 7. コード
- 8. まとめ
- ライセンス
1. はじめに
このドキュメントはAIに読み込ませてコードを自動生成することを目標としています。
第9回で実装したAXI4バス・テストベンチの機能分類とファイル分割を基盤として、拡張ストローブ制御機能を追加した第11回の内容を説明します。
第9回では、テストベンチの機能を論理的に分類し、保守性と再利用性を大幅に向上させました。第11回では、これらの基盤を活用して、より柔軟で包括的なストローブ制御機能を実現します。
第11回の主要な改善点
- 拡張ストローブ制御: パラメータによるストローブ生成戦略の制御
- 乱数生成の高度化: 重み付き選択とストローブ戦略の組み合わせ
- テストカバレッジの向上: 様々なストローブパターンのテスト
- 実装の保守性向上: 設定による動作の制御とエラー検出の強化
この拡張により、AXI4プロトコルの実装品質をより高精度に検証できるテストベンチが完成します。
2. 拡張ストローブ制御の概要
2.1 従来の実装の制限
第9回までのテストベンチでは、以下の制限がありました:
固定ストローブパターンの問題
- 全ストローブ固定: バースト転送時に常に全てのストローブが1
- テストカバレッジ不足: 部分的なストローブパターンのテストが困難
- 実装検証の限界: 実際のハードウェアで発生しうる様々なストローブパターンの検証が不十分
設定の柔軟性不足
- 戦略変更の困難性: ストローブ生成戦略の変更が困難
- パラメータ化の不足: テストケースごとの細かい制御が不可能
- エラーケースの検証不足: 不正な設定の検出と処理が不十分
2.2 拡張の目的と効果
柔軟なストローブ制御の実現
- 戦略選択: "FULL"(全ストローブ1)と"RANDOM"(ランダムパターン)の選択
- パラメータ化: バースト設定とストローブ戦略の組み合わせ制御
- 動的制御: テストケースごとの戦略変更
テストカバレッジの大幅向上
- 多様なパターン: 様々なストローブパターンのテスト
- 境界値テスト: アドレス境界での動作検証
- エラーケース: 不正設定の適切な検出と処理
実装品質の向上
- 保守性: 設定による動作の制御
- 再利用性: 他のプロジェクトでの活用
- 拡張性: 将来の機能追加への対応
3. 乱数発生の関数の仕組みと使用
3.1 重み付き乱数選択の仕組み
重み付き配列の構造
重み付き乱数選択は、burst_config_t
構造体を使用して、各設定に重みを割り当て、その重みに基づいて確率的に設定を選択する仕組みです。
設定配列には5つのエントリがあり、それぞれに重み、バースト長範囲、バーストタイプ、ストローブ戦略が定義されています。各設定の出現確率は重みを総重みで割った値になります。
重み付き選択のアルゴリズム
選択アルゴリズムは以下の手順で動作します:
- 全設定の重みを合計して総重みを計算
- 0から総重み-1の範囲で乱数値を生成
- 重みを累積しながら、乱数値が累積重みを超えた時点でその設定を選択
- フォールバックとして最後の設定を返す
確率分布の制御
- 重みの調整: 各設定の出現確率を重みで制御
- 確率計算: 重みを総重みで割って正確な確率を算出
- 分布の可視化: 設定ごとの確率を明確に表示
3.2 ストローブ戦略の乱数制御
戦略選択の仕組み
ストローブ戦略は、選択されたバースト設定のstrobe_strategy
フィールドに基づいて決定されます。
"FULL"戦略が選択された場合、全てのストローブビットが1に設定されます。"RANDOM"戦略が選択された場合、バーストタイプに応じて異なる処理が行われます。
戦略とバーストタイプの組み合わせ制御例
バーストタイプ | ストローブ戦略 | 動作 | 重み | 確率 | 計算式 |
---|---|---|---|---|---|
INCR | FULL | 全ストローブ1 | 4 | 36.4% | 4/11 = 0.364 |
INCR | RANDOM | ランダムパターン | 5 | 45.5% | 5/11 = 0.455 |
WRAP | RANDOM | ランダムパターン | 1 | 9.1% | 1/11 = 0.091 |
FIXED | FULL | 全ストローブ1 | 1 | 9.1% | 1/11 = 0.091 |
3.3 乱数生成関数の実装
基本乱数生成関数
基本乱数生成関数は、整数配列の重みに基づいて、重み付き乱数選択を行う汎用関数です。総重みの計算、乱数値の生成、重みに基づく選択の3段階で動作します。
ストローブ用乱数生成関数
ストローブ用乱数生成関数は、アドレス、転送サイズ、データ幅を入力として、適切なストローブパターンを生成します。最低限必要なバイト数分のストローブは必ず1に設定し、残りのバイトは50%の確率でランダムに設定されます。
4. ストローブ制御パラメータの詳細仕様
4.1 構造体の拡張
拡張された構造体定義
既存の構造体にstrobe_strategy
フィールドを追加して、ストローブ生成戦略を指定できるようにしました。
burst_config_t
構造体には、選択重み、バースト長範囲、バーストタイプに加えて、ストローブ戦略が含まれます。write_addr_payload_t
とread_addr_payload_t
構造体にも同様のフィールドが追加されています。
新規パラメータの説明
-
strobe_strategy
: ストローブ生成戦略を指定-
"FULL"
: 全てのストローブを1に設定(従来の動作) -
"RANDOM"
: ランダムなストローブパターンを生成(新機能)
-
4.2 ストローブ生成戦略
"FULL"戦略の実装
"FULL"戦略では、全てのストローブビットが1に設定されます。この戦略は従来の動作と完全に同等で、全てのバーストタイプ(INCR、WRAP、FIXED)で使用可能です。最も安全で確実な動作を提供します。
"RANDOM"戦略の実装
"RANDOM"戦略では、バーストタイプに応じて異なる処理が行われます。INCRとWRAPバーストでは、ランダムなストローブパターンが生成されます。FIXEDバーストでRANDOM戦略を指定した場合は、設定エラーとして検出され、シミュレーションが停止します。
4.3 新規関数の実装
generate_random_strobe_no_alignment
関数
この関数は、INCR/WRAP転送用のランダムストローブを生成します。アドレス丸めなしで処理を行い、転送サイズに基づいて最低限必要なバイト数分のストローブを必ず1に設定します。残りのバイトは50%の確率でランダムに設定されます。
関数の特徴として、アドレス丸めなしでの処理、最低限保証とランダム性の両立、境界チェックとオーバーフロー防止が挙げられます。
5. 実装と設定例
5.1 修正された設定配列
拡張されたburst_config_weights[]
設定配列には5つのエントリが含まれており、それぞれ異なる重み、バースト長範囲、バーストタイプ、ストローブ戦略の組み合わせを持っています。各設定の確率が明確に定義されています。
設定の組み合わせと確率
設定番号 | バーストタイプ | ストローブ戦略 | バースト長 | 重み | 確率 | 計算式 | 用途 |
---|---|---|---|---|---|---|---|
1 | INCR | FULL | 1-3 | 4 | 36.4% | 4/11 = 0.364 | 短いバースト、安全な動作 |
2 | INCR | RANDOM | 4-7 | 3 | 27.3% | 3/11 = 0.273 | 中程度バースト、ランダムテスト |
3 | INCR | RANDOM | 8-15 | 2 | 18.2% | 2/11 = 0.182 | 長いバースト、ランダムテスト |
4 | WRAP | RANDOM | 15-31 | 1 | 9.1% | 1/11 = 0.091 | WRAPバースト、ランダムテスト |
5 | FIXED | FULL | 0 | 1 | 9.1% | 1/11 = 0.091 | 単一転送、安全な動作 |
5.2 動作例とテストケース
32ビットバス、4バイト転送の場合
アドレス0x1006、転送サイズ4バイトの場合、FULL戦略では全てのストローブが1になります。RANDOM戦略では、最低限必要な4バイト分のストローブが必ず1になり、残りは0バイトのため最終ストローブは1111になります。
32ビットバス、2バイト転送の場合
アドレス0x1005、転送サイズ2バイトの場合、FULL戦略では全てのストローブが1になります。RANDOM戦略では、最低限必要な2バイト分のストローブが必ず1になり、残り2バイトはランダムに設定されます。
64ビットバス、8バイト転送の場合
アドレス0x2008、転送サイズ8バイトの場合、FULL戦略では全てのストローブが1になります。RANDOM戦略では、最低限必要な8バイト分のストローブが必ず1になり、残りは0バイトのため最終ストローブは11111111になります。
5.3 エラーハンドリング
設定エラーの検出と処理
書き込みデータペイロード生成時に、FIXEDバーストでRANDOM戦略が指定された場合のエラーチェックが行われます。不正な設定が検出された場合、詳細なエラーメッセージが表示され、シミュレーションが停止します。
エラー時の動作
- エラーメッセージの表示: 設定エラーの詳細を表示
-
シミュレーション停止:
$finish
で即座に停止 - デバッグ情報の提供: エラーが発生した条件を詳細に表示
エラー検出の例
エラーが発生した場合、設定エラーの詳細、アドレス、バーストタイプ、ストローブ戦略が表示され、シミュレーションが停止します。
6. テスト戦略と品質保証
6.1 基本テスト
FULL戦略の動作確認
- 従来動作との一致確認: 全ストローブが1に設定されることを確認
- 全バーストタイプでの動作: INCR、WRAP、FIXEDでの動作確認
- 様々なバースト長での動作: 1バイトから最大バースト長まで
RANDOM戦略の動作確認
- ランダムパターンの生成: 異なる実行で異なるパターンが生成されることを確認
- 最低限保証の確認: 必要なバイト数分のストローブが必ず1になることを確認
- ランダム性の検証: 残りのバイトが適切にランダム化されることを確認
エラー検出の確認
- 不正設定の検出: FIXEDバーストでRANDOM戦略を指定した場合のエラー検出
- エラーメッセージの正確性: エラー情報が適切に表示されることを確認
- シミュレーション停止: エラー発生時の適切な停止処理
6.2 境界値テスト
最小転送サイズでの動作
- 1バイト転送: 最小サイズでのストローブ生成
- 境界アドレス: バス幅境界での動作確認
- ストローブパターン: 最小サイズでの適切なパターン生成
最大転送サイズでの動作
- バス幅等価転送: バス幅に等しい転送での動作
- 境界値アドレス: 最大アドレスでの動作確認
- ストローブパターン: 最大サイズでの適切なパターン生成
境界値アドレスでの動作
- バス幅境界: 4バイト、8バイト境界での動作
- 非境界アドレス: 境界からずれたアドレスでの動作
- オーバーフロー防止: バス幅を超えるアクセスの防止
6.3 組み合わせテスト
バーストタイプ別の動作
- INCRバースト: インクリメントアドレスでの動作
- WRAPバースト: ラップアラウンドアドレスでの動作
- FIXEDバースト: 固定アドレスでの動作
ストローブ戦略別の動作
- FULL戦略: 全ストローブ1での動作
- RANDOM戦略: ランダムパターンでの動作
- 戦略切り替え: 実行時の戦略変更
バースト長別の動作
- 短いバースト: 1-7転送での動作
- 中程度バースト: 8-15転送での動作
- 長いバースト: 16-255転送での動作
7. コード
7.1 主要ファイル
共通定義・パラメータ系
-
axi_common_defs.svh
: テストベンチの基本パラメータと構造体定義 -
burst_config_weights[]
: 重み付きバースト設定配列 -
size_strategy
: SIZE生成戦略(FULL/RANDOM)の制御
テスト刺激生成系
-
axi_stimulus_functions.svh
: テストデータ生成と制御関数 -
generate_burst_config()
: 重み付き乱数によるバースト設定生成 -
generate_size_by_strategy()
: 戦略に基づくSIZE値生成
検証・期待値生成系
-
axi_monitoring_functions.svh
: プロトコル監視とログ出力 -
write_debug_log()
: 統一されたログ出力関数 -
monitor_write_address()
: ライトアドレスチャネルの監視
ユーティリティ関数系
-
axi_utility_functions.svh
: 汎用ユーティリティ関数 -
generate_strobe_by_size_strategy()
: 戦略に基づくストローブ生成 -
align_address_by_size()
: SIZEに基づくアドレスアライメント
8. まとめ
今回の第11回では、第9回で実装したAXI4バス・テストベンチの機能分類とファイル分割を基盤として、拡張ストローブ制御機能を実現しました。
主要な成果
1. 拡張ストローブ制御の実現
- 柔軟な戦略選択: "FULL"と"RANDOM"の2つの戦略を実装
- パラメータ化: バースト設定とストローブ戦略の組み合わせ制御
- エラー検出: 不正設定の適切な検出と処理
2. 乱数生成の高度化
- 重み付き選択: 設定ごとの出現確率を正確に制御
- 戦略組み合わせ: ストローブ戦略とバースト設定の組み合わせ
- 再現性: 設定が同じであれば再現可能な結果
3. テストカバレッジの大幅向上
- 多様なパターン: 様々なストローブパターンのテスト
- 境界値テスト: アドレス境界での動作検証
- エラーケース: 不正設定の適切な検出と処理
4. 実装品質の向上
- 保守性: 設定による動作の制御
- 再利用性: 他のプロジェクトでの活用
- 拡張性: 将来の機能追加への対応
技術的な特徴
重み付き乱数選択
- 設定ごとの出現確率を正確に制御
- 総重みに基づく確率計算
- 確率分布の可視化と制御
ストローブ生成戦略
- FULL戦略:従来の動作との完全な互換性
- RANDOM戦略:現実的なテストケースの生成
- エラー検出:不正設定の早期発見
関数の実装
- アドレス丸めなしでの処理
- 最低限保証とランダム性の両立
- 境界チェックとオーバーフロー防止
実装の特徴
現在の実装
- 2つのストローブ戦略(FULL、RANDOM)の完全実装
- 重み付き乱数選択による確率制御
- 包括的なエラー検出と処理
品質保証
- テストカバレッジの大幅向上
- 実装の保守性と再利用性
- エラー処理の強化
この拡張により、AXI4プロトコルの実装品質をより高精度に検証できる、包括的で柔軟なテストベンチが完成しました。適切な設定により、効率的で包括的なストローブテストが可能になり、ハードウェア設計の品質向上に大きく貢献します。
ライセンス
Licensed under the Apache License, Version 2.0 - see LICENSE file for details.