Симуляция сохранённого 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.v1

local-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, меньшее периода.

Команды движков CLI