2017-02-09 2 views
-1

Я пытаюсь создать случайные числа в verilog в verilog. Но проблема в том, что когда я повторно запускаю симуляцию, это случайное значение фиксировано. , поэтому предыдущее значение моделирования и текущее моделирование случайных значений совпадают.генерация случайных одинаковых чисел в verilog issue

reg [20:0] temp; 

integer seed; 
reg [31:0] rand; 

initial fork 

seed = $random; 

for (i=0; i<10; i=i+1)begin 

temp = $random(seed) %10 ; 
end 

wait(verif_fcnt == 3) begin 
temp = $random(seed) %10 ; 
task1(temp[0],temp[7:0]); 
end 
wait(verif_fcnt == 3) begin 
temp = $random(seed) %10; 
task2(temp[0],temp[7:0]); 
end 
wait(verif_fcnt == 3) begin 
temp = $random(seed) %10; 
task3(temp[0],temp[7:0]); 
end 

join 

ответ

0

Для того, чтобы воспроизвести ошибку, вы хотите «контролировать» случайность. Это то, что вы хотите большую часть времени.

Системный вызов $random ограничен seed. Когда семя дает случайные вызовы, вы получите одну и ту же последовательность.

Я бы посоветовал сохранить параметр семян и сгенерировать его по вызову $random (без семян). Просто обязательно напечатайте переменную seed, используемую в случае, если вы наткнетесь на ошибку.

Вместо:

seed = 0; 

Использование:

seed = $random; 
$display("Seed used: %d",seed); 

EDIT

значение семян также может быть установлен в имитационной командной строки. В NCsim, например, это параметр -seed integer, который устанавливает его.

В этом случае, вы можете добавить в сценарии моделирования:

#!/bin/bash 
export SEED=$RANDOM 
echo "Seed used: $SEED" 
ncsim ...various command line options... -seed $SEED 

EDIT 2

Verilog фактически ведет себя (по умолчанию), как постоянное семя дается, так что вы можете воспроизводить ошибки (see here) ,

Чтобы вручную передать семя в источнике Verilog, вам нужно будет использовать $srandom(seed), чтобы инициализировать семя следующих случайных вызовов. Затем вы должны использовать $urandom вместо $random(see here)

Для создания щёток seed, я хотел бы попробовать использовать $urandom перед установкой семян.

integer seed; 
initial begin 
seed = $urandom(); 
$srandom(seed); 
end 
//** 
    ... tests with $urandom() calls 
**// 

IMHO, наконец, будет проще использовать параметр командной строки.

+0

Когда я повторно запускаю, начальное значение всегда одинаково – grander3

+0

В вашей команде моделирования можно определить семена, например. в командной строке NCsim '-seed $ NUMBER'. Это семя автоматически сдерживает случайные вызовы в симуляции. – Krouitch

+0

Есть ли какие-либо опции для обработки в verilog not tool? – grander3

Смежные вопросы