systemverilog约束dist使用权重数组

时间:2013-12-05 12:26:14

标签: constraints distribution system-verilog

我需要能够使用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发生变化,我需要更改代码。

它长而丑,几乎不可读。

有什么想法吗?

由于

1 个答案:

答案 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];