2016-07-13 3 views
1

У меня есть логика переменной [31: 0], которая не объявляется как rand или randc. Мне нужен каждый раз каждый id в логике массива [31: 0] id_array [16].Systemverilog уникальные значения массива во время randomizatoin

logic [31:0] id; 
logic [31:0] id_array [16]; 
foreach(id_array[i]) begin 
    std::randomize(id); 
    id_array[i] = id; 
end 

В приведенном выше коде есть возможность получения дубликатов идентификаторов в массиве. Как изменить код для получения уникальных идентификаторов в массиве?

ответ

2

меняю бы это

logic [31:0] id; 
logic [31:0] id_array [$]; 
repeat (16) begin 
    std::randomize(id) with {!(id inside {id_array});}; 
    id_array.push_back(id);; 
end 

или просто

logic [31:0] id_array [15]; 

std::randomize(id_array) with {unique {id_array};}; 
+0

Просто имейте в виду, что конструкция 'unique' доступна только в SystemVerilog 2012. Если вы используете версию 2005 года, это не сработает. – AndresM

1

Другим вариантом рандомизации:

logic [31:0] id_array [$]; 
std::randomize(id_array) with { // random numbers in ascending order 
    foreach(id_array[idx]) { 
    (idx>0) -> id_array[idx] > id_array[idx-1]; 
    } 
}; 
id_array.shuffle(); // randomize order 
0

Еще один варианта в случае, если у вас не было достаточно .. .

logic [31:0] id_array [16]; 
std::randomize(id_array) with { 
    foreach (id_array[i]) 
    foreach (id_array[j]) 
     if (i!=j) 
     id_array[i] != id_array[j]; 
} 

BTW, @Tudor написал очень красивый blog в ограничениях массива SystemVerilog. Это определенно стоит прочитать.

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