Hardware Verification · MCP Tool Usage

LLM이 UVM 검증 시스템을 자연어로 조작하는 경우

이 페이지는 가상의 UVM System Manager에 MCP를 붙여, regression 조회·log 분석·coverage hole 확인·SVA 후보 생성을 LLM이 tool call로 수행하는 설명용 시나리오입니다.

1. 가상의 상황: UVM System Manager

회사 내부에 UVM System Manager라는 검증 관리 툴이 있다고 가정합니다. 이 툴은 UVM test 목록 조회, 특정 test 실행, regression 실행, log 분석, assertion failure 추출, coverage report 조회, waveform signal timeline 추출, Jira ticket 생성까지 담당합니다.

기존 방식

검증 엔지니어가 명령어, 옵션, run id, log path, coverage DB 구조를 직접 알고 실행해야 합니다.

uvmctl list-tests --block nand_ctrl
uvmctl run --test nand_read_burst_test --seed 12345
uvmctl log --run-id RUN_20260429_001
uvmctl coverage --block nand_ctrl --report latest
uvmctl wave --run-id RUN_20260429_001 --signals cmd_valid,cmd_ready,data_valid

MCP 적용 후

검증 엔지니어는 자연어로 목표를 말하고, LLM이 필요한 MCP tool을 순서대로 호출해 결과를 요약합니다.

최근 nand_read_path regression 실패 원인 분석하고, coverage hole과 필요한 SVA 후보까지 정리해줘.

2. MCP를 붙이면 구조가 어떻게 바뀌는가?

핵심은 LLM이 UVM System Manager의 내부 API를 직접 아는 것이 아니라, MCP Server가 UVM System Manager를 감싸서 LLM이 호출 가능한 tool로 노출한다는 점입니다.

검증 엔지니어 → 자연어 요청 OpenCode / AI IDE / LLM Host LLM이 필요한 tool 호출 판단 MCP Client → JSON-RPC UVM System Manager MCP Server 기존 UVM Manager API / CLI / DB / Log / Coverage Tool 결과 반환 → LLM이 자연어로 요약
발표용 한 문장: MCP는 LLM이 검증 툴의 명령어를 외우게 하는 것이 아니라, 검증 툴의 기능을 표준 tool interface로 노출하는 연결 계층입니다.

3. MCP Server가 제공하는 Tool 예시

가상의 uvm-manager-mcp-server는 아래 기능을 tool로 노출할 수 있습니다.

list_uvm_tests(block_name) run_uvm_test(test_name, seed, plusargs) get_regression_failures(regression_id) get_uvm_error_summary(run_id) get_assertion_failures(run_id) get_coverage_holes(block_name, report_id) get_signal_timeline(run_id, signal_list) suggest_sva_candidates(module_name, failure_summary) create_jira_ticket(title, description)

LLM은 내부 CLI syntax를 외우는 것이 아니라, tool 이름·설명·입력 schema를 보고 어떤 기능을 호출할지 결정합니다.

4. 사용자의 자연어 요청 예시

nand_read_path 쪽 regression에서 실패한 테스트를 찾아서, 가장 먼저 깨진 원인을 요약하고, coverage hole도 같이 확인해서, 추가하면 좋을 SVA 후보를 정리해줘.

이 한 문장 안에는 여러 개의 검증 작업이 들어 있습니다.

  1. 최신 regression 찾기
  2. 실패한 test 찾기
  3. 실패 log 분석
  4. UVM_ERROR / UVM_FATAL 확인
  5. assertion failure 확인
  6. coverage hole 확인
  7. 원인 후보 정리
  8. SVA 후보 제안

5. 내부적으로 일어나는 일

1) tool 목록 조회

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/list",
  "params": {}
}

MCP Server는 자신이 제공하는 tool 목록과 inputSchema를 반환합니다.

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "name": "get_regression_failures",
        "description": "Get failed UVM tests from a regression run",
        "inputSchema": {
          "type": "object",
          "properties": {
            "block_name": { "type": "string" },
            "regression_id": { "type": "string" }
          },
          "required": ["block_name"]
        }
      },
      {
        "name": "get_uvm_error_summary",
        "description": "Summarize UVM_ERROR and UVM_FATAL messages",
        "inputSchema": {
          "type": "object",
          "properties": { "run_id": { "type": "string" } },
          "required": ["run_id"]
        }
      }
    ]
  }
}

2) 실패 regression 조회

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_regression_failures",
    "arguments": {
      "block_name": "nand_read_path",
      "regression_id": "latest"
    }
  }
}

MCP Server 내부에서는 기존 CLI나 API를 호출할 수 있습니다.

uvmctl regression failures --block nand_read_path --id latest

응답 예시는 이렇게 돌아옵니다.

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Failed tests:\n1. nand_read_burst_test, run_id=RUN_1042, seed=98341\n2. nand_read_ecc_retry_test, run_id=RUN_1047, seed=19283"
      }
    ],
    "isError": false
  }
}

3) log, assertion, coverage를 순서대로 조회

UVM error summary

tools/call:
  get_uvm_error_summary(
    run_id="RUN_1042"
  )

첫 UVM_ERROR와 scoreboard mismatch를 요약합니다.

Assertion failure

tools/call:
  get_assertion_failures(
    run_id="RUN_1042"
  )

깨진 assertion 이름과 의미를 추출합니다.

Coverage holes

tools/call:
  get_coverage_holes(
    block_name="nand_read_path",
    report_id="latest"
  )

미도달 scenario와 corner case를 정리합니다.

6. 사용자가 받는 최종 답변

사용자는 JSON-RPC, CLI 명령어, log path를 직접 보지 않습니다. LLM은 MCP tool 결과를 모아 사람이 읽기 좋은 검증 리포트로 정리합니다.

nand_read_path 최신 regression에서 가장 먼저 실패한 test는
nand_read_burst_test입니다.

실패 run_id는 RUN_1042이고 seed는 98341입니다.

가장 먼저 발생한 문제는 read command handshake가 완료되기 전에
data_valid가 먼저 assert된 것입니다.

즉, read command가 cmd_valid && cmd_ready로 accept되기 전에
read data path가 먼저 동작한 것으로 보입니다.

관련 assertion failure:
  a_read_data_after_cmd_accept

coverage hole:
  read command backpressure scenario가 충분히 cover되지 않았습니다.
  특히 cmd_valid가 유지되고 cmd_ready가 늦게 오는 상황에서
  data_valid가 premature하게 올라오는 corner case가 남아 있습니다.

7. SVA 후보까지 제안할 수 있다

MCP tool이 log, assertion, coverage 정보를 모아주면 LLM은 그 근거를 바탕으로 SVA 후보를 제안할 수 있습니다.

  • read command accept 전 data_valid 금지
  • cmd_valid && !cmd_ready 동안 command payload stable 확인
  • read command accept 후 정해진 latency window 안에서만 data_valid 허용
  • reset 직후 pending read transaction이 없을 때 data_valid 금지
property p_no_data_valid_before_read_cmd_accept;
  @(posedge clk) disable iff (!rst_n)
    data_valid |-> read_cmd_accepted;
endproperty

a_no_data_valid_before_read_cmd_accept:
  assert property (p_no_data_valid_before_read_cmd_accept)
  else $error("data_valid asserted before read command was accepted");

pending read 상태를 명시적으로 관리하면 더 엄밀한 형태로도 쓸 수 있습니다.

logic read_cmd_pending;

always_ff @(posedge clk or negedge rst_n) begin
  if (!rst_n) begin
    read_cmd_pending <= 1'b0;
  end else begin
    if (cmd_valid && cmd_ready && cmd_type == READ)
      read_cmd_pending <= 1'b1;
    else if (data_valid && data_ready)
      read_cmd_pending <= 1'b0;
  end
end

property p_data_valid_requires_pending_read;
  @(posedge clk) disable iff (!rst_n)
    data_valid |-> read_cmd_pending;
endproperty

a_data_valid_requires_pending_read:
  assert property (p_data_valid_requires_pending_read)
  else $error("data_valid asserted without pending read command");

8. MCP가 아닌 것과 MCP인 것

MCP가 아닌 것

  • LLM 자체가 아닙니다.
  • UVM tool 자체가 아닙니다.
  • simulation engine이나 coverage tool이 아닙니다.
  • 사내 API를 자동으로 모두 아는 마법 계층이 아닙니다.

MCP인 것

  • LLM Host와 외부 tool 사이의 표준 연결 방식입니다.
  • tool 이름, 설명, 입력값, 결과 형식을 표준화합니다.
  • 자연어 요청을 실제 tool 호출로 연결하게 해줍니다.
  • MCP Server는 기존 API/CLI/DB/파일 시스템을 감싸는 adapter입니다.

9. 하드웨어 검증 관점에서의 비유

하드웨어 검증자에게는 아래 비유가 가장 직관적입니다.

UVM sequence가 DUT에 직접 아무 신호나 막 넣는 것이 아니라, driver와 interface를 통해 정해진 protocol로 transaction을 전달합니다. 마찬가지로 LLM도 외부 tool을 직접 아무렇게나 실행하는 것이 아니라, MCP라는 정해진 protocol을 통해 tool call을 전달합니다.
검증 세계AI tool 세계
UVM driver / interfacetestbench와 DUT 사이의 protocol adapter
MCP server / clientLLM과 external tool 사이의 protocol adapter

10. 한 장짜리 설명 요약

예전 방식

  1. 검증 엔지니어가 직접 명령어 실행
  2. log 파일 위치 확인
  3. grep으로 UVM_ERROR 검색
  4. coverage report 열기
  5. waveform 확인
  6. 원인 분석
  7. SVA 작성

MCP 적용 방식

  1. 검증 엔지니어가 자연어로 요청
  2. LLM이 필요한 tool 판단
  3. MCP Client가 MCP Server에 JSON-RPC 요청
  4. MCP Server가 UVM System Manager 호출
  5. log / coverage / waveform 결과 수집
  6. LLM이 원인과 다음 액션을 자연어로 정리
결론: 이 예제에서 MCP는 LLM이 UVM 검증 시스템을 자연어로 다룰 수 있게 해주는 표준 adapter 계층입니다.