puis-je définir les contraintes pour une variable une fois et générer quelques fois dans specman?
-
19-08-2019 - |
Question
J'ai une variable que je veux générer plusieurs fois dans la même fonction, chaque fois avec le même ensemble de contraintes. Puis-je définir les contraintes une fois et le gen
juste plusieurs fois? C'est-à-dire, au lieu de ceci:
var a:uint;
gen a keeping {it in [100..120];};
// some code that uses a
.
.
.
gen a keeping {it in [100..120];};
// some code that uses a
.
.
.
gen a keeping {it in [100..120];};
// some code that uses a
// etc...
J'aimerais faire ceci:
var a:uint;
keep a in [100..120];
.
.
.
gen a;
// some code that uses a
.
.
.
gen a;
// some code that uses a
.
.
.
gen a;
// some code that uses a
// etc...
Ainsi, si je veux changer les contraintes de a
, je ne dois le faire qu’une seule fois.
La solution
Vous pouvez le faire en faisant de la variable un membre d'instance de l'objet englobant.
a : uint;
keep a in [100..120];
my_method()@qualified_clk_rise_e is {
gen a;
...
gen a;
...
gen a;
};
Cette implémentation n'est pas thread-safe si plusieurs my_method () s'exécutent simultanément sur le même objet. Vous pouvez le rendre [specman] thread-safe en affectant le 'a' généré à un 'my_a 'dans le cadre de la méthode:
var my_a : uint;
gen a;
my_a = a;
Ou vous pouvez simplement écrire une méthode pour générer 'a':
gen_a(): uint is {
gen result keeping { it in [100..120] };
};
my_method()@qualified_clock_rise_e is {
var a : uint;
...
a = gen_a();
...
a = gen_a();
...
a = gen_a();
...
};