展开 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。源代码错误显示在 diagnostics 中,同时 ok: false。解码器导出选择 SystemVerilog;参考文档导出选择 Markdown。已保存的命令输出包含可供检查的生成结果。将 add.cx 与这些结果一同保存,以便将后续更改追溯到源代码。如果展开报告 ok: false,请根据其诊断修正该文件,重新展开,并使用修正后的版本重新生成两份输出。

检查导出结果

解码器输出是 JSON 导出结果。以下部分字段标识生成的文件;content 包含其 SystemVerilog 文本。参考文档结果使用文件名 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 命令。