구글 안티그래비티 완전 분석 — 모델·요금제·CLI 총정리

🚀 구글 안티그래비티(Antigravity) 완전 분석 구글이 2025년 11월 Gemini 3와 함께 공개한 에이전트 퍼스트(agent-first) IDE 안티그래비티는 Claude·GPT·Gemini를 한 도구에서 골라 쓰는 멀티모델 코딩 환경이다. 이 글에서는 ① 지원 모델과 요금제별 사용량의 실체, ② 실사용자 평가, ③ 구글의 방향성, ④ Claude Code와의 비교·연계, ⑤ CLI( agy )로 직접 쓰는 법까지 다섯 갈래를 차례로 정리한다. 자료 간 충돌이 있는 지점은 한쪽으로 단정하지 않고 양쪽을 모두 살려 표기했다. 📅 기준 시점: 2026년 6월 · 프리뷰 단계 정보로 수치는 변동 가능 1. 안티그래비티란 무엇인가 — 기초 정리 안티그래비티는 2025년 7월 구글이 24억 달러 규모 라이선스 계약 으로 영입한 전 Windsurf 팀이 설계를 주도했다. VSCode를 포크한 위에 자율 에이전트 오케스트레이션 계층을 얹은 구조다. 2026년 5월 Google I/O에서 발표된 안티그래비티 2.0 은 데스크탑 앱과 함께 공식 CLI agy 를 처음 공개하며 기존 Gemini CLI의 공식 후계자 자리를 확정했다. 핵심 정체성은 단순 코드 자동완성이 아니라 병렬 에이전트 오케스트레이션 이다. 여러 에이전트가 동시에 — 하나는 API, 하나는 테스트, 또 하나는 프론트엔드 — 작업을 나눠 진행하고, 각 에이전트는 계획·테스트 결과·스크린샷·영상을 담은 Artifact 를 남긴다. "사람이 한 줄씩 승인"하는 방식이 아니라 "에이전트들이 일을 마치고 사람이 사후 검수"하는 모델이다. flowchart TD A([사용자 작업 지시]) --> B[에이전트 A API 구현] A --> C[에이전트 B 테스트 작성] A --> D[에이전트 C UI 생성] B --> E[Artifact 계획·결과·영상] C --> E D --> E...

SystemVerilog Interfaces Explained: From Basics to Advanced Usage

SystemVerilog Interfaces: Streamlining Your Hardware Design Connections

Have you ever found yourself wrestling with long, unwieldy module port lists in your hardware designs? Or perhaps you've spent frustrating hours debugging connectivity issues caused by subtle mismatches between module connections? If so, it's time to embrace SystemVerilog interfaces! Interfaces are a game-changer, simplifying how different parts of your design (and your testbench!) communicate. Think of them as smart, reusable bundles for signals, much like how you'd group related signals for a bus.

Why Bother with Interfaces? The Problem with Traditional Connections

In traditional Verilog, connecting modules means explicitly declaring every single signal as a port in each module that needs it. As designs grow in complexity, this approach quickly becomes cumbersome:

  • Repetitive Declarations: Common signals (like clock, reset, data bus, control signals) get declared over and over.
  • Maintenance Nightmares: Adding or removing a signal requires changing multiple module port lists. One missed connection can lead to hours of debugging.
  • Readability Suffers: Long port lists make it hard to quickly grasp what a module does or how it connects to others.
  • Error Prone: A simple typo or mismatch in a signal name or width across connected modules can cause hard-to-find bugs.

The Power of Encapsulation: Benefits of Interfaces

SystemVerilog interfaces solve these issues by bundling related signals, tasks, functions, and even assertions into a single, cohesive unit. Here’s why they are so beneficial:

  • Encapsulation: Grouping signals into a single interface simplifies connections and makes your design more modular.
  • Reduced Code Duplication: Declare your interface once, then instantiate it. No more repetitive port declarations!
  • Easier Maintenance: Need to change the protocol? Modify the interface definition, and all connected modules are updated automatically.
  • Improved Readability: Modules connect via a single, descriptive interface name, making your instantiations cleaner and easier to understand.
  • Enhanced Reusability: A well-designed interface can be easily reused across different modules and even different projects.
  • Direction Control (Modports): Define specific access rights and signal directions for different modules connecting to the same interface. This prevents misuse and enforces design intent.
  • Synchronous Logic (Clocking Blocks): Define clocking schemes directly within the interface, simplifying the handling of synchronous signals and avoiding race conditions.
  • Self-Contained Logic: Interfaces can contain parameters, tasks, and functions, making them intelligent communication channels.

Getting Started: Basic Interface Usage

Let's look at how to declare and use an interface.

1. Declaring an Interface

You define an interface using the interface keyword. Inside, you declare the signals that will form your communication bundle. You can also include a clocking block for synchronous signals.

// Define an interface for a simple data transfer
interface simple_bus (input bit clk);
  logic [7:0] data; // 8-bit data bus
  logic       valid; // Indicates data is valid
  logic       ready; // Indicates slave is ready to accept data

  // Clocking block for synchronous access
  clocking bus_cb @(posedge clk);
    output data, valid; // Signals driven by the master
    input  ready;      // Signal driven by the slave
  endclocking

endinterface

Here, clk is a port of the interface itself, often used by clocking blocks.

2. Connecting Interfaces to Modules

Modules can now connect using a single instance of this interface.

// A module that acts as a data source (master)
module data_source (simple_bus.bus_cb sb); // Connects using the 'bus_cb' modport
  task send_data(logic [7:0] tx_data);
    @(posedge sb.clk);
    sb.data = tx_data;
    sb.valid = 1;
    @(posedge sb.clk); // Wait for next clock edge
    sb.valid = 0;
  endtask
endmodule

// A module that acts as a data sink (slave)
module data_sink (simple_bus.bus_cb sb); // Connects using the 'bus_cb' modport
  logic [7:0] received_data;

  always @(posedge sb.clk) begin
    if (sb.valid && sb.ready) begin
      received_data = sb.data;
      $display("Time %0t: Received data = %h", $time, sb.data);
    end
  end
  // In a real design, 'ready' might depend on internal buffer status
  assign sb.ready = 1'b1; // Always ready for this example
endmodule

// Testbench to tie them together
module tb;
  bit clk;
  // Instantiate the interface
  simple_bus bus_if (.clk(clk));

  // Instantiate the modules and connect them to the interface
  data_source src (.sb(bus_if));
  data_sink     snk (.sb(bus_if));

  // Clock generation
  initial begin
    clk = 0;
    forever #5 clk = ~clk; // 10ns clock period
  end

  // Stimulus and test flow
  initial begin
    #20; // Wait for clock to stabilize
    src.send_data(8'hA5);
    #20;
    src.send_data(8'h5A);
    #20;
    $finish;
  end
endmodule

Notice how data_source and data_sink connect to the interface bus_if using only one port each, and access signals like bus_if.data or bus_if.valid.

Advanced Features: Modports and Virtual Interfaces

Modports: Defining Access Views

Modports allow you to define different "views" of an interface for various connecting modules. This is crucial for specifying signal directions (input, output, inout) from the perspective of each connected component, ensuring proper behavior and preventing accidental misuse.

In the example above, simple_bus.bus_cb is a modport. The modport definition explicitly states that data and valid are outputs (driven by the master) and ready is an input (driven by the slave). If you tried to drive ready from the data_source module, you would get a compilation error.

Virtual Interfaces: Connecting Classes to Interfaces

For advanced verification environments, especially those using class-based testbenches (like UVM), you'll frequently use virtual interfaces. A virtual interface is essentially a pointer or handle to an actual interface instance. It allows your testbench classes, which are typically not aware of the design's hierarchy, to access and control the signals of a specific interface instance.

class driver;
  virtual simple_bus vif; // Declare a virtual interface handle

  function new(virtual simple_bus intf_handle);
    this.vif = intf_handle; // Assign the actual interface instance
  endfunction

  task send(logic [7:0] data_val);
    @(posedge vif.clk);
    vif.data = data_val;
    vif.valid = 1;
    @(posedge vif.clk); // Wait for next clock
    vif.valid = 0;
  endtask
endclass

module tb_top;
  bit clk;
  simple_bus bus_inst (.clk(clk)); // Actual interface instance
  driver drv;

  initial begin
    clk = 0;
    forever #5 clk = ~clk;
  end

  initial begin
    drv = new(bus_inst); // Pass the interface instance to the driver class
    #20;
    drv.send(8'hCC);
    #20;
    $finish;
  end
endmodule

Virtual interfaces are essential for decoupling your testbench environment from the specific instance paths in your design, leading to more flexible and reusable verification IP.

Conclusion

SystemVerilog interfaces are a fundamental feature for modern hardware design and verification. They promote modularity, reusability, and maintainability by abstracting away complex signal connections, reducing errors, and improving code clarity. By mastering interfaces, modports, and virtual interfaces, you can build more robust, scalable, and easier-to-manage digital systems.

📚 참고 자료

댓글

이 블로그의 인기 게시물

Vim 9.2 릴리즈 총정리: 더 빠르고 강력해진 텍스트 편집의 제왕

폐쇄망 SoC 설계자를 위한 가볍고 빠른 Vim 최적화 가이드

에이전트 시대를 위한 터미널 cmux 가이드: 설치부터 AI 활용까지