【问题标题】:How to get the read data from a vr_ad_sequence如何从 vr_ad_sequence 获取读取数据
【发布时间】:2016-12-12 08:03:04
【问题描述】:

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

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

非常感谢。

【问题讨论】:

  • 您确定您的 BFM 正在使用它读取的数据更新您的总线事务吗?您需要在 vr_ad -> sequence_driver -> BFM 链中设置适当的基础架构。
  • @TudorTimi:是的,实际上在执行READ_REG 序列之后,vr_ad 执行compare_and_update_body() 得到正确的总线值,正如我从这条消息中看到的那样——请请参阅上面的主要问题。
  • 嗨,序列 reg 字段确实预计会通过 read_reg 操作进行更改。而要放入寄存器的值是vr_ad_execute_op()方法(BFM驱动的方法)返回的值。可能会发生 vr_ad_execute_op 返回一个值(在您的示例中为 0x4)和监视器,调用 compare_and_update - 调用另一个数据(0)。我建议在 *.vr_ad_execute_op 处设置一个断点,并查看它返回的值。
  • @user3467290:我简化了主要问题,因为它看起来很混乱。我的问题不是 vr_ad_execute_op() 和 compare_and_update() 返回的不同读取值。我只是想知道如果我的READ_REG vr_ad_sequence 是来自sample_vseq 虚拟序列的done,如何获取特定寄存器位字段的值,如上面的两个代码块所示。

标签: uvm specman e


【解决方案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;
};

(我现在无法检查语法)

【讨论】:

  • 这解决了这个问题。正确的语法是:print get_enclosing_unit(my_env_u).addr_map.get_reg_by_kind(MY_REGISTER).as_a(MY_REGISTER vr_ad_reg).MY_FIELD;,因为我处于虚拟序列中。这条线虽然有点长,但它达到了它的目的。非常感谢!
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2011-01-26
  • 2019-02-21
相关资源
最近更新 更多