我需要能够使用64种不同的可变权重设置约束dist:
当每个索引都有自己的权重/概率时,我需要随机选择范围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:= channel_weight [NUM_OF_CHANS-1]}}
显然这是一个糟糕的写作和一个坏主意,原因有两个:
没有灵活性 - 如果NUM_OF_CHANS发生变化,我需要更改代码。
它长而丑,几乎不可读。
有什么想法吗?
由于
答案 0 :(得分:1)
IEEE Std 1800-2012§18.5.4分布显示dist_list需要是dist_item
的列表,dist_item
定义为value_range [ dist_weight ]
。换句话说,需要列出分发。
您可以创建队列数组(第7.10节队列),然后使用shuffle方法(第7.12.2节数组排序方法),而不是使用constraint
。例如:
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];