2016-12-16 75 views
0

我在我的序列中使用了內聯約束和uvm_do_with宏,我遇到了一些我不太明白的東西。希望有人能提供一些線索洞察到這一點:`uvm_do_with with inline constraints

假設我my_seq_item有2蘭特變量 - dataaddr

my_sequence.sv

class my_sequence extends uvm_sequence; 
// Constructor, .... etc etc 

virtual task body(); 
    my_sequence_item tx; 
    bit [31:0] addr = 'h0101_0101; 
    bit [31:0] data = 'hDEAD_BEEF; 

    `uvm_do_with(tx , { tx.addr == addr; 
         tx.data == data; 
        }); 
endtask: body 

這沒有發揮好。相反:

`uvm_do_with(tx , { tx.addr == local::addr; 
        tx.data == local::data; 
        } 

工作正常。

另一種解決方案是將我的local變量命名爲addrdata以外的變量。

uvm_do_with宏的擴張說,它調用item.randomize(),所以在這種情況下假設,呼叫將

item.randomize(addr, data) with {addr == local::addr; 
           data == local::data; 
           } 

這是否意味着,如果變量的約束塊內的範圍是項目而不是當前對象?如果是這樣的話,那麼我應該能夠調用:

`uvm_do_with(tx , { addr == local::addr; 
        data == local::data; 
        } 

如果這也確實如此,那麼爲什麼命名變量別的工作?

+1

我認爲是的,因爲當你將內聯約束應用於任何對象時,則直接訪問對象變量,而不是通過它的層次結構。像'item.randomize with {addr == 1; data == 256;}' –

回答

2

串聯約束具有複雜的標識符搜索語義。它首先搜索randomize()被調用的對象(在這種情況下爲item)。如果未找到標識符,則搜索將從對randomize()的呼叫發生處開始(從body()任務開始)。

因此,當您在項目和正文中都具有相同的標識符名稱時,約束條件首先會找到item標識符。名稱不一樣時,您不會遇到此問題。使用local::是顯示您不想要項目進行搜索的意圖的方式。無論何時有或沒有項目中具有相同名稱的標識符,我建議在任何時候只要本地範圍搜索就使用local::

+0

謝謝你的澄清 – noobuntu