1

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. (実はこれも別の回避策です!!)

どんな助けでも大歓迎です。

4

1 に答える 1