Ошибка при использовании 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 последовательность движется правильно.

Есть ли способ решить эту проблему?

0 ответов

Другие вопросы по тегам