【发布时间】: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,如何获取特定寄存器位字段的值,如上面的两个代码块所示。