Inspecionar, renomear e revisar SystemVerilog localmente

Indexe SystemVerilog salvo, encontre e renomeie um símbolo por meio de um plano revisado, revise asserções imediatas e leia os catálogos de referência.

Use o Altifigence CLI 0.1.9 no Linux para inspecionar arquivos SystemVerilog salvos em um projeto local, renomear um símbolo por meio de um plano revisado, revisar asserções imediatas e ler os catálogos de referência de SVA e de randomização restrita.

Indexar um arquivo de código-fonte salvo

Use um projeto local novo para este exemplo, com um arquivo SystemVerilog salvo. Execute os comandos com sua conta de usuário comum.

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"

Exija o status de saída 0. O índice tem schemaVersion sv-index.v1. Cada entrada de files tem path, bytes e lineCount. Cada módulo tem seus ports, params, instances e loc.

Encontrar uma definição e suas referências

As posições usam números de linha e de coluna baseados em 1. A linha 1, coluna 8 é o nome 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"

O resultado da definição tem schemaVersion sv-definition.v1 com query, symbol e definition. O resultado das referências tem schemaVersion sv-references.v1 e uma lista references. Cada símbolo localizado tem name, kind e um loc com path, line e column. Para resolver símbolos entre arquivos, liste os outros arquivos salvos depois da coluna.

Renomear com um plano revisado

Crie um plano que renomeie child para leaf. Criar o plano não altera arquivos.

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")"

O plano tem schemaVersion sv-rename-plan.v1. Cada edição tem path, line, column, length e replacement. Revise todas as edições e, depois, aplique a mesma renomeação com o canonicalSha256 revisado:

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"

Exija o status de saída 0 e appliedCurrentRequest igual a true. O comprovante tem schemaVersion sv-rename-apply.v1. A etapa de aplicação gera o plano novamente a partir dos arquivos SystemVerilog salvos no projeto e grava as edições somente quando o resumo desse plano é igual ao resumo revisado. Crie o plano sobre todos os arquivos SystemVerilog salvos do projeto para que os dois planos cubram os mesmos arquivos de código-fonte.

Revisar asserções imediatas

A revisão lê um código-fonte SystemVerilog de stdin e retorna uma revisão estruturada de asserções.

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"

Exija o status de saída 0 e leia o resultado da revisão. alti sv review interprocess lê seu código-fonte da mesma forma e revisa a sincronização entre processos.

Ler os catálogos de referência

Liste as entradas do catálogo SVA e mostre uma delas:

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"

Os dois catálogos têm schemaVersion altifigence.sv-library-catalog.v1. Uma lista tem resultLimit, totalAvailable, totalMatches, truncated e entries. Cada entrada tem stableId, category, name, summary, tags e attributes. Para --category, use checker com sva, ou item ou control com constrained-random. Restrinja uma lista com texto de --filter de 1 a 128 bytes e com --limit de 1 a 64. O limite padrão é 64. Use alti sv library constrained-random list e show da mesma forma.

Leia o contrato da ponte UVM compilada com estas consultas. alti sv uvm readiness retorna o comprovante assinado de prontidão do componente fixo sem carregar nem executar o componente.

alti sv uvm capabilities
alti sv uvm readiness

Resolver erros

Se uma consulta informar no symbol at rtl/top.sv:2:1, essa posição não está sobre o nome de um símbolo. Use a linha e a coluna de um loc do índice e execute a consulta novamente.

Se rename-apply informar reviewed SV rename plan changed: expected seguido de dois resumos, os arquivos de código-fonte salvos não produzem mais o plano revisado. Execute rename-plan novamente, revise as novas edições e aplique com o novo canonicalSha256.

Se rename-apply informar SV rename apply requires --project <absolute-workspace>, adicione --project "$PROJECT" e execute-o novamente.

Se show informar que a entrada da biblioteca SV não foi encontrada, o comando termina com o status de saída 2. Copie um stableId de um resultado de list e execute show novamente.

Inspecionar símbolos, detalhes ao passar o cursor e sugestões de conclusão

Depois de aplicar a renomeação, use o mesmo caso de teste salvo rtl/top.sv para inspecionar seus símbolos. symbols retorna símbolos de módulos, referências e contagens de resolução. symbols-v2 também inclui valores constantes, larguras e a expansão de 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"]}

Use hover na localização de um símbolo e complete com um prefixo de nome. Os detalhes ao passar o cursor incluem o símbolo consultado e sua definição; os itens de conclusão incluem label, kind e 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"]}

Exija o status de saída 0 antes de usar as localizações retornadas. Se não houver símbolo em uma localização, escolha um loc de um símbolo retornado e tente hover novamente. Se complete informar um prefixo inválido, use de 1 a 128 bytes, como lea.

Inspecionar o ambiente UVM e os contratos ABI

Salve os relatórios do ambiente e de ABI junto com os relatórios de capacidades e prontidão. environment descreve a política de descoberta de componentes assinados. abi lista a interface C compilada, os códigos de retorno, os nomes exportados e os tipos de parâmetros.

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"}

Revisar os contratos de solicitação de simulação UVM

Consulte o contrato de simulação e os recibos de prontidão e valide um descritor de fontes salvas e seus limites de recursos com admit. O exemplo abaixo usa o caso de teste salvo como um descritor de uma única fonte. Registre o requestSha256 retornado com o descritor que você revisou.

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 também valida um ID de tentativa e o tempo restante dentro do seu limite de duração. Ele retorna a admissão, a prontidão do componente e de DPI e a avaliação da autoridade sobre recursos para essa tentativa. Salve o recibo completo para revisão.

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}

Para source bundle digest must be lowercase SHA-256, copie o resumo criptográfico de 64 caracteres sem alterá-lo. Para resource ceilings are outside v1 bounds, consulte capabilities e escolha valores positivos dentro dos máximos. Para deadline is absent or exceeds the admitted wall-time ceiling, defina um prazo positivo dentro de max-wall-time-ms a partir do momento de observação e repita preflight. Os horários das tentativas acima são valores ilustrativos.

Comandos de engine da CLI