我正在使用UVM運行測試臺。在組件的run_phase()
任務之一,我做了fork...join_none
開始下面的循環,這在整個模擬運行:
fork
forever @(posedge trigger) begin
force dut.a = $urandom_range('h00,'hFF);
force dut.b = $urandom_range('h0, 'hF);
force dut.c = $urandom_range('h00,'hFF);
force dut.d = $urandom_range('h0, 'hF);
force dut.e = $urandom_range('h00,'hFF);
force dut.f = $urandom_range('h0, 'hF);
end
...
some other stuff
...
join_none
的東西是信號一個,Ç和Ë得到強制達到相同的價值。 b,d和e。
如果稍後有新的觸發器posedge,新的值會被隨機化並強制,但是我又得到a == c == e
和b == d == e
。
對於每個參數的選擇(0到FF和0到F),似乎只調用一次$urandom_range
,並且將三個force
命令重新使用返回值。
編輯:我是能夠重現上最小的TB問題:http://www.edaplayground.com/x/4_ph
它看起來像我使用,選擇其他工具供應商的問題,這個問題就會消失。
編輯2:我還沒有想出究竟爲什麼發生這種情況,但它似乎與這樣的事實:力說法就像是一個連續的分配(即,如果在今後的RHS信號變化,強迫的LHS將跟着它,直到是版本d,它不像'='賦值)。
所以我的猜測是問題在於使用函數的返回值作爲RHS。 (我不知道這個返回值有哪些生命週期)
在我的情況下,解決方案是將$ urandom值保存到一個具有靜態生命週期的變量,然後強制該變量爲RTL(如J Reid所示)
http://stackoverflow.com/help/mcve – toolic
您發佈的代碼與您實際執行的代碼有多接近? –
@ dave_59我用更多的上下文編輯了帖子。我正在嘗試在EDA Playground中重新創建它,但目前我的帳戶遇到問題 – chinocolerico