systemverilog约束dist使用权重数组

问题描述 投票:1回答:1

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

它漫长而丑陋,几乎不可读。

有任何想法吗?

谢谢

constraints distribution system-verilog
1个回答
1
投票

IEEE Std 1800-2012§18.5.4分布显示dist_list需要是dist_items列表,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];
© www.soinside.com 2019 - 2024. All rights reserved.