我建立了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 /驱动程序)。
答案 0 :(得分:0)
仅在测试开始后生成序列,因此在此时将代理设置为ACTIVE为时已晚。
将此约束放在层次结构中的某个更高级别。例如 - 在包含此代理的env中
答案 1 :(得分:0)
您需要区分在模拟开始时生成的单元层次结构和结构。后者可以随时动态生成。 因此,例如在模拟中稍后生成的序列不能更改单元层次结构。这样做也是不好的风格。