Specman - 虽然不应该创建 BFM

Specman - BFM is created though it shouldn't

我的 tx 代理中有一个 BFM(没有序列驱动程序)。

extend uart_tx_agent_u{
   uart_tx_monitor : TX uart_monitor_u is instance;
   uart_tx_scb: uart_tx_scoreboard_u is instance;
   when ACTIVE uart_tx_agent_u {
      uart_bfm : uart_tx_bfm_u is instance;
   };
};

当我 运行 测试时(我没有更改 active_passive 字段)我可以看到 uart_bfm 已创建(根据打印的消息)。

如果bfm被实例化,那一定是uart_tx_agent_u是ACTIVE。

当您说您不更改它时 - 也许它是随机设置为活动的?

测试开始后正在生成序列结构。并且只有在有驱动程序时才会生成序列。并且仅当代理处于活动状态时才会实例化驱动程序。 环境拓扑应该自上而下约束,而不是从包含在其中的结构中约束单元

如果你知道你想让agent成为ACTIVE,那么就约束它-

extend rx_uart_agent_u {
    keep active_passive == TRUE;
};

或来自其父级

extend env {
    keep me.rx_agent.active_passive == TRUE;
};

您确定要将约束从测试更改为测试吗?代理要么是主动的并向 DUT 发送数据,要么是被动的并且只收集从 DUT 发送的数据。

人们通常做的是将agent定义为ACTIVE,这样它就有sequence driver和BFM。

在测试文件中,您通过为该代理定义序列来定义测试场景。

因此在您不想从该代理向 DUT 发送任何数据的测试中,将序列设置为不执行任何操作 -

extend MAIN my_seq {
    body() @drive.clock is only {
        // do nothing, this agent should not send data in this test
    };
};

如果你真的想改变环境拓扑,并且在一些测试中代理是被动的,在一些是主动的,你可以在测试文件中通过约束代理来做到这一点。

而且这个约束必须在pre-run代。 通过测试 - 代理要么处于活动状态,要么不处于活动状态。这在 运行 期间无法更改。你不能说 "i start the test with a PASSIVE agent, but during the test i want to make it ACTIVE"。