UVM テストベンチから DUT に対して何らかのレジスタ書き込みが実行された後に開始される同時アサーションを書き込みたいと考えています。
class test extends uvm_test;
bit flag;
task run_phase(uvm_phase phase);
//call register write task , data is chosen in a random fashion
write(addr,data);
flag = 1; // flag gives the time when the register is written.
// after this task the assertions must start depending on data.
endtask
endclass
module top();
//instantiate dut, interface and other stuff
property p1(logic a,logic [4:0] b,logic flag,logic c);
disable iff(!reset || b[i] == 1 || !flag)
/*
default register value is 0, enable assertion only if 0 is written into it.
(0 is for enabling certain feature in DUT and by-default it is enabled.
1 is for disabling that feature. Assertion must never be enabled if b[i] contains 1)
*/
@(posedge clk)
a == 0 |-> $stable(c);
endproperty
assert property p1(dut_top.path_to_dut_signal,uvm_test_top.data,uvm_test_top.flag,dut_top.path_to_dut_other_signal); // gives compile error
// basically I need here dut's signal and the data written to register
// call run_test and set config_db for interface here
initial
begin
// ... run_test
end
uvm_test_topは実行時に作成され、アサーション入力はコンパイル時に設定されるため、これによりクロス モジュール参照のコンパイル エラーが発生します。
そのため、このためのいくつかの回避策を見つけました。
次のように、グローバル空間でいくつかの一時変数とフラグ変数を宣言します。
bit flag; // in global space
logic [4:0] temp;
class test extends uvm_test;
task run_phase(uvm_phase phase);
//call register write task
write(addr,data);
temp=data, flag=1;
// after this task the assertions must start depending on temp.
endtask
endclass
/** In top, **/
property p1(logic a,logic [4:0] b,logic flag,logic c);
disable iff(!reset || b[i] == 0 || flag ==0)
@(posedge clk)
a == 0 |-> $stable(c);
endproperty
assert property p1(dut_top.path_to_dut_signal,temp,flag,dut_top.path_to_dut_other_signal);
// solves the error
ここでは、2 つのグローバル空間変数が使用されています。これは避けた方がよいでしょう。
いずれにせよ、これらの変数を一番上に取り、テストで $root によってそれらにアクセスできます。ただし、再利用性とパッケージの問題のために $root を使用することは好みません (最上位の名前が変更された場合、またはアサーション用の別のモジュールが作成された場合、テストでエラーが発生します)。
これを達成するための他の良い方法はありますか?アサーションの実行を遅らせることができるように。1timestamp 遅らせても、uvm_test_top に評価されます (クレイジーに聞こえます..!!)。
また、インターフェイス信号を使用したくありません。DUT はプロトコルに依存しないため、「ifdefs. (実はこれも別の回避策です!!)
どんな助けでも大歓迎です。