从 SystemVerilog 队列中随机选择项目

问题描述

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

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

编辑:

所以我可以有一个这样的队列: reg_queue = {reg_item1,reg_item2,reg_item3,reg_item4,reg_item5,reg_item6}

我想随机选择一些这样的寄存器使用方法A写入,其余的将使用方法B写入。

所以我最终可能会有 2 个队列:reg_queue_a = {reg_item3,reg_item1,reg_item5)reg_queue_b = {reg_item2,reg_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};
                      }