如何以可扩展的方式创建约束?

问题描述 投票:0回答:1

我想写这个约束:

A、B 和 C 均为 1 位宽

50% time all 3 are disabled.
10% time A enabled alone.
10% time B and C enabled together.
30% for all 3 enabled together

我只知道如何在一堆

if/else
条件下做到这一点。 但是,如果我希望它是可扩展的,有没有更好、更优雅的方法?

constraints verilog system-verilog
1个回答
0
投票

使用

dist
。 请参阅 IEEE Std 1800-2023,第 18.5.3 节 Distribution:

class d;
    rand bit a, b, c;
    constraint ccc {
        {a, b, c} dist {
            3'b000 := 50, // 50% time all 3 are disabled.
            3'b100 := 10, // 10% time A enabled alone.
            2'b011 := 10, // 10% time B and C enabled together.
            3'b111 := 30  // 30% for all 3 enabled together.
        };
    }
endclass

module tb;
    d d;
    initial begin
        d = new();
        repeat (1000) begin
            if (!d.randomize()) $fatal(2, "RAND FAIL");
            $display("result", , d.a, , d.b, , d.c);
        end
    end
endmodule

在一个模拟器上打印:

507 result 0 0 0
103 result 0 1 1
105 result 1 0 0
285 result 1 1 1
© www.soinside.com 2019 - 2024. All rights reserved.