Constraints 使用权重数组的systemverilog约束距离

Constraints 使用权重数组的systemverilog约束距离,constraints,distribution,system-verilog,Constraints,Distribution,System Verilog,我需要能够使用64种不同的可变权重设置约束距离: 我需要随机选择一个范围为0~63的指数,当每个指数都有自己的权重/概率可供选择时 我可以这样写: 约束拾取通道约束{拾取通道距离{ 0:=通道权重[0],1:=通道权重[1],2:=通道权重[2], 3:=通道权重[3],4:=通道权重[4],5:=通道权重[5], 6:=通道权重[6],7:=通道权重[7],8:=通道权重[8], 9:=通道权重[9],10:=通道权重[10],11:=通道权重[11], 12:=通道权重[12],13:=通道

我需要能够使用64种不同的可变权重设置约束距离:

我需要随机选择一个范围为0~63的指数,当每个指数都有自己的权重/概率可供选择时

我可以这样写:

约束拾取通道约束{拾取通道距离{ 0:=通道权重[0],1:=通道权重[1],2:=通道权重[2], 3:=通道权重[3],4:=通道权重[4],5:=通道权重[5], 6:=通道权重[6],7:=通道权重[7],8:=通道权重[8], 9:=通道权重[9],10:=通道权重[10],11:=通道权重[11], 12:=通道权重[12],13:=通道权重[13], 14:=通道重量[14]

通道数/1:=通道重量[通道数/1]}

显然,这是一个糟糕的写作和想法,原因有二:

没有灵活性-如果更改了更改的数量,我需要更改代码

它又长又丑,几乎不可读

有什么想法吗

谢谢

§18.5.4分发显示距离列表需要是
dist\u项目的列表
s,
dist\u项目
定义为
值范围[dist\u权重]
。换句话说,需要列出分布情况

您可以创建队列数组(§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];
§18.5.4分布显示,距离列表需要是
dist\u项目的列表,
dist\u项目
定义为
value\u范围[dist\u权重]
。换句话说,需要列出分布情况

您可以创建队列数组(§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];