CX をエラボレーションし、デコーダーをエクスポートする

保存した小さな CX 命令定義から、デコーダーと Markdown リファレンスを生成します。

Linux 上の Altifigence CLI 0.1.9 は、ISA 操作のために標準入力からネイティブ CX ソースを読み込みます。命令形式、レジスタオペランド、エンコーディング、および実行式をまとめて確認できるように、単一の ADD 命令から始めます。以下のソースを作業ディレクトリに add.cx として保存してください。レジスタファイルには幅 32 ビットのレジスタが 32 個含まれ、x0 はゼロとして読み出されます。

保存した結果を読む前に、終了ステータスが 0 であることを確認してください。標準エラー出力は別に保存し、以下で説明する結果フィールドを確認します。

CX 命令を保存する

arch CX-Core {
    word = 32 bits
    address = 32 bits
    endian = little
}
regfile gpr {
    count = 32
    width = 32 bits
    x0 = hardwired 0
}
format R = 32 bits {
    funct7 @ 31..25
    rs2 @ 24..20
    rs1 @ 19..15
    funct3 @ 14..12
    rd @ 11..7
    opcode @ 6..0
}
operand gpr (5 bits) {
    reads gpr[@]
    writes gpr[@]
    asm "x{@}"
}
instruction ADD uses R {
    reads rs1, rs2 : gpr
    writes rd : gpr
    encode opcode=0b0110011, funct3=0b000, funct7=0b0000000
    asm "add {rd}, {rs1}, {rs2}"
    exec rd <- rs1 +wrap rs2
}

R 形式では、すべてのエンコーディングフィールドに明示的なビット範囲を割り当てます。ADD は opcode、funct3、funct7 の値を固定し、ソースレジスタと宛先レジスタはそれぞれの名前付きフィールドを使用します。アセンブリ表記には、x の後にレジスタインデックスを続けるオペランド形式を使用します。このソースファイルを、エラボレーションと両方のエクスポートの共通入力として保持してください。

エラボレーションとエクスポートを行う

alti isa elaborate < add.cx
alti isa export-decoder --language sv < add.cx > decoder-result.txt
alti isa export-reference --format md --title "ADD reference" < add.cx > reference-result.txt

まずエラボレーションを実行し、JSON 結果が ok: true であることを確認してからエクスポートします。ソースのエラーは、ok: false とともに diagnostics に表示されます。デコーダーのエクスポートでは SystemVerilog を、リファレンスのエクスポートでは Markdown を選択します。保存したコマンド出力には、確認用の生成結果が含まれます。後の変更をソースまで追跡できるように、これらの結果と一緒に add.cx を保持してください。エラボレーションが ok: false を報告した場合は、診断情報を使ってそのファイルを修正し、エラボレーションを再実行して、修正後のバージョンから両方の出力を再生成します。

エクスポート結果を確認する

デコーダー出力は JSON エクスポート結果です。ここに示すフィールドの一部で生成ファイルを識別でき、content にその SystemVerilog テキストが含まれます。リファレンス結果は filename として cx_reference.md を使用し、content に Markdown テキストを含みます。

{"schema":"cx-export/1","ok":true,"kind":"decoder","format":"sv","filename":"cx_decoder.sv","mime_type":"text/x-systemverilog","word_bits":32,"instruction_count":1}

SystemVerilog エクスポートに --disassembler を追加して disassembler export supports C and Rust というエラーが出た場合は、--disassembler を削除し、示されている SystemVerilog コマンドを再実行してください。