Ошибка при использовании body() также использует тестовый поток Specman
Я впервые использую функцию Testflow в Specman.
my_tb_env_testflow.e
:
extend MAIN MAIN_TEST my_tb_env_vseq { // virtual sequence
pre_body() @driver.clock is {
driver.raise_objection(TEST_DONE);
};
body() @driver.clock is first {
// Start issuing transaction only after 500us
wait delay(500 us);
};
post_body() @driver.clock is also {
driver.drop_objection(TEST_DONE);
};
};
// and more lines of code extending the other testflow phases
my_tb_env_seq_lib.e
:
extend MAIN MAIN_TEST my_tb_env_vseq { // virtual seq
!reg_access : vr_ad_sequence;
body() @driver.clock is also {
force '~/tb_top_env/my_signal' = 1;
// some do reg_access vr_ad sequences
};
};
my_test.e
:
extend MAIN MAIN_TEST my_tb_env_vseq { // virtual seq
!my_seq : MY_SEQ vr_enet_seq; // a simple ethernet packet
body() @driver.clock is also {
do my_seq keeping {
.driver == driver.enet_driver;
.packet_kind == ETHERNET_802_3;
};
};
};
Я правильно вижу последовательность своих локальных сетей, когда я расширяю MAIN MAIN_TEST
"s body()
в is only
в файле my_test.e
, В противном случае я бы увидел эту ошибку противоречия:
Error: Contradiction at time 500102920000, in a context of the type my_tb_env_vseq: During the generation in: my_tb_env_vseq-@156 sequence my_tb_env_vseq using testflow = TRUE; at line 18 in <some_location>/my_tb_env_testflow.e No set of values exists for: kind (my_tb_env_vseq_kind, initial range: [MAIN..RANDOM]) that obey the constraints:keep sequence.kind not in [MAIN..RANDOM] at line 198 in @tf_util_seq , expanded at line 18 in @my_tb_env_testflow
Из сообщения об ошибке выше, это строка 18 my_tb_env_testflow.e
:
sequence my_tb_env_vseq using testflow = TRUE;
И это строка 198 tf_util_seq.e
, самая первая строка этого макроопределения:
define <testflow_sequence'statement> "sequence <name> using testflow[ ]=[ ](<STATUS>TRUE|FALSE)[[ ],[ ]<any>]" as computed {
result = appendf("sequence %s%s",<name>,(str_empty(<any>)?"":append(" using ",<any>))); // factor out 'testflow' option
if <STATUS> == "FALSE" {
return result;
};
var options: list of string;
if <any> != "" {
options = str_split(<any>, "/ ?, ?/");
};
var created_driver: string = append(<name>, "_driver");
var created_kind: string = append(<name>, "_kind");
var the_item: string;
for each (option) in options do {
compute option !~ "/^(\w+) ?= ?(.*)$/";
if $1 == "item" then {
the_item = $2;
} else if $1 == "created_driver" then {
created_driver = $2;
} else if $1 == "created_kind" then {
created_kind = $2;
};
};
result = appendf("{%s; sequence_testflow %s using created_driver = %s, created_kind = %s;}",result,<name>,created_driver,created_kind);
};
Но если я изменю my_test.e
"s body()
расширение до is only
Я бы не увидел ошибку противоречия выше, и я увижу в форме волны, что my_seq
последовательность движется правильно.
Есть ли способ решить эту проблему?