저장된 RTL을 시뮬레이션하고 결과 보관하기
제한된 RTL 시뮬레이션 요청을 저장하고, 허용 검사와 사전 검사를 거쳐 실행한 다음, 프로젝트에서 결과를 저장하고 목록을 확인하고 다시 엽니다.
Linux에서 Altifigence CLI 0.1.9를 사용해 내장 RTL 엔진으로 저장된 SystemVerilog를 시뮬레이션하세요. 시뮬레이션 명령 admit, preflight, run은 각각 프로젝트 안의 요청 파일 하나를 읽고 JSON을 출력합니다. 네 가지 상태를 지원하는 다중 클럭 시뮬레이션 계약을 읽으려면 alti rtl simulate-v2 capabilities를 실행하세요.
시뮬레이션 요청 저장하기
프로젝트 폴더를 만들고 그 안에 이 요청을 sim.json으로 저장하세요. 최상위 키는 정확히 이 네 개만 사용하세요. 요청에는 SystemVerilog 소스, 클럭 포트와 주기, 선택적 리셋, 레지스터 초기값, 사이클당 입력 벡터 하나가 들어 있습니다.
mkdir -p "$HOME/alti-projects/demo-project"
PROJECT="$(cd "$HOME/alti-projects/demo-project" && pwd -P)"{
"schema": "altifigence.rtl.operation-request.v1",
"version": 1,
"operationId": "altifigence.rtl.simulate.v1",
"request": {
"top": "top",
"sources": [
{
"path": "workspace/top.sv",
"source": "module top(\n input logic clk,\n input logic rst,\n input logic d,\n output logic q\n);\n always_ff @(posedge clk or posedge rst)\n if (rst) q <= 1'b0;\n else q <= d;\nendmodule\n"
}
],
"clock": {
"port": "clk",
"periodPs": 1000
},
"initialRegisterValues": [
false
],
"cycles": [
{
"inputs": {
"d": [
false
]
}
},
{
"inputs": {
"d": [
true
]
}
},
{
"inputs": {
"d": [
true
]
}
},
{
"inputs": {
"d": [
false
]
}
}
],
"limits": {
"maxCycles": 4,
"maxTimePs": 4000
},
"reset": {
"port": "rst",
"activeLevel": "active_high",
"assertCycles": 1
}
}
}각 사이클마다 클럭과 리셋을 제외한 모든 최상위 입력을 최하위 비트부터 지정하세요. 엔진이 클럭을 구동하고 처음 assertCycles 사이클 동안 리셋을 어서트합니다. clock.periodPs는 2에서 1000000000까지로 유지하세요. limits.maxCycles는 사이클 수부터 32768까지로, limits.maxTimePs는 사이클 수 × periodPs부터 1000000000000까지로 설정하세요. 요청 파일은 최대 272629760바이트까지 가능합니다.
실행 전에 요청 확인하기
alti rtl simulate admit --project "$PROJECT" sim.json
alti rtl simulate preflight --project "$PROJECT" sim.json > "$PROJECT/preflight.json"
jq -c '[.outputPorts[].name]' "$PROJECT/preflight.json"각 명령의 종료 상태가 0인지 확인하세요. Admit은 요청의 구조와 제한을 확인하고 admitted가 true인 altifigence.rtl.simulation-admission.v1을 반환합니다. 이 요청에서는 cycleCount 4, transitionStepCount 8, simulatedTimePs 4000을 보고합니다. Preflight는 또한 소스를 로직 넷리스트로 합성하고, 입력 포트, 출력 포트, 레지스터가 담긴 altifigence.rtl.simulation-preflight.v1을 반환합니다. jq 줄은 다음을 출력합니다:
["q"]Admit과 preflight는 사전 검사입니다. 시뮬레이션은 run으로만 실행됩니다.
시뮬레이션 실행하기
alti rtl simulate run --project "$PROJECT" sim.json > "$PROJECT/result.json"
jq -c '.artifact.payload.summaryArtifact.payload.finalOutputsLsb0' "$PROJECT/result.json"
jq -r '.artifact.payload.waveformArtifact.payload' "$PROJECT/result.json" > "$PROJECT/wave.vcd"종료 상태가 0인지 확인하세요. 결과의 스키마는 altifigence.rtl.operation-result.v1이고 operationId는 altifigence.rtl.simulate.v1입니다. 결과의 산출물은 사전 검사 결과, 이벤트 단계 트레이스, VCD 파형, 요약, 출처를 담은 altifigence.rtl.simulation-receipt.v1 영수증입니다. 이 요청의 최종 출력은 다음과 같습니다:
{"q":[false]}내장 엔진은 설계를 합성한 뒤 두 가지 상태를 쓰는 자체 이벤트 단계 시뮬레이터로 실행합니다. wave.vcd는 1ps 타임스케일을 사용합니다.
소스 파일 검사 및 합성하기
같은 모듈을 프로젝트 파일로 저장한 다음, 회로도를 출력하고 합성하세요. 소스 파일 경로는 프로젝트 기준 상대 경로입니다.
mkdir -p "$PROJECT/rtl"
jq -r '.request.sources[0].source' "$PROJECT/sim.json" > "$PROJECT/rtl/top.sv"
alti rtl schematic --project "$PROJECT" --top top rtl/top.sv > "$PROJECT/schematic.json"
jq -c '{schema, source}' "$PROJECT/schematic.json"종료 상태가 0인지 확인하세요. jq 줄은 다음을 출력합니다:
{"schema":"alti-rtl-schematic.v1","source":"saved-files"}문서에는 topModule, modules, instances, nets, connections, diagnostics, unsupported도 들어 있습니다. status는 complete 또는 partial이며, failed 상태의 문서는 종료 상태 1로 종료됩니다.
alti rtl synth --project "$PROJECT" --top top rtl/top.sv > "$PROJECT/synth.json"
jq -c '{report: .report.schema, netlist: .netlist.schema, cells: .report.stats.cells_by_kind}' "$PROJECT/synth.json"종료 상태가 0인지 확인하세요. Synth는 로직 넷리스트와 합성 보고서를 출력합니다. 이 모듈에서 jq 줄은 다음을 출력합니다:
{"report":"rtl-synth-report-2","netlist":"logic-netlist-2","cells":{"dff_posedge_async_reset":1}}synth가 alti-rtl: synth requires at least one SystemVerilog file로 중단되면 옵션 뒤에 rtl/top.sv 같은 소스 파일 경로를 추가하세요.
결과 보관 및 다시 열기
alti rtl artifact store --project "$PROJECT" result.json > "$PROJECT/manifest.json"
ENTRY_ID="$(jq -r '.entryId' "$PROJECT/manifest.json")"
alti rtl artifact list --project "$PROJECT"
alti rtl artifact show --project "$PROJECT" "$ENTRY_ID" > "$PROJECT/reopened.json"Store는 전체 결과를 검증하고 프로젝트의 .altifigence/artifacts/rtl/ 아래에 기록합니다. altifigence.rtl.artifact-manifest.v1 매니페스트에는 저장된 결과의 SHA-256인 entryId와 relativePath results/<entryId>.json이 들어 있습니다. List는 모든 매니페스트를 출력하고, show는 저장된 결과 JSON을 출력합니다. 결과는 최대 67108864바이트까지 가능합니다.
오류 해결하기
RTL simulation request must be the exact altifigence.rtl.simulate.v1 envelope가 표시되면 파일에 위에 표시된 값과 함께 정확히 schema, version, operationId, request 키만 넣으세요.
RTL simulation request must be a normalized project-relative path가 표시되면 sim.json처럼 ./나 /로 시작하지 않는 프로젝트 기준 상대 경로를 전달하세요.
엔진은 요청 오류를 alti-rtl: 뒤에 출력하고 종료 상태 2로 종료합니다. RTL simulation resource limit exceeded for stimulus cycles: observed 5, maximum 4가 표시되면 limits.maxCycles를 사이클 수로 올리고 admit을 다시 실행하세요.
RTL simulation resource limit exceeded for simulated time ps: observed 5000, maximum 4000이 표시되면 limits.maxTimePs를 최소한 사이클 수 × clock.periodPs로 올리세요.
RTL artifact entry does not exist: 뒤에 ID가 이어지면 alti rtl artifact list에서 entryId를 복사하고 show를 다시 실행하세요.
저장된 소스 파일 검사 및 분석하기
앞 섹션에서 저장한 rtl/top.sv를 사용하세요. 진단을 확인하고, 검사기 지원 범위와 계층 구조를 검사한 다음 네이티브 심볼 분석을 읽으세요. 실행 옵션은 컴파일러 하위 명령 뒤에 두세요.
alti rtl compile check --runner local --project "$PROJECT" -- rtl/top.sv --format json
alti rtl compile coverage --runner local --project "$PROJECT" -- rtl/top.sv --format json
alti rtl compile hierarchy --runner local --project "$PROJECT" -- rtl/top.sv --top top --format json
alti rtl analysis --project "$PROJECT" rtl/top.sv > "$PROJECT/analysis.json"
jq -c '{schemaVersion}' "$PROJECT/analysis.json"{"schemaVersion":"sv-symbols.v2"}호환용 표기 synthesize도 로컬 합성기를 실행합니다. 엔진 인수는 -- 뒤에 전달하세요:
alti rtl synthesize --runner local --project "$PROJECT" -- --top top rtl/top.sv > "$PROJECT/synth-compat.json"RTL compiler execution options must follow the explicit subcommand가 표시되면 위와 같이 --runner local과 --project를 check, coverage 또는 hierarchy 뒤에 두세요.
조합 논리 넷리스트를 셀에 매핑하기
별도의 조합 논리 예제와 작은 Liberty 라이브러리를 저장하세요. 넷리스트를 합성한 다음 각 로직 셀을 기능이 같은 라이브러리 셀에 매핑하세요.
cat > "$PROJECT/rtl/map-example.sv" <<'SV'
module top(input logic a, input logic b, output logic y);
logic n;
assign n = a & b;
assign y = ~n;
endmodule
SV
cat > "$PROJECT/map-example.lib" <<'LIB'
library (neutral) {
cell (AND2) {
area : 2.0;
pin (A) { direction : input; }
pin (B) { direction : input; }
pin (Y) { direction : output; function : "A & B"; }
}
cell (INV) {
area : 1.0;
pin (A) { direction : input; }
pin (Y) { direction : output; function : "!A"; }
}
}
LIB
alti rtl synth --project "$PROJECT" --top top --netlist-only rtl/map-example.sv > "$PROJECT/map-netlist.json"
alti rtl map --project "$PROJECT" --netlist map-netlist.json --liberty map-example.lib > "$PROJECT/map-report.json"
jq -c '{schema, mapped_cell_count, total_area}' "$PROJECT/map-report.json"{"schema":"rtl-liberty-direct-map-report-0","mapped_cell_count":2,"total_area":"3.0"}no direct Liberty cell covers generic kind 뒤에 셀 종류가 이어지면 일치하는 불 함수를 지원하고 area가 양수인 라이브러리를 제공한 다음 map 명령을 다시 실행하세요.
대상 선택과 소스 파일 확인하기
대상 분석 계약과 준비 상태 기록을 읽은 다음 소스 파일 묶음을 확인하세요. 허용 검사 결과에는 선택 사항과 소스 파일 다이제스트가 기록됩니다. 구조적 사전 검사는 진단, 지원 범위, 계층 구조 산출물을 반환합니다.
alti rtl target-analysis capabilities
alti rtl target-analysis readiness
jq '{schema:"rtl-source-bundle.v1",sources:[.request.sources[] | {path,text:.source}],roots:[.request.sources[].path],include_dirs:[],defines:[],tops:[.request.top]}' "$PROJECT/sim.json" > "$PROJECT/target-sources.json"
DEADLINE_MS="$(( $(date +%s) * 1000 + 60000 ))"
TARGET_ARGS=(--module top --top top --targets generic-asic --primary-target generic-asic
--tools schematic,evidence --report-detail standard --profile local-example
--cpu-slots 1 --memory-bytes 536870912 --max-wall-time-ms 5000
--deadline-unix-ms "$DEADLINE_MS")
alti rtl target-analysis admit "${TARGET_ARGS[@]}" < "$PROJECT/target-sources.json" > "$PROJECT/target-admission.json"
jq -c '{schema, structuralPreflightAvailable}' "$PROJECT/target-admission.json"
alti rtl target-analysis preflight "${TARGET_ARGS[@]}" < "$PROJECT/target-sources.json" > "$PROJECT/target-preflight.json"
jq -r '.schema' "$PROJECT/target-preflight.json"{"schema":"altifigence.rtl.target-analysis-direct-admission.v1","structuralPreflightAvailable":true}
altifigence.rtl.target-analysis-direct-result.v1local-example은 이 예제에 기록되는 프로필 선택입니다. tops를 요청한 --top과 같게 유지하세요. target Analysis source bundle is invalid: source/root/include/define/top cardinality is invalid가 표시되면 sources와 roots에 소스 파일이 포함되어 있고 tops에 해당 최상위 이름 하나가 포함되어 있는지 확인하세요.
네 가지 상태를 지원하는 시뮬레이션 계약 실행하기
sim.json의 소스를 시간 지정 네 가지 상태 요청에 재사용하세요. 값은 문자열 0, 1, X, Z이며 최하위 비트부터 지정합니다. 이 예제는 클럭 하나, 리셋 하나, 시간 지정 입력 스케줄을 사용합니다.
jq '{schema:.schema,version:1,operationId:"altifigence.rtl.simulate.v2",request:{
top:.request.top,sources:.request.sources,
clocks:[{port:"clk",periodPs:1000,phasePs:500}],
resets:[{port:"rst",activeLevel:"active_high",changes:[
{timePs:0,valueLsb0:["1"]},{timePs:1000,valueLsb0:["0"]}]}],
inputSchedules:[{port:"d",changes:[
{timePs:0,valueLsb0:["0"]},{timePs:1000,valueLsb0:["1"]}]}],
initialRegisterValues:["0"],
limits:{maxCyclesPerClock:4,maxTimePs:4000,maxEvents:64}
}}' "$PROJECT/sim.json" > "$PROJECT/sim-v2.json"
alti rtl simulate-v2 admit --project "$PROJECT" sim-v2.json > "$PROJECT/v2-admission.json"
alti rtl simulate-v2 preflight --project "$PROJECT" sim-v2.json > "$PROJECT/v2-preflight.json"
alti rtl simulate-v2 run --project "$PROJECT" sim-v2.json > "$PROJECT/v2-result.json"
jq -r '.schema' "$PROJECT/v2-admission.json" "$PROJECT/v2-preflight.json"
jq -r '.artifact.payload.schema' "$PROJECT/v2-result.json"altifigence.rtl.simulation-admission.v2
altifigence.rtl.simulation-preflight.v2
altifigence.rtl.simulation-receipt.v2각 단계의 종료 상태가 0인지 확인하세요. 허용 검사는 시간 지정 요청을 확인하고, 사전 검사는 합성된 넷리스트를 준비하며, run은 트레이스, 파형, 요약, 출처 정보를 생성합니다. periodPs는 짝수로, phasePs는 주기보다 작게 지정하세요.