首页 > 解决方案 > 软约束不适用于位变量

问题描述

我有一个变量数据,我希望最后一位为 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

我希望输出是'b0001,但实际输出是data = 1101”</p>

标签: constraintssystem-verilog

解决方案


您的问题是由您定义软约束的方式引起的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

推荐阅读