Симуляция сохранённого RTL и сохранение результата
Сохраните ограниченный запрос симуляции RTL, выполните для него admit и preflight, запустите его, затем сохраните результат в проекте, выведите список результатов и повторно откройте результат.
Используйте Altifigence CLI 0.1.9 в Linux, чтобы симулировать сохранённый SystemVerilog с помощью поставляемого в комплекте движка RTL. Каждая из команд симуляции 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 проверяет структуру запроса и ограничения и возвращает altifigence.rtl.simulation-admission.v1 со значением admitted true; для этого запроса команда сообщает 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. Его артефакт — квитанция altifigence.rtl.simulation-receipt.v1 с данными preflight, трассой событийных шагов, временной диаграммой VCD, сводкой и сведениями о происхождении. Для этого запроса итоговый вывод такой:
{"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 содержит entryId — SHA-256 сохранённого результата — и 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: с последующим идентификатором скопируйте entryId из alti rtl artifact list и снова выполните 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, затем снова выполните команду отображения.
Проверка выбора цели и её исходных файлов
Прочитайте контракт анализа целей и запись о готовности, затем проверьте пакет исходных файлов. Допуск фиксирует ваш выбор и дайджест исходных файлов. Структурная предварительная проверка возвращает диагностику, охват и результаты построения иерархии.
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. Допуск проверяет запрос с временными параметрами; preflight подготавливает его синтезированный нетлист; run создаёт трассу, временную диаграмму, сводку и сведения о происхождении. Используйте чётное значение periodPs и значение phasePs, меньшее периода.