У меня есть переменные данные, где я хочу, чтобы последний бит был равен 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», но фактический вывод — это данные = 1101».
Ваша проблема вызвана тем, как вы определяете мягкое ограничение 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