問題タブ [uvm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
verilog - Systemverilog の動的キャストの問題
テストベンチで次のようなコード スニペットがあります
実行すると、「キャストに失敗しました」という uvm_error が表示されます。$cast が 1 を返さない理由はよくわかりません。ご覧のとおり、uvm_info でキャストした後に拡張クラス データ項目を出力しています。ちゃんとキャストされているのがわかります。if 条件で $cast を使用しない場合、実行時エラーは発生しません。$cast が 1 を返すかどうかを確認するために、動的キャストで if を常に使用するのは良いコーディング方法ではないでしょうか?
上記のケースでキャストが 1 を返さない理由は何でしょうか?
system-verilog - 2 つのレジスタにまたがるフィールドへのバックドア アクセスをどのように定義しますか?
16 ビット幅のレジスタを持つレジスタ マップがあります。幅が 16 ビットを超えるフィールドがあるため、2 つのアドレスにまたがる必要があります。このフィールドへのバックドア アクセスを定義するにはどうすればよいですか?
これは私が自分の分野で試したことですtest_pattern[23:0]
:
これは次のエラーで失敗します:
エラー: VPI TYPERR vpi_handle_by_name() はパーツ選択へのハンドルを取得できません。
これが私のツールの制約なのか、それとも UVM コードが VPI を使用する方法の制約なのかは明らかではありません。UVM コード内を調べてみると、部分選択を処理する必要があるコードが表示されますが、それは#ifdef QUESTA
ディレクティブ内にあるため、これはツールの制約であると思います。
これに対する良い回避策はありますか?
system-verilog - タスクを介して uvm_reg 値を設定する際の警告
検証チームと uvm テスト ケースを簡単に記述できるフレームワークを作成しています。基本的な考え方は、私のベース (uvm_) シーケンスには、本体タスクに 1 行しか含まれていないということです。
個々の (uvm_) テストから、便利なヘルパー関数を使用してレジスタ値を設定できます。たとえば、私のテストには次のものが含まれます。
end_of_elaboration フェーズは、レジスタを設定するのに最適な場所ではない可能性があることに気付きました。私のコンパイラは、「警告: タスク "end_of_elaboration" でタスク "set_registerA" を呼び出しています。したがって、run_phase で実行するように変更しました:
これが私がやろうとしていることの正しい方法論であるかどうか確信が持てませんか? super.run_phase を呼び出すと問題が発生しますか? 私はこれがどこでも行われているのを見ません。
verilog - Systemverilog でプロセス間同期を使用する
ハードウェアの一部を systemverilog でモデル化する必要があり、次のようになります。
2 つのトレッド (SV タスク) を並行して実行できます。
両方のスレッドが同じ作業を行います。セマフォの使用を考えています。私は前にそれを使用したことがありません。スレッドが 5 行目でブロックされるというのは有効な仮定/事実ですか? 私が達成したかったのは、スレッド 1 が 4 行目のセマフォ put() を使用してスレッド 2 にリソースを放棄することです - > スレッド 2 がこのリソースを取得し、その作業を行い、最終的に put を使用して解放します。この間、スレッド 1 は 5 行目で get() 呼び出しのブロックを待機します。
system-verilog - UVM print_config に値が表示されない
レガシー UVM コードをデバッグしようとしていますが、何が起こっているのかわかりません。とにかく、私の努力の間に、構成データベースを再帰的に出力するべきである print_config(1) という関数に出くわしました。何らかの理由で、階層を取得している間に、保存されている値が印刷出力に表示されません。私は得るだけです:
を取得するのはなぜですか? 実際の値の代わりに?
編集:私が抱えている基本的な問題は、フィールド「testset_name」を読み取ろうとしているときに、異なる値が得られることです。だから、これはそれがどのように構成されているかです:
基本テスト: set_config_string (" ", testset_name, "ABC") 子テスト: set_config_string (" ", testset_name, "JFK") 孫テスト: set_config_string ("*", testset_name, "XYZ")
シーケンスからこの変数にアクセスしようとすると、「ABC」が表示されます。孫のテスト「set_config_string」を取り出すと、「JFK」になります。
「XYZ」を取得するべきではありませんか?
さらに奇妙なのは、print_config の出力です。
同じコンポーネントの下にテストセット名のエントリが 2 つあるのはなぜですか?
system-verilog - uvm_sequence のパラメーター化された uvm_events
私の検証環境では、再利用できるようにいくつかの一般的なシーケンスを設定しています。
イベントで渡すことができるようなものを作成したいと思います。
テストからこのイベントを次のように設定します。
コンパイル エラー: class specialization parameter must be constant for the common_sequence_with_event#(my_sequence, my_event) 行が表示されます。
これは、クラスに渡されるパラメーターは定数でなければならないことを意味していると思います。したがって、この場合、パラメーターとしても渡される reset_sequence を受け入れるのはなぜですか。
また、私が達成したいことを行うためのより良い方法はありますか?