レジスタのステータスを監視する必要があります。私は、レジスタを読み込んでローカルに格納するUVMシーケンスを作成しました。私のテストコードでは、これらの レジスタにアクセスする必要があります。ここでsudoのコードは次のとおりです。UVMシーケンスへの参照
typedef struct {
int a;
} my_regs;
class my_seq extends uvm_sequence;
// register to uvm db
reg_map map;
my_regs regs;
uvm_status_e status;
task build_phase(uvm_phase phase);
endtask
task run_phase(uvm_phase phase);
map.CORE.reg_a.read(status, regs.a, UVM_BACKDOOR)
endtask
endclass
class test_reg extends uvm_test;
// register to uvm db
my_seq seq;
my_regs regs;
task build_phase(uvm_phase phase);
seq = my_seq::type_id::create("reg_seq", this);
regs = seq.regs;
endtask
task run_phase(uvm_phase phase);
reg_seq.start(null);
// read reg values from seq??????
if(rqgs.a>1)
//do some thing
endtask
endclass
あなたが見ることができるように、私はすべての更新プログラムを欠場いけないように、私は常にシーケンスを始めています。 開始タスクが順番に新しいオブジェクト を作成しないので、オブジェクト内の値は開始呼び出しの間に一定のままでなければなりません。
私は毎回seqからregs値を読み込まないと仮定すると、テストクラスのregsはseqからの更新を取得しません。意味は、regs = seq.regs;はseq.regsへの実際の参照を作成しません。私はなぜそれが知りたいのですが、どうすればそのオブジェクトへの絶対参照を作成できますか? (そうすることで、テストクラスのregs値を読み込んで更新する際にシミュレーションサイクルを無駄にすることはありません)。また、これを行うより良い方法があるかどうか、私に助言してください。
(我々はテストベンチからRTL信号にアクセスしているとして、この方法は望ましくありません。)変更して、読み取りを発行するRTL信号を待つことができ私が言ったように、それはsudoのコードであり、元のコードではあなたが記述した方法で本体を実装しました。再度、感謝します! – maskarih
:)それを得ました。すべてのことを確認するだけです。どういたしまして 。 –