systemverilog ограничение dist с использованием массива весов

Мне нужно иметь возможность установить ограничение dist с 64 различными изменяемыми весами:

Мне нужно случайным образом выбрать индекс в диапазоне от 0 до 63, когда каждый индекс имеет свой собственный вес/вероятность выбора.

Я могу написать что-то вроде:

ограничение pick_chan_constraint {pick_channel dist{ 0:=channel_weight[0], 1:=channel_weight[1], 2:=channel_weight[2], 3:=channel_weight[3], 4:=channel_weight[4], 5:=channel_weight [5], 6:=channel_weight[6], 7:=channel_weight[7], 8:=channel_weight[8], 9:=channel_weight[9], 10:=channel_weight[10], 11:=channel_weight[11 ], 12:=channel_weight[12], 13:=channel_weight[13], 14:=channel_weight[14], … ...

NUM_OF_CHANS-1 := вес_канала[NUM_OF_CHANS-1] }}

Очевидно, что это плохой текст и плохая идея по двум причинам:

Никакой гибкости: если NUM_OF_CHANS изменится, мне нужно будет изменить код.

Оно длинное, уродливое и почти нечитаемое.

Любые идеи?

Спасибо


person user3070156    schedule 05.12.2013    source источник


Ответы (1)


IEEE Std 1800-2012 18.5.4 Распространение показывает, что dist_list должен быть списком dist_items, а dist_item определяется как value_range [ dist_weight ]. Другими словами, дистрибутив должен быть указан.

Вместо использования constraint вы можете создать массив очередей (7.10 Очереди), а затем использовать метод перемешивания (7.12.2 Методы упорядочения массивов). Пример:

int channel_weight [64];
int pick_channel;
int weight_chain [$];

weight_chain.delete(); // make sure it is empty
foreach (channel_weight[i]) begin
  repeat (channel_weight[i]) begin
    weight_chain.push_back(i);
  end
end
weight_chain.shuffle(); // randomize order
assert( weight_chain.size() > 0) else $error("all channel_weights are 0");
pick_channel = weight_chain[0];
person Greg    schedule 05.12.2013