Systemverilog 中结构元素的约束

问题描述 投票:0回答:1
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 的操作。

constraints verilog system-verilog hdl test-bench
1个回答
0
投票

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 节 唯一性约束

© www.soinside.com 2019 - 2024. All rights reserved.