保存したRTLをシミュレーションして結果を保存する
制限付きのRTLシミュレーションリクエストを保存し、admitとpreflightで検査してから実行し、結果をプロジェクトに保存、一覧表示して再度開きます。
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です。そのアーティファクトはaltifigence.rtl.simulation-receipt.v1レシートで、プリフライト、イベントステップトレース、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}}alti-rtl: synth requires at least one SystemVerilog fileでsynthが停止した場合は、オプションの後に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には周期より小さい値を使用してください。