2017-06-06 58 views
1

我有一個關聯數組隨機化在系統的Verilog

rand uvm_reg_field array_assoc[string]; 

陣列包含UVM寄存器字段的手柄,用於在DUT中的寄存器,並且由一個字符串索引(字符串是該字段的名稱)。 假設我有2個名稱爲「reg_field_1」和「reg_field_2」的註冊字段。

如上所述,

array_assoc["reg_field_1"]= handle of field 1; 
    array_assoc["reg_field_2"]= handle of field 2; 

我需要隨機化僅其中的一個字段,因此,我選擇性地打開rand_mode關閉中的一個字段,說 「reg_field_1」:

array_assoc["reg_field_1"].rand_mode(0); 

現在,如果我隨機化關聯數組,兩個寄存器字段都隨機化。

什麼甚至更令人驚訝的是,如果我聲明一個正常陣列具有整數索引,使得:

rand uvm_reg_field array_normal[2]; 

    array_normal[0]= handle of field 1; 
    array_normal[1]= handle of field 2; 

,然後字段1轉動rand_mode的:

array_normal[0].rand_mode(0); 

它工作正常,字段1沒有隨機化。

的問題是:爲什麼寄存器字段「reg_field_1」獲得,即使其rand_mode已關聯數組的情況下被設置爲0隨機?

回答

3

在關聯數組的各個元素上設置rand_mode()的能力似乎有零星的支持。下面的內容適用於我在Questa和另外一個模擬器中的作品;在另一個給我一個「不支持」,而你在另一個看到的結果。所以我會聯繫你的工具供應商。

module top; 
class B; 
    rand byte m; 
endclass 
class A; 
    rand B a1[2]; 
    rand B a2[string]; 
    function void run; 
     a2["0"] = new; 
     a2["1"] = new; 
     a1[0] = new; 
     a1[1] = new; 
     a1[0].rand_mode(0); 
     a2["0"].rand_mode(0); 
     void'(randomize()); 
     $display(a1[0].m, a1[1].m,,a2["0"].m,a2["1"].m); 

     endfunction 
endclass 
    A a = new(); 
    initial repeat(3) a.run(); 
endmodule