Digital Design Studio의 첫 RTL 시뮬레이션#
2비트 카운터를 준비하고 동기식 reset을 확인한 뒤 모든 클록 에지를 검증된 네이티브 CLI 결과와 비교합니다.
개요#
첫 파일 저장 확인을 마친 뒤 이 실습을 사용하세요. 2비트 카운터를 3에서 시작해 첫 클록 상승 에지에서 0으로 초기화하고, 다시 3에서 0으로 순환시키는 예제입니다. 입력은 testbench 대신 JSON으로 지정합니다.
아래 카운터 요청 전체는 엔진 번들 0.1.10의 Linux x86_64 alti-rtl 실행 파일에서 Preflight와 Run에 통과했습니다. 모든 상승·하강 출력과 VCD 값을 대조했습니다. Windows 1.0.37은 별도의 1-DFF GUI 예제로 4 cycles, 8 transitions, 최종 q=1을 확인했습니다. 이 카운터를 Windows 또는 Cloud GUI에서 별도로 검증한 것은 아닙니다.
실행 경로 선택#
경로 |
준비할 것 |
범위 |
|---|---|---|
Windows Desktop |
검증된 1.0.37 패키지, 로컬 프로젝트, 정상 실행 권한 |
네이티브 패널은 저장된 프로젝트 파일을 읽으므로 Preflight와 Run 전에 편집 내용을 저장합니다 |
Linux CLI |
검증된 0.1.10 엔진 번들의 |
별도 실행 파일입니다. 이전 |
Cloud 브라우저 |
소스를 읽거나 편집할 권한이 있는 Cloud 프로젝트 |
Desktop 네이티브 RTL 패널과 실행 파일은 브라우저 실행 경로가 아닙니다 |
공개 패키지 제공 여부는 다운로드에서 확인하세요. 이 가이드는 신뢰 검사를 우회하는 방법이나 Microsoft Store 출시 공지가 아닙니다. 편집기 접근 권한이 네이티브 실행 권한을 주지는 않습니다. 로컬 실습에는 Cloud Compute, Evolve 또는 유료 작업이 필요하지 않습니다.
소스 파일 하나 준비하기#
새 실습 디렉터리를 만들고 아래 내용을 rtl/top.sv로 저장하세요. Desktop의 Local projects → Open existing project… 메뉴에서 그 디렉터리를 엽니다. 해당 실습의 top만 프로젝트에 두고 다른 예제, 생성된 testbench, initial이나 지연 제어가 들어 있는 파일을 섞지 않습니다.
module top (
input logic clk,
input logic rst,
output logic [1:0] count
);
always_ff @(posedge clk)
if (rst) count <= 2'b00;
else count <= count + 2'b01;
endmodule
초기 레지스터 값은 [true,true], 즉 이진수 11입니다. 시간 0에서 rst가 이미 높아도 count는 첫 상승 에지까지 3을 유지합니다. 이것이 동기식 reset입니다. 이후 2비트 결과는 1씩 증가하고 4마다 순환합니다.
Desktop 입력 설정#
New analysis를 열고 RTL simulation contract에서 Two-state single-clock v1을 선택하세요. 처음에 four-state v2가 선택되어 있어도 바꿉니다. RTL Simulation에 아래 값을 입력합니다.
필드 |
값 |
|---|---|
Clock port |
|
Clock period (ps) |
|
Reset port (optional) |
|
Reset behavior |
|
Reset assertion cycles |
|
Maximum cycles |
|
Maximum time (ps) |
|
Initial register values JSON (engine register order, lsb0) |
|
Cycle input stimulus JSON (complete non-control inputs, lsb0) 필드에 아래 배열을 붙여 넣으세요. clk와 설정된 rst는 엔진이 공급하므로 다섯 입력 맵은 의도적으로 비워 둡니다. 이 필드에 CLI 요청 전체를 넣지 않습니다.
[
{"inputs": {}},
{"inputs": {}},
{"inputs": {}},
{"inputs": {}},
{"inputs": {}}
]
rtl/top.sv를 저장하고 Preflight를 선택합니다. toptop, 스칼라 입력 2개, 2비트 출력 1개, 레지스터 2개, 5 cycles, 10 transitions를 확인합니다.Elaborated interface, Trace bounds, Semantic boundary를 읽습니다. Preflight는 요청을 받아들일 수 있는지 검사하며 시뮬레이션을 실행하지 않습니다.
Run RTL simulation을 선택합니다. Final trace summary를 아래 예상 결과와 비교합니다.
Trace artifact, VCD waveform metadata, Execution provenance를 확인합니다. 이 패널은 파형 메타데이터를 표시하며 대화형 파형 뷰어를 자동으로 열지는 않습니다.
Persisted full receipt가 표시되면 Recent RTL simulation receipts → Refresh → 영수증 ID가 붙은 Read 버튼으로 저장 결과를 읽습니다. Read는 새 Run이 아니며 같은 입력은 기존 영수증 식별자와 생성 시각을 재사용할 수 있습니다.
검증된 CLI 요청 실행#
Linux 경로에서는 아래 요청 전체를 새 디렉터리의 counter-request.json으로 저장하세요. 같은 소스 문자열이 포함되어 있으므로 rtl/top.sv만 고쳐도 이 소스가 함께 바뀌지는 않습니다. 새 실습으로 수정할 때 두 내용이 일치하도록 유지합니다.
{
"schema": "altifigence.rtl.operation-request.v1",
"version": 1,
"operationId": "altifigence.rtl.simulate.v1",
"request": {
"top": "top",
"sources": [
{
"path": "rtl/top.sv",
"source": "module top (\n input logic clk,\n input logic rst,\n output logic [1:0] count\n);\n always_ff @(posedge clk)\n if (rst) count <= 2'b00;\n else count <= count + 2'b01;\nendmodule\n"
}
],
"clock": {"port": "clk", "periodPs": 1000},
"initialRegisterValues": [true, true],
"cycles": [
{"inputs": {}},
{"inputs": {}},
{"inputs": {}},
{"inputs": {}},
{"inputs": {}}
],
"limits": {"maxCycles": 5, "maxTimePs": 5000},
"reset": {"port": "rst", "activeLevel": "active_high", "assertCycles": 1}
}
}
여기서 ./alti-rtl은 해당 버전의 검증된 실행 파일입니다. 실제 위치에 맞게 경로를 바꾸세요. 이전 결과를 덮어쓰지 않도록 새 출력 파일명을 사용하고, Preflight가 성공으로 종료한 뒤에만 Run으로 진행합니다.
./alti-rtl simulate preflight counter-request.json > counter-preflight.json
./alti-rtl simulate run counter-request.json > counter-result.json
이 요청에서는 두 명령 모두 종료 코드 0을 반환했습니다. Preflight는 admitted: true를 보고합니다. Run은 시뮬레이션 아티팩트와 provenance를 담은 altifigence.rtl.operation-result.v1을 반환합니다. 기록된 파형과 해시를 포함한 결과 전체를 보존하세요. 프로세스의 성공 종료만으로 모든 중간 값이 맞았다고 판단하지 않습니다.
Reset과 모든 에지 비교#
JSON의 true는 1, false는 0입니다. 포트 벡터는 최하위 비트부터 나열하므로 이진수 10은 [false,true]입니다. 초기값은 임의의 포트 순서가 아니라 Preflight가 알려 준 레지스터 순서를 따릅니다. 회로를 바꾸면 순서와 개수를 다시 확인하세요.
시간(ps) |
사건 |
rst |
count, 최상위 비트부터 |
|---|---|---|---|
0 |
초기 상태, 클록 낮음 |
1 |
11 |
500 |
상승 에지에서 동기식 reset 적용 |
1 |
00 |
1000 |
하강 에지에서 reset 해제 |
0 |
00 |
1500 / 2000 |
상승 / 하강 |
0 |
01 / 01 |
2500 / 3000 |
상승 / 하강 |
0 |
10 / 10 |
3500 / 4000 |
상승 / 하강 |
0 |
11 / 11 |
4500 / 5000 |
상승 에지에서 순환 / 하강 |
0 |
00 / 00 |
예상 요약은 5 cycles, 10 transitions, 5000 ps, 최종 count=[false,false] 값입니다. 하강 에지에는 다음 cycle의 입력을 적용하고 마지막 하강에서는 마지막 입력을 유지합니다. 따라서 레지스터 출력이 다음 상승 에지까지 기다리는 동안에도 조합 출력은 하강에서 바뀔 수 있습니다.
현재 의미 범위와 오류 복구#
선택한 v1은 0/1의 두 상태, 단일 스칼라 클록, 양의 에지 저장소, 제한된 합성 가능 RTL 부분집합을 사용합니다. 클록 주기는 VCD 시간 눈금이며 전파 지연, setup/hold 분석, 최대 주파수 또는 물리 타이밍 signoff가 아닙니다. 이 v1 요청에 X/Z, 다중 클록, 음의 에지 저장소, initial, #delay, 클래스, DPI, UVM, assertion testbench를 넣지 않습니다. 다른 계약에는 별도의 입력 허용 규칙이 있습니다.
증상 |
다음 단계 |
|---|---|
Native adapter unavailable 또는 패널이 없음 |
지원되는 Desktop 프로젝트 창인지 확인합니다. Cloud나 사용할 수 없는 동작으로 대체하지 않습니다 |
실행 권한 거부 |
정상 로그인과 제품 권한 지원 경로를 사용합니다. 편집기 접근은 실행 허가가 아닙니다 |
정확히 하나의 inferred top 필요 |
이 예제만 포함한 별도 디렉터리를 사용하고 다른 작업은 보존합니다 |
초기 레지스터 값 개수나 벡터 너비 거부 |
Preflight를 다시 실행하고 표시된 레지스터, 포트 이름, 최하위 비트 순서를 맞춥니다 |
|
현재 event simulator는 순수 조합 netlist schema를 거부합니다. schema 이름을 바꾸지 말고 문서의 순차회로 예제를 사용합니다 |
구버전 실행 파일에서 |
실제 실행 파일과 제품 버전을 확인하고 지원되는 업데이트 경로를 사용합니다 |
JSON, cycle 또는 시간 한도 오류 |
5개 cycle 배열 전체와 5 / 5000 한도를 다시 맞춥니다 |
편집 후 결과가 다름 |
올바른 프로젝트 파일을 저장합니다. CLI는 포함 소스도 갱신하고 Preflight와 Run을 다시 실행합니다 |
이 실습은 작은 네이티브 RTL 결과를 확인하며 SystemVerilog 전체 적합성, 합성 동등성, FPGA 구현, ASIC signoff 또는 GUI 전체 기능 동등성을 입증하지 않습니다. 뷰어가 실제로 어떤 저장 아티팩트를 읽는지 알아보려면 Analysis Views로 이어가세요.