System verilog 从SystemVerilog队列中随机选择项目

System verilog 从SystemVerilog队列中随机选择项目,system-verilog,uvm,System Verilog,Uvm,我有一个寄存器队列,用内存映射中的寄存器实例化。 发生的情况是,其中一些寄存器将使用RAL直接写入,而其他寄存器将通过另一种方法写入。 我的测试应该是每次随机分配两组寄存器的数量和名称。如何在不重复的情况下随机选择每个配置的寄存器数量和名称 结果可以是允许我使用这些寄存器的任何格式,因此如果它产生两个子队列就可以了 编辑: 所以我可以有这样一个队列: reg\u队列={reg\u项目1、reg\u项目2、reg\u项目3、reg\u项目4、reg\u项目5、reg\u项目6} 我想随机选择一些寄

我有一个寄存器队列,用内存映射中的寄存器实例化。 发生的情况是,其中一些寄存器将使用RAL直接写入,而其他寄存器将通过另一种方法写入。 我的测试应该是每次随机分配两组寄存器的数量和名称。如何在不重复的情况下随机选择每个配置的寄存器数量和名称

结果可以是允许我使用这些寄存器的任何格式,因此如果它产生两个子队列就可以了

编辑:

所以我可以有这样一个队列:
reg\u队列={reg\u项目1、reg\u项目2、reg\u项目3、reg\u项目4、reg\u项目5、reg\u项目6}

我想随机选择一些寄存器,使用方法a写入,剩下的将使用方法B写入

所以我可能会有两个队列:
reg\u队列a={reg\u item3,reg\u item1,reg\u item4,reg\u item5)
reg\u队列b={reg\u item2,reg\u item6}


我可以用洗牌或其他方法来实现这一点吗?

您可以添加一个约束,将两个队列之和的大小限制为原始队列的大小

rand int unsigned reg_queue_a[$], reg_queue_b[$]; // queue of index values
constraint queue_size { reg_queue_a.size() + reg_queue_b.size() == reg_queue.size();
                        // range if needed
                        reg_queue_a.size() inside {[1:reg_queue.size()-1]};
                      }
constraint queue_uniq { foreach (reg_queue_a[i]) reg_queue_a[i] inside {[0:reg_queue.size-1]};
                        foreach (reg_queue_b[i]) reg_queue_a[i] inside {[0:reg_queue.size-1]};
                        unique {reg_queue_a,reg_queue_b};
                      }

您当然应该知道如何生成随机数作为队列的索引。但您没有解释的问题肯定还有更多。如果您手动选择寄存器,这将有助于显示代码的外观。是的,我可以从队列中选择随机项,但我还想单独选择在第一阶段中未被选中。我将编辑问题以进一步解释。