如何从vr_ad_sequence

时间:2016-12-12 08:03:05

标签: uvm specman e

我有一个寄存器读取序列,如下所示:

extend vr_ad_sequence_kind: [READ_REG];
extend READ_REG vr_ad_sequence {
    // register to read
    reg_kind : vr_ad_reg_kind;
    !reg : vr_ad_reg;

    // more fields no longer shown here

    body() @driver.clock is {
        var reg_item : vr_ad_reg; // reg_item gets a value from a
                                  // method that returns the correct
                                  // register instance from the addr_map,
                                  // which I no longer want to show here

        reg = new vr_ad_reg with { .kind = reg_kind; };      
        read_reg { .static_item == reg_item; } reg;  
    };   
};

现在,我有一个虚拟序列执行上面的vr_ad_sequence:

extend MAIN MAIN_TEST sample_vseq {
    !reg_read   : READ_REG vr_ad_sequence;

    body() @driver.clock is first {
        do reg_read keeping {
            .driver == driver.reg_driver;
            .reg_kind == MY_REGISTER;
        };

        // how to get the value of MY_REGISTER.MY_FIELD from
        // the reg_read sequence above?
    };
};

我的主要目标是读取上例中MY_FIELD的特定寄存器位字段的值。有没有办法在不修改原始READ_REG vr_ad_sequence中的任何内容的情况下执行此操作?如果无法提供帮助,如何让READ_REG vr_ad_sequence将读取值返回给调用sample_vseq

非常感谢。

1 个答案:

答案 0 :(得分:1)

要在读取后获取寄存器值,首先必须确保读取在总线上完成。因此要么你的BFM阻塞(通常不是阻塞),要么在序列中添加一个标志,告诉我们是否已收到响应(可以从BFM /驱动程序设置)。 接下来,您可以从vr_ad_map实例获取值。 例如。

body() @driver.clock is first {
    do reg_read keeping {
        .driver == driver.reg_driver;
        .reg_kind == MY_REGISTER;
    };
    // Wait for read response
    sync true(reg_read != NULL and reg_read.done);
    // Access shadow register through pointer to vr_ad_map instance
    print addr_map.get_register_by_kind(MY_REGISTER).as_a(MY_REGISTER vr_ad_reg).MY_FIELD;
};

(我现在无法检查语法)

相关问题