SystemVerilog结构体中randc修饰枚举无法实现花色唯一性问题咨询
问题解答
核心结论
不能通过在结构体成员上使用randc修饰枚举类型的方式,实现数组内多个结构体实例的花色唯一性。
原因分析
randc(随机周期变量)的作用范围是单个变量实例:对同一个变量每次调用randomize()时,会遍历所有可能的取值,直到所有值都被取过才会重复。但你的代码存在以下问题:
cards_drawn是包含3个card结构体的数组,每个数组元素都是独立的card实例- 每个
card实例的card_type都是独立的randc变量,它们的随机周期互不关联 - 三个
card_type的随机取值完全独立,自然无法保证互相不重复
正确实现方式
改用rand修饰结构体的card_type,然后在类中通过约束强制数组内所有card_type的唯一性,使用unique关键字即可实现需求。修改后的代码如下:
typedef enum {HEARTS, DIAMONDS, CLUBS, SPADES} Suit; typedef enum {TWO = 2, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE} Value; typedef struct{ rand Suit card_type; // 将randc改为rand rand Value card_value; }card; class Deck; rand card cards_drawn[2:0]; constraint cards_order_and_suit { // 新增花色唯一性约束 unique {cards_drawn.card_type}; foreach (cards_drawn[i]) { if (i > 0) { cards_drawn[i].card_value > cards_drawn[i-1].card_value; } } } endclass module test; initial repeat(5) begin automatic Deck deck = new(); assert(deck.randomize()) else $display("Failed to draw three cards"); foreach (deck.cards_drawn[i]) { $display("Card %0d: Suit = %s, Value = %s", i, deck.cards_drawn[i].card_type.name(), deck.cards_drawn[i].card_value.name()); } } endmodule
补充说明
如果需要让同一个card实例多次随机时花色不重复,randc是有效的;但如果要约束多个独立实例之间的取值唯一性,必须通过类级别的约束来实现,randc无法完成跨实例的约束逻辑。
内容的提问来源于stack exchange,提问作者Chomusuke
相关产品推荐
相关产品推荐

