0

我正在尝试了解 vr_ad 中的后门访问功能。

似乎有两种不同的掩码:一种是 backdoor_mask 字段,另一种是 get_bd_mask()。

两者有什么区别?我应该使用哪一个?

4

1 回答 1

1

在执行后门访问时,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 的列表。您无法访问的任何位 - 都应该被屏蔽掉。

于 2015-07-06T07:26:52.923 回答