Я пытаюсь рандомизировать 3 разные переменные в системном Verilog, но циклически. Я имею в виду, что у меня есть следующие 3 переменные
rand int a;
rand int b;
rand int c;
constraint c_a{
a inside {1,2};
}
constraint c_b{
b inside {1,2,3,4,5,6};
}
constraint c_c{
c inside {1,2,3}
}
С указанными выше ограничениями существует всего 36 комбинаций всех трех переменных (2x6x3).
Но если мы запустим цикл из 36, вот так:
repeat(36) begin
this.randomize(a,b,c);
$display("%d %d %d", a,b,c);
end
Мы не выберем все возможные комбинации, так как некоторые комбинации могут повторяться. Следовательно, я ищу способ поразить все эти комбинации, выполнив цикл ровно 36 раз.
Я написал для этого метод грубой силы, объявив другую переменную rand для представления каждой комбинации и используя randc следующим образом:
int a;
int b;
int c;
randc int k;
constraint c_k{
k inside {[1:36]};
}
repeat(36) begin
this.randomize(k);
// randomizing variable 'a' to one of the 2 values.
if(k<9)
a = 1;
else
a = 2;
// randomizing variable 'b' to one of the 6 values.
case(k)
1,2,3,19,20,21 : b = 1;
4,5,6,22,23,24 : b = 2;
7,8,9,25,26,27 : b = 3;
//
// finishing the sequence
//
endcase
case(k)
// similar case statement for the final variable
endcase
$display("%d, %d, %d", a,b,c);
end
Вышеупомянутый способ работает нормально, но мне он показался своего рода беспокойным способом (который также не может применяться для больших комбинаций) и, следовательно, мне было интересно, есть ли более элегантный метод для этого.
Спасибо за помощь.
1 ответ
Что вы можете сделать, так это объединить ваши переменные в упакованную структуру и сделать ее переменной randc .
module top;
class A;
typedef struct packed {
bit [1:0] a;
bit [2:0] b;
bit [1:0] c;
} abc_t;
randc abc_t k;
constraint c_a{
k.a inside {1,2};
}
constraint c_b{
k.b inside {1,2,3,4,5,6};
}
constraint c_c{
k.c inside {1,2,3};
}
endclass
A h = new;
initial
repeat(40) begin
h.randomize();
$display("%0p",h.k);
end
endmodule
Имейте в виду, что общее количество битов, разрешенных для переменной randc
, может быть ограничено симулятором.
Похожие вопросы
Новые вопросы
constraints
Ограничение - это условие, которое должно выполняться в данном контексте. Ограничения, как правило, используются в базах данных и языках программирования для выявления ошибок, обеспечения согласованности, точности данных и обеспечения соблюдения бизнес-требований.