Specman - 如何控制被动/主动代理

时间:2018-03-08 09:26:45

标签: verification uvm specman

我建立了uart验证环境。 我有uart_tx_agent和uart_rx_agent。 uart_tx_agent有虚拟bfm控制cts端口并且没有驱动程序。 uart_rx_agent有bfm和驱动程序,它有uart_sequence。

uart_env.e: 在uart_env中,我将代理发起如下

unit uart_env_u like uvm_env {
   uart_tx_agent: uart_tx_agent_u is instance;
   uart_rx_agent: uart_rx_agent_u is instance;
};

unit uart_tx_agent_u like uvm_agent {
   keep soft active_passive == PASSIVE;
};

unit uart_rx_agent_u like uvm_agent {
   keep soft active_passive == PASSIVE;   
};

uart_tx_agent.e:

extend uart_rx_agent_u{
   uart_rx_monitor : RX uart_monitor_u is instance;
   when ACTIVE uart_rx_agent_u
   {
      uart_bfm : uart_rx_bfm_u is instance;
      driver: uart_driver_u is instance;
   };   
};

unit uart_rx_bfm_u like uvm_bfm{
};

sequence uart_sequence using 
   item = uart_frame_s,
   created_driver = uart_driver_u;

uart_tx_agent.e:

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;
   };
};

unit uart_tx_bfm_u like uvm_bfm{
};

在tx_test中,我只有一个主序列 - vr_ad_sequence,我执行以下操作:

extend MAIN vr_ad_sequence {
   .....
   .....  
   keep uart_env.uart_tx_agent.active_passive == ACTIVE;
   ...
}; 

在rx_test中,我有两个MAIN序列:

extend MAIN uart_sequence {
   ....
   ....
   body() @driver.clock is only {
   };
};

extend MAIN vr_ad_sequence {
   .....
   .....  
   keep uart_env.uart_tx_agent.active_passive == ACTIVE;
   ...
}; 

但它确实像我预期的那样有效。 在两个测试中,代理都保持被动(没有bfm /驱动程序)。

2 个答案:

答案 0 :(得分:0)

仅在测试开始后生成序列,因此在此时将代理设置为ACTIVE为时已晚。

将此约束放在层次结构中的某个更高级别。例如 - 在包含此代理的env中

答案 1 :(得分:0)

您需要区分在模拟开始时生成的单元层次结构和结构。后者可以随时动态生成。 因此,例如在模拟中稍后生成的序列不能更改单元层次结构。这样做也是不好的风格。