Simulare RTL salvato e conservare il risultato
Salva una richiesta di simulazione RTL limitata, esegui admit e preflight, eseguila, quindi salva, elenca e riapri il risultato nel tuo progetto.
Utilizza Altifigence CLI 0.1.9 su Linux per simulare SystemVerilog salvato con il motore RTL incluso. I comandi di simulazione admit, preflight e run leggono ciascuno un file di richiesta nel progetto e stampano JSON. Per leggere il contratto di simulazione a quattro stati con più clock, esegui alti rtl simulate-v2 capabilities.
Salvare una richiesta di simulazione
Crea la cartella del progetto e salva al suo interno questa richiesta come sim.json. Utilizza esattamente queste quattro chiavi di primo livello. La richiesta contiene il sorgente SystemVerilog, la porta e il periodo del clock, un reset facoltativo, i valori iniziali dei registri e un vettore di ingresso per ciclo.
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
}
}
}Fornisci in ogni ciclo ogni ingresso di primo livello tranne il clock e il reset, con il bit meno significativo per primo. Il motore pilota il clock e attiva il reset per i primi assertCycles cicli. Mantieni clock.periodPs da 2 a 1000000000. Imposta limits.maxCycles dal numero di cicli fino a 32768 e limits.maxTimePs da cicli × periodPs fino a 1000000000000. Il file di richiesta può avere fino a 272629760 byte.
Controllare la richiesta prima dell’esecuzione
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"Verifica che il codice di uscita sia 0 per ogni comando. Admit controlla la forma e i limiti della richiesta e restituisce altifigence.rtl.simulation-admission.v1 con admitted true; per questa richiesta riporta cycleCount 4, transitionStepCount 8 e simulatedTimePs 4000. Preflight sintetizza inoltre il sorgente in una netlist logica e restituisce altifigence.rtl.simulation-preflight.v1 con le porte di ingresso, le porte di uscita e i registri. La riga jq stampa:
["q"]Admit e preflight sono controlli preliminari. La simulazione viene eseguita solo con run.
Eseguire la simulazione
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"Verifica che il codice di uscita sia 0. Il risultato ha lo schema altifigence.rtl.operation-result.v1 e operationId altifigence.rtl.simulate.v1. Il suo artefatto è una ricevuta altifigence.rtl.simulation-receipt.v1 con il preflight, una traccia a passi di evento, una forma d’onda VCD, un riepilogo e la provenienza. Per questa richiesta l’output finale è:
{"q":[false]}Il motore incluso sintetizza il design e lo esegue con il proprio simulatore a due stati a passi di evento. wave.vcd utilizza un timescale 1ps.
Ispezionare e sintetizzare il sorgente
Salva lo stesso modulo come file del progetto, quindi genera il suo schematic e sintetizzalo. I percorsi dei file sorgente sono relativi al progetto.
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"Verifica che il codice di uscita sia 0. La riga jq stampa:
{"schema":"alti-rtl-schematic.v1","source":"saved-files"}Il documento contiene anche topModule, modules, instances, nets, connections, diagnostics e unsupported. Il suo status è complete o partial; un documento failed termina con codice di uscita 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"Verifica che il codice di uscita sia 0. Synth stampa la netlist logica e il relativo report di sintesi. Per questo modulo la riga jq stampa:
{"report":"rtl-synth-report-2","netlist":"logic-netlist-2","cells":{"dff_posedge_async_reset":1}}Se synth si interrompe con alti-rtl: synth requires at least one SystemVerilog file, aggiungi il percorso del file sorgente, ad esempio rtl/top.sv, dopo le opzioni.
Conservare e riaprire il risultato
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 convalida il risultato completo e lo scrive sotto .altifigence/artifacts/rtl/ nel progetto. Il suo manifest altifigence.rtl.artifact-manifest.v1 contiene entryId, lo SHA-256 del risultato salvato, e relativePath results/<entryId>.json. List stampa ogni manifest; show stampa il JSON del risultato salvato. Un risultato può avere fino a 67108864 byte.
Riprendere dopo gli errori
Per RTL simulation request must be the exact altifigence.rtl.simulate.v1 envelope, assegna al file esattamente le chiavi schema, version, operationId e request con i valori mostrati sopra.
Per RTL simulation request must be a normalized project-relative path, passa il percorso relativo al progetto, ad esempio sim.json, senza un ./ o un / iniziale.
Il motore stampa gli errori della richiesta dopo alti-rtl: e termina con codice di uscita 2. Per RTL simulation resource limit exceeded for stimulus cycles: observed 5, maximum 4, aumenta limits.maxCycles al numero di cicli ed esegui di nuovo admit.
Per RTL simulation resource limit exceeded for simulated time ps: observed 5000, maximum 4000, aumenta limits.maxTimePs ad almeno il numero di cicli × clock.periodPs.
Per RTL artifact entry does not exist: seguito da un id, copia un entryId da alti rtl artifact list ed esegui di nuovo show.
Verificare e analizzare le sorgenti salvate
Utilizza il file rtl/top.sv salvato nella sezione precedente. Controlla la diagnostica, esamina la copertura del verificatore e la gerarchia, quindi leggi l’analisi nativa dei simboli. Inserisci le opzioni di esecuzione dopo il sottocomando del compilatore.
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"}Anche la forma compatibile synthesize esegue il sintetizzatore locale. Passa gli argomenti del motore dopo --:
alti rtl synthesize --runner local --project "$PROJECT" -- --top top rtl/top.sv > "$PROJECT/synth-compat.json"Per RTL compiler execution options must follow the explicit subcommand, inserisci --runner local e --project dopo check, coverage o hierarchy, come mostrato sopra.
Mappare una netlist combinatoria su celle
Salva un esempio combinatorio separato e una piccola libreria Liberty. Sintetizza la sua netlist, quindi mappa ogni cella logica su una cella di libreria con funzione equivalente.
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"}Per no direct Liberty cell covers generic kind seguito da un tipo di cella, fornisci una libreria con la funzione booleana corrispondente e un valore positivo di area, quindi esegui di nuovo il comando di mappatura.
Verificare una selezione di destinazione e le sue sorgenti
Leggi il contratto di analisi della destinazione e il record di disponibilità, quindi verifica un pacchetto di sorgenti. L’ammissione registra le selezioni e il digest delle sorgenti. Il controllo preliminare strutturale restituisce diagnostica, copertura e gerarchia.
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 è la selezione del profilo registrata da questo esempio. Mantieni tops uguale al --top richiesto. Per target Analysis source bundle is invalid: source/root/include/define/top cardinality is invalid, verifica che sources e roots contengano la sorgente e che tops contenga quell’unico nome di modulo principale.
Eseguire il contratto di simulazione a quattro stati
Riutilizza la sorgente in sim.json con una richiesta temporizzata a quattro stati. I valori sono le stringhe 0, 1, X e Z, con il bit meno significativo per primo. Questo esempio utilizza un clock, un reset e una pianificazione temporizzata degli ingressi.
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.v2Verifica che il codice di uscita sia 0 a ogni passaggio. L’ammissione verifica la richiesta temporizzata; il controllo preliminare prepara la netlist sintetizzata; l’esecuzione produce traccia, forma d’onda, riepilogo e provenienza. Utilizza un valore pari di periodPs e un valore di phasePs inferiore al periodo.