SystemVerilogをローカルで検査、リネーム、レビューする

保存したSystemVerilogをインデックス化し、レビュー済みの計画でシンボルを検索してリネームし、即時アサーションをレビューして、リファレンスカタログを読み取ります。

Linux上のAltifigence CLI 0.1.9を使用して、ローカルプロジェクト内の保存済みSystemVerilogファイルを検査し、レビュー済みの計画でシンボルをリネームし、即時アサーションをレビューして、SVAと制約付きランダムのリファレンスカタログを読み取ります。

保存したソースファイルをインデックス化する

この例では、保存済みSystemVerilogファイルが一つある新しいローカルプロジェクトを使用してください。通常のユーザーとしてコマンドを実行してください。

set -euo pipefail
WORK="$(mktemp -d)"
mkdir -p "$WORK/project/rtl"
PROJECT="$(cd "$WORK/project" && pwd -P)"
cat > "$PROJECT/rtl/top.sv" <<'SV'
module child(input logic a, output logic y);
  assign y = a;
endmodule

module top(input logic a, output logic y);
  child u_child(.a(a), .y(y));
endmodule
SV
alti sv frontend index --project "$PROJECT" rtl/top.sv > "$WORK/index.json"
jq '{schemaVersion, files, modules: [.modules[].name], diagnostics}' "$WORK/index.json"

終了ステータスが0であることを確認してください。インデックスのschemaVersionはsv-index.v1です。filesの各エントリーにはpath、bytes、lineCountがあります。各モジュールにはports、params、instances、locがあります。

定義と参照を検索する

位置は1始まりの行番号と列番号で指定します。1行目の8列目が名前childです。

alti sv frontend definition --project "$PROJECT" rtl/top.sv 1 8 \
  > "$WORK/definition.json"
alti sv frontend references --project "$PROJECT" rtl/top.sv 1 8 \
  > "$WORK/references.json"
jq '{schemaVersion, definition}' "$WORK/definition.json"
jq '{schemaVersion, references: [.references[].loc]}' "$WORK/references.json"

定義の結果はschemaVersionがsv-definition.v1で、query、symbol、definitionを持ちます。参照の結果はschemaVersionがsv-references.v1で、referencesリストを持ちます。位置が特定された各シンボルには、name、kind、およびpath、line、columnを持つlocがあります。ファイルをまたいでシンボルを解決するには、列番号の後に他の保存済みファイルを指定してください。

レビュー済みの計画でリネームする

childをleafにリネームする計画を作成してください。計画を作成してもファイルは変更されません。

alti sv frontend rename-plan --project "$PROJECT" rtl/top.sv 1 8 leaf \
  > "$WORK/rename.plan.json"
jq '{schemaVersion, edits}' "$WORK/rename.plan.json"
PLAN_SHA256="$(jq -r .canonicalSha256 "$WORK/rename.plan.json")"

計画のschemaVersionはsv-rename-plan.v1です。各編集にはpath、line、column、length、replacementがあります。すべての編集を確認してから、レビュー済みのcanonicalSha256を指定して同じリネームを適用してください。

alti sv frontend rename-apply --project "$PROJECT" rtl/top.sv 1 8 leaf \
  "$PLAN_SHA256" > "$WORK/rename.receipt.json"
jq '{schemaVersion, reviewedPlanSha256, appliedCurrentRequest}' \
  "$WORK/rename.receipt.json"

終了ステータスが0で、appliedCurrentRequestがtrueであることを確認してください。レシートのschemaVersionはsv-rename-apply.v1です。適用ステップはプロジェクト内の保存済みSystemVerilogファイルから計画を再度構築し、その計画のダイジェストがレビュー済みのダイジェストと一致する場合にのみ編集を書き込みます。両方の計画が同じソースファイルを対象とするように、プロジェクトの保存済みSystemVerilogファイルすべてに対して計画を作成してください。

即時アサーションをレビューする

レビューは、stdinから一つのSystemVerilogソースを読み取り、構造化されたアサーションのレビュー結果を返します。

cat > "$WORK/check.sv" <<'SV'
module check(input logic [3:0] count);
  always_comb begin
    assert (count != 4'hf) else $error("count overflow");
  end
endmodule
SV
alti sv review immediate < "$WORK/check.sv" > "$WORK/immediate.json"
jq . "$WORK/immediate.json"

終了ステータスが0であることを確認し、レビュー結果を読み取ってください。alti sv review interprocessは同じ方法でソースを読み取り、プロセス間同期をレビューします。

リファレンスカタログを読み取る

SVAカタログのエントリーを一覧表示し、その一つを表示します。

alti sv library sva list --limit 5 > "$WORK/sva.json"
jq '{schemaVersion, totalMatches, truncated, ids: [.entries[].stableId]}' "$WORK/sva.json"
ENTRY_ID="$(jq -r '.entries[0].stableId' "$WORK/sva.json")"
alti sv library sva show "$ENTRY_ID"

どちらのカタログもschemaVersionはaltifigence.sv-library-catalog.v1です。一覧にはresultLimit、totalAvailable、totalMatches、truncated、entriesがあります。各エントリーにはstableId、category、name、summary、tags、attributesがあります。--categoryには、svaの場合はcheckerを、constrained-randomの場合はitemまたはcontrolを使用します。一覧は、--filterに1から128バイトのテキストを、--limitに1から64の値を指定して絞り込めます。既定の上限は64です。alti sv library constrained-random listとshowも同じように使用します。

次のクエリでコンパイル済みのUVMブリッジ規約を読み取ります。alti sv uvm readinessは、コンポーネントを読み込んだり実行したりせずに、署名付きの固定コンポーネント準備状況レシートを返します。

alti sv uvm capabilities
alti sv uvm readiness

エラーに対処する

クエリがno symbol at rtl/top.sv:2:1と報告した場合、その位置はシンボル名上にありません。インデックス内のlocから行と列を取得して、もう一度クエリを実行してください。

rename-applyがreviewed SV rename plan changed: expectedに続けて二つのダイジェストを報告した場合、保存されたソースファイルからはレビュー済みの計画が生成されなくなっています。rename-planをもう一度実行し、新しい編集を確認して、新しいcanonicalSha256で適用してください。

rename-applyがSV rename apply requires --project <absolute-workspace>と報告した場合は、--project "$PROJECT"を追加して、もう一度実行してください。

showがSVライブラリのエントリーが見つからないと報告した場合、コマンドは終了ステータス2で終了します。listの結果からstableIdをコピーして、showをもう一度実行してください。

シンボル、ホバーの詳細、補完を検査する

リネームを適用した後、同じ保存済みのrtl/top.svフィクスチャを使用してシンボルを検査してください。symbolsはモジュールのシンボル、参照、解決数を返します。symbols-v2には定数値、幅、generateの展開も含まれます。

alti sv frontend symbols --project "$PROJECT" rtl/top.sv > "$WORK/symbols.json"
alti sv frontend symbols-v2 --project "$PROJECT" rtl/top.sv > "$WORK/symbols-v2.json"
jq '{schemaVersion, modules: [.modules[].name]}' "$WORK/symbols.json"
jq '{schemaVersion, modules: [.modules[].name]}' "$WORK/symbols-v2.json"
{"schemaVersion":"sv-symbols.v1","modules":["leaf","top"]}
{"schemaVersion":"sv-symbols.v2","modules":["leaf","top"]}

シンボルの位置でhoverを、名前のプレフィックスでcompleteを使用してください。Hoverには照会したシンボルとその定義が含まれ、補完項目にはlabel、kind、locが含まれます。

alti sv frontend hover --project "$PROJECT" rtl/top.sv 1 8 > "$WORK/hover.json"
alti sv frontend complete --project "$PROJECT" lea rtl/top.sv > "$WORK/complete.json"
jq '{schemaVersion}' "$WORK/hover.json"
jq '{schemaVersion, labels: ([.items[].label] | unique)}' "$WORK/complete.json"
{"schemaVersion":"sv-hover.v1"}
{"schemaVersion":"sv-completion.v1","labels":["leaf"]}

返された位置を使用する前に、終了ステータスが0であることを確認してください。その位置にシンボルがない場合は、返されたシンボルからlocを選び、hoverをもう一度試してください。completeが無効なプレフィックスを報告した場合は、leaなどの1から128バイトの値を使用してください。

UVM環境とABIの規約を検査する

環境とABIのレポートを、機能と準備状況のレポートと一緒に保存してください。environmentは署名付きコンポーネントの検出ポリシーを記述します。abiはコンパイル済みのCインターフェース、戻りコード、エクスポート名、パラメーターの型を一覧表示します。

alti sv uvm environment > "$WORK/uvm-environment.json"
alti sv uvm abi > "$WORK/uvm-abi.json"
jq '{schemaVersion, authority: .discovery.authority}' "$WORK/uvm-environment.json"
jq '{schemaVersion, callingConvention}' "$WORK/uvm-abi.json"
{"schemaVersion":"altifigence.uvm-bridge-environment.v1","authority":"host-owned-signed-component-discovery"}
{"schemaVersion":"altifigence.uvm-bridge-abi.v1","callingConvention":"C"}

UVMシミュレーションリクエストの規約をレビューする

シミュレーションの規約と準備状況レシートを照会し、admitで保存済みソースファイルのディスクリプターとそのリソース上限を検証してください。以下の例では、保存したフィクスチャをソースファイル一つのディスクリプターとして使用します。返されたrequestSha256を、レビューしたディスクリプターと一緒に記録してください。

alti sv uvm simulation capabilities > "$WORK/uvm-simulation-capabilities.json"
alti sv uvm simulation readiness > "$WORK/uvm-simulation-readiness.json"
jq '{schema, admissionAvailable, preflightAvailable}' "$WORK/uvm-simulation-capabilities.json"
{"schema":"altifigence.uvm-simulation-capabilities.v1","admissionAvailable":true,"preflightAvailable":true}
BUNDLE_SHA256="$(sha256sum "$PROJECT/rtl/top.sv" | cut -d ' ' -f 1)"
SOURCE_BYTES="$(wc -c < "$PROJECT/rtl/top.sv")"
alti sv uvm simulation admit --bundle-id demo --bundle-sha256 "$BUNDLE_SHA256" \
  --source-count 1 --source-bytes "$SOURCE_BYTES" \
  --test smoke --top top --clock clk --period-ps 1000 --cycles 10 \
  --max-wall-time-ms 1000 --max-cpu-cores 1 \
  --max-memory-bytes 1048576 --max-artifact-bytes 1048576 > "$WORK/uvm-admission.json"
jq '{schema, admitted, sourceCount, cycleCount}' "$WORK/uvm-admission.json"
{"schema":"altifigence.uvm-simulation-admission.v1","admitted":true,"sourceCount":1,"cycleCount":10}

preflightは、試行IDと、そのウォールタイム上限までの残り時間も検証します。その試行のアドミッション、コンポーネントとDPIの準備状況、およびリソース権限の評価を返します。レビュー用に完全なレシートを保存してください。

alti sv uvm simulation preflight --bundle-id demo --bundle-sha256 "$BUNDLE_SHA256" \
  --source-count 1 --source-bytes "$SOURCE_BYTES" \
  --test smoke --top top --clock clk --period-ps 1000 --cycles 10 \
  --max-wall-time-ms 1000 --max-cpu-cores 1 \
  --max-memory-bytes 1048576 --max-artifact-bytes 1048576 \
  --attempt-id review-1 --observed-at-unix-ms 1000 --deadline-unix-ms 1500 \
  > "$WORK/uvm-preflight.json"
jq '{schema, admitted: .admission.admitted}' "$WORK/uvm-preflight.json"
{"schema":"altifigence.uvm-simulation-preflight.v1","admitted":true}

source bundle digest must be lowercase SHA-256の場合は、64桁のダイジェストをそのままコピーしてください。resource ceilings are outside v1 boundsの場合は、capabilitiesを照会し、その最大値以内の正の値を選んでください。deadline is absent or exceeds the admitted wall-time ceilingの場合は、観測時刻からmax-wall-time-ms以内の正の期限を設定し、preflightを繰り返してください。上記の試行タイムスタンプは例示値です。

CLI エンジンコマンド