我在我的序列中使用了內聯約束和uvm_do_with
宏,我遇到了一些我不太明白的東西。希望有人能提供一些線索洞察到這一點:`uvm_do_with with inline constraints
假設我my_seq_item
有2蘭特變量 - data
和addr
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
變量命名爲addr
和data
以外的變量。
的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;
}
如果這也確實如此,那麼爲什麼命名變量別的工作?
我認爲是的,因爲當你將內聯約束應用於任何對象時,則直接訪問對象變量,而不是通過它的層次結構。像'item.randomize with {addr == 1; data == 256;}' –