단일 Sequencer는 바이올린 연주자 한 명과 같습니다. 자기 악기(AXI 트랜잭션)만 연주할 줄 압니다.
하지만 실제 칩에는 AXI 버스, APB 버스, I2C 통신, Interrupt 신호 등 수십 개의 에이전트(Agent)가 동시에 돌아갑니다.
중앙 통제 (Centralized Control): "AXI가 Write를 하는 동안, Interrupt 에이전트가 에러 신호를 띄워라"라고 명령하려면 누군가 이 둘을 동시에 통제해야 합니다.
포인터 보관소: Virtual Sequencer는 스스로 데이터를 만들지 않는 대신, 이 수많은 물리적 Sequencer들의 핸들(Pointer/Handle)과 RAL 모델을 한 손에 쥐고 있는 중앙 사령탑 역할을 합니다.
일반 Sequence는 물리적인 0과 1의 데이터 패킷(uvm_sequence_item)을 만들어내는 단순 반복 작업 지시서입니다.
반면 Virtual Sequence는 데이터를 직접 만들지 않고, "어떤 시나리오를 어떤 순서로 실행할지"를 제어하는 상위 계층의 시나리오 지시서입니다.
복잡한 동기화 (Complex Synchronization): 에러를 검증할 때, AXI Sequence를 실행함과 동시에(fork ... join 사용) 엉뚱한 리셋(Reset) Sequence를 날려버리는 등 교차 에이전트(Cross-Agent) 시나리오를 짤 수 있습니다.
재사용성 (Reusability): Virtual Sequence 하나만 잘 짜두면, 하위 블록(Block-level)에서 썼던 시퀀스들을 그대로 조립해서 칩 전체(Top-level) 검증에 그대로 재사용할 수 있습니다.
💡 왜 이름에 'Virtual(가상)'이 붙었을까?
물리적인 핀(Pin)과 연결된 드라이버(Driver)로 데이터를 직접 쏘지 않기 때문입니다. 자신만의 uvm_sequence_item이 없으며, 오직 하위 시퀀스들을 호출(Start)하기만 하는 가상의 존재이기 때문에 Virtual이라는 이름이 붙었습니다.
A Virtual Sequencer acts as a centralized controller that holds handles (pointers) to multiple physical sub-sequencers across different agents." (가상 시퀀서는 서로 다른 에이전트에 있는 여러 물리적 하위 시퀀서에 대한 핸들(포인터)을 보유하는 중앙 컨트롤러 역할을 합니다.)
"We use a Virtual Sequence to orchestrate complex test scenarios and synchronize traffic across multiple interfaces, such as driving AXI traffic while simultaneously triggering interrupts." (가상 시퀀스를 사용하여 복잡한 테스트 시나리오를 오케스트레이션하고 여러 인터페이스 간의 트래픽을 동기화합니다. 예를 들어 AXI 트래픽을 구동하는 동시에 인터럽트를 트리거하는 등입니다.)
"It is called 'virtual' because it does not generate physical sequence items itself; instead, it delegates the generation to the physical sequencers." (스스로 물리적 시퀀스 아이템을 생성하지 않고 물리적 시퀀서에 생성을 위임하기 때문에 '가상'이라고 불립니다.)