2016-09-29 312 views
-1

我正在使用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,de

如果稍後有新的觸發器posedge,新的值會被隨機化並強制,但是我又得到a == c == eb == 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所示)

+0

http://stackoverflow.com/help/mcve – toolic

+0

您發佈的代碼與您實際執行的代碼有多接近? –

+0

@ dave_59我用更多的上下文編輯了帖子。我正在嘗試在EDA Playground中重新創建它,但目前我的帳戶遇到問題 – chinocolerico

回答

1

爲什麼不使用帶有隨機變量和約束的類???

// outside of the test-bench 
class my_stimulus; 
    rand bit [7:0] a, c, e; // can be logic if you like 
    rand bit [3:0] b, d, f; // rand won't give X or Z 

    constraint c1 { 
     unique {a, c, e}; 
     unique {b, d, f};  
    }  
endclass; 

// inside the actual testbench 
my_stimulus to_dut = new; 

fork 
    forever @(posedge trigger) begin 
    if (!(to_dut.randomize()) $error; 
    force dut.a = to_dut.a; 
    ... 
    force dut.f = to_dut.f; 
    end 
... 
join_none 

唯一約束將導致錯誤或每次給你唯一的值。指定大小不需要設置邊界,但也可以使用其他約束來完成。

1

您的代碼存在兩個問題。 第一個參數$ urandom_range顛倒;它是(max,分鐘),並且分鐘是可選的,默認爲0.有些模擬器會計算出來,但它不是標準的。

第二個問題是因爲你反覆強迫相同的表達式。模擬器可能不會將其視爲新表達式,也不會再次調用$ urandom。請嘗試在每個force前加上release聲明。

forever @(posedge trigger) begin 
     release dut.a; force dut.a = $urandom_range('hFF); 
     release dut.b; force dut.b = $urandom_range('hF); 
     release dut.c; force dut.c = $urandom_range('hFF); 
     release dut.d; force dut.d = $urandom_range('hF); 
     release dut.e; force dut.e = $urandom_range('hFF); 
     release dut.f; force dut.f = $urandom_range('hF); 
    end 
+0

反轉範圍的好處。 我試過釋放信號,但沒有運氣。實際上,當塊被重新觸發時,信號會更新爲新的隨機值......只是選擇的值相同。 – chinocolerico

0

我遇到了與使用NCSIM的OP中的「urandom_range」非常類似的問題。然而,「urandom」工作得很好。不應該有任何理由,「urandom」不應該在你的情況下,而不是「urandom_range」(當然假設「urandom」正常工作)。 「urandom」的結果只會被截斷。

背景信息:爲了萬一任何人都好奇,我在NCSIM中遇到了關於「urandom_range」(但不是「urandom」)的錯誤,其中第一次調用該函數總是會返回最小指定值什麼。但隨後的所有調用都可以正常工作。

+0

我在我的問題上添加了更多信息,希望它有幫助 – chinocolerico

相關問題