软约束对于位变量无法正常工作

Sal*_*lim 2 constraints system-verilog

我有一个可变数据,我希望最后一位为 1,其余位为 0,我使用软约束编写了它。

class ABC;
  rand bit [3:0] data;

  // This constraint is defined as "soft" 
  constraint c_data {
                       soft data == 0;
                            data[0] == 1;
                    }
endclass

module tb;
  ABC abc;

  initial begin
    abc = new;
    abc.randomize();
    $display ("data = %0b", abc.data);
  end
endmodule
Run Code Online (Sandbox Code Playgroud)

我希望输出为'b0001,但实际输出为 data = 1101”

Sil*_*602 5

您的问题是由您定义软约束的方式引起的soft data == 0

软约束只有在与其他(硬)约束不矛盾时才会得到满足。您的软约束说所有位都data[3:0]必须是0. 但是,在您的硬约束中,您说data[0]必须是1。因此,软约束不能被满足并被忽略。

您可以通过定义data == 0为硬约束来验证这一点:随机化将失败。

要获得您期望的行为,请尝试按如下方式定义类:

class ABC;
    rand bit [3:0] data;

    // This constraint is defined as "soft" 
    constraint c_data {
                        soft data[3:1] == 0;
                        data[0]        == 1;
                       }
endclass
Run Code Online (Sandbox Code Playgroud)