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{
randc Suit card_type;
rand Value card_value;
}card;
class Deck;
rand card cards_drawn[2:0];
// Constraint to ensure that the cards are in increasing order
constraint cards_order_and_suit {
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]) begin
$display("Card %0d: Suit = %s, Value = %s", i, deck.cards_drawn[i].card_type.name(), deck.cards_drawn[i].card_value.name());
end
end
endmodule
我想要为所绘制的三张牌提供独特的套装,我尝试在枚举类型套装变量上使用 randc 但它似乎不起作用,我也没有使用三个模拟器得到任何模拟错误。
如果我为卡牌套装的唯一性指定单独的约束,则代码可以正常工作,但我想探索是否可以在枚举类型变量的结构内执行类似的提及 randc 的操作。
randc
仅适用于对 randomize
的后续调用,不适用于对 randomize
的单次调用。 只需将 card_tytpe
声明为 rand
即可。 获得独特套装的最直接方法是在 unique
块中使用 constraint
关键字。 是的,类似的代码需要重复3次,但只有3行代码:
typedef struct{
rand Suit card_type;
rand Value card_value;
} card;
class Deck;
rand card cards_drawn [3];
// Constraint to ensure that the cards are in increasing order
constraint cards_order_and_suit {
foreach (cards_drawn[i]) {
if (i > 0) {
cards_drawn[i].card_value > cards_drawn[i-1].card_value;
}
}
unique {
cards_drawn[0].card_type,
cards_drawn[1].card_type,
cards_drawn[2].card_type
};
}
endclass
请参阅 IEEE Std 1800-2023,第 18.5.4 节 唯一性约束