我正在尝试了解 vr_ad 中的后门访问功能。
似乎有两种不同的掩码:一种是 backdoor_mask 字段,另一种是 get_bd_mask()。
两者有什么区别?我应该使用哪一个?
在执行后门访问时,vr_ad 定序器使用写入/读取到 DUT 的值更新影子模型。(提醒——在前门访问中,调用 update() 是监视器的责任)。访问后影子模型的确切值考虑了——这个字段是否被访问过?(RTL 中的寄存器被读/写)
- 这个字段是否可读/可写?两个“掩码”指导影子模型的更新方式。
掩码后门:
该字段控制寄存器的读写掩码是否也应应用于后门访问。如果 mask_backdoor 为 FALSE,则在后门访问后更新影子模型时忽略寄存器的读/写掩码。这意味着,例如,我们假设只读字段可以在后门访问中写入。如果您希望在后门访问中考虑读/写掩码(与在前门访问中相同) - 将 mask_backdoor 设置为 TRUE。(默认为 FALSE。读/写掩码被忽略)
get_bd_mask() :
后门访问由 vr_ad 执行,通过访问 set_backdoor_path() 或 set_field_backdoor_path() 定义的路径。
在执行后门写入时,vr_ad 仅将路径已设置的字段写入 RTL(自然而然……)。所以,当它去更新影子模型时——它应该知道哪些字段被写入,因此应该在影子模型中更新,而哪些——没有。
例如——假设这个寄存器定义
reg_def EX_R1 {
reg_fld fld_0 : uint(bits : 8);
reg_fld fld_1 : uint(bits : 8);
set_static_info() is also {
set_field_backdoor_path("fld_1" ,"top.ex_r1[7:0]");
};
};
当您对该寄存器发出后门写入时,vr_ad 将写入 top.ex_r1[7:0]。然后它将更新影子模型,但它只需要更新 fld_1,而不是 fld_0。
在这种情况下,对于这个寄存器,get_bd_mask() 返回 {0x0, 0xf} 表示第一个字段被屏蔽(0),不被更新。
通常,后门访问由 vr_ad 执行,因此您不应对此方法执行任何操作。但是——如果你重写了 *_reg_backdoor 方法的定义——你也应该扩展 get_bd_mask()。如果在你的实现中你访问所有的字段——那么这个方法应该返回一个 1 的列表。您无法访问的任何位 - 都应该被屏蔽掉。