2012-11-15 92 views
0

我產生在0之間的Verilog一個號碼10000這樣的循環中:生成隨機數 - 種子的改變只有一次

wire rand; 
integer i, seed; 
initial 
    begin 
     i=1; 
     seed=0; 
     while (i<10) 
     begin 
     force rand = $random(seed) % 10000; 
     end 
    end 

的問題種子的變化只有一次,在迭代的其餘部分保持相同。 (我在ModelSim中看到了這些值)。

+3

因此,您將種子設置爲零,不對其進行任何更改並想知道爲什麼它不會更改? – peroija

+0

我知道$ random與$ dist_uniform(seed,0,1000)是一樣的,並且這樣種子每次迭代都會改變。我用force rand = $ dist_uniform(seed,0,1000)嘗試了相同的代碼,結果是一樣的。真正的問題是rand在循環的每次迭代中保持不變。 – LiorZ

+0

rand只有1位寬 – Morgan

回答

1

你不需要在該循環內部的某種延遲? AFAIK它只會迭代所有10次迭代,並且最終會迫使rand達到最終生成的值。

另外,你在哪裏遞增i?或者你在粘貼代碼之前修改了這些內容?

+0

你是對的。我在代碼i = i + 1。 我發現如果我打印$顯示(「%d」,$隨機)它打印不同的值,但如果我打印:強制蘭特= $隨機,然後$顯示(「%d」,蘭特)它打印相同的值。 – LiorZ

2

它應該稍作修改,如果需要,它的隨機數大於1位,並且不會在0時間內執行。 for循環比這裏的while循環更好。

integer i, seed; 
reg [31:0] rand; 

initial begin 
    seed=0; 
    for(i=0; i<10; i=i+1) begin 
    rand = $random(seed) % 10000; 
    $display("rand %d", rand); 
    #1ns; //Stop loop executing in 0 time 
    end 
end 
+0

問題是,我想蘭德是一個電線,而不是一個整數。 – LiorZ

+0

爲什麼?你正在從一個「初始」塊定義它,這是什麼regs是。 'integer'與reg [31:0]幾乎相同,可以驅動輸入。 – Morgan

+0

我已經改變了答案是'reg'。這可能會做你想要的,除非這個部隊是針對不同的層級。 – Morgan