| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| |
| # Instruction encoding schemes for OTBN |
| # |
| # These are used by the instructions in insns.yml. A scheme defines the mapping |
| # between instruction operands and bits in the encoding. A scheme names zero or |
| # more named fields. It can also inherit from zero or more other schemes. |
| # |
| # The direct fields of a scheme are defined as a dictionary, mapping a field |
| # name (which will be matched up with instruction operands) to a value. In |
| # general, this value is itself a dictionary with the following keys: |
| # |
| # bits: A list of ranges of bits. A range is written <msb>-<lsb>, where both |
| # are integers (and msb >= lsb). Multiple ranges can be separated by |
| # commas. A degenerate range (with msb == lsb) can be written as a bare |
| # integer. Required. |
| # |
| # value: Optional. If specified, this should be a binary string for a fixed |
| # value for this field, prefixed with a "b" (to avoid the YAML parser |
| # reading it as a decimal number). Underscores in the string are |
| # ignored (to make it easier to show grouping) and 'x' means don't |
| # care. |
| # |
| # For brevity, if there's no literal value, the field can be represented as |
| # just its bits string. |
| # |
| # A scheme can inherit from other schemes by listing their names in a 'parents' |
| # attribute. If the child scheme needs to set the value of a parents' field to |
| # something fixed, it can do so with the following syntax: |
| # |
| # parent_name(field_name=b11101, field_name2=b111) |
| # |
| # The fields of a scheme are recursively defined to be its direct fields plus |
| # the fields all its ancestors. |
| # |
| # A scheme is called complete if its fields cover the entire range of bits |
| # (0-31) and partial otherwise. |
| |
| # A partial scheme that sets the bottom two bits to 2'b11 (as for all RISC-V |
| # uncompressed instructions) and defines an 'opcode' field for bits 6-2 |
| # (standard for RV32I instructions) |
| rv: |
| fields: |
| opcode: 6-2 |
| uncomp: |
| bits: 1-0 |
| value: b11 |
| |
| # A partial scheme defining a funct3 field in bits 14-12 (used in most RV32I |
| # instructions, and most BN.* custom instructions) |
| funct3: |
| fields: |
| funct3: 14-12 |
| |
| # RISC-V "R-type" encoding (reg <- fun(reg, reg)) |
| R: |
| parents: |
| - rv |
| - funct3 |
| fields: |
| funct7: 31-25 |
| rs2: 24-20 |
| rs1: 19-15 |
| rd: 11-7 |
| |
| # RISC-V "I-type" encoding (reg <- fun(imm, reg)) |
| I: |
| parents: |
| - rv |
| - funct3 |
| fields: |
| imm: 31-20 |
| rs1: 19-15 |
| rd: 11-7 |
| |
| # RISC-V "I-type" encoding sub-type for shifts (reg <- fun(imm, reg)) |
| Is: |
| parents: |
| - rv |
| - funct3 |
| fields: |
| arithmetic: 30 |
| shamt: 24-20 |
| rs1: 19-15 |
| rd: 11-7 |
| unused: |
| bits: 31,29-25 |
| value: b000000 |
| |
| # RISC-V "S-type" encoding (_ <- fun(reg, imm)) |
| S: |
| parents: |
| - rv |
| - funct3 |
| fields: |
| imm: 31-25,11-7 |
| rs2: 24-20 |
| rs1: 19-15 |
| |
| # RISC-V "B-type" encoding (like S, but different immediate layout; used for |
| # branches) |
| B: |
| parents: |
| - rv |
| - funct3 |
| fields: |
| imm: 31,7,30-25,11-8 |
| rs2: 24-20 |
| rs1: 19-15 |
| |
| # RISC-V "U-type" encoding (reg <- fun(imm)) |
| U: |
| parents: |
| - rv |
| fields: |
| imm: 31-12 |
| rd: 11-7 |
| |
| # RISC-V "J-type" encoding (like U, but different immediate layout; used for |
| # jumps) |
| J: |
| parents: |
| - rv |
| fields: |
| imm: 31,19-12,20,30-21 |
| rd: 11-7 |
| |
| # A partial scheme for custom instructions with opcode b00010 |
| custom0: |
| parents: |
| - rv(opcode=b00010) |
| |
| # A partial scheme for custom instructions with opcode b01010 |
| custom1: |
| parents: |
| - rv(opcode=b01010) |
| |
| # A partial scheme for custom instructions with opcode b01110 |
| custom2: |
| parents: |
| - rv(opcode=b01110) |
| |
| # A partial scheme for custom instructions with opcode b11110 |
| custom3: |
| parents: |
| - rv(opcode=b11110) |
| |
| # A partial scheme for instructions that produce a dest WDR. |
| wrd: |
| fields: |
| wrd: 11-7 |
| |
| # A partial scheme for instructions that take two source WDRs and produce a |
| # dest WDR. |
| wdr3: |
| parents: |
| - wrd |
| fields: |
| wrs2: 24-20 |
| wrs1: 19-15 |
| |
| # A partial scheme that defines the 'fg' field (for <flag_group> operands) |
| fg: |
| fields: |
| fg: 31 |
| |
| # A partial scheme that defines the shift fields (type and bytes) |
| shift: |
| fields: |
| shift_type: 30 |
| shift_bits: 29-25 |
| |
| # A partial scheme for specialized 2 bit function field, we need a reduced |
| # size in the lower two bits of funct3 as RSHI spills over 1 bit from its |
| # immediate |
| funct2: |
| fields: |
| funct2: 13-12 |
| |
| # A partial scheme for the bn.mov/bn.movr instructions. Specifies if register |
| # indirect lookup is used (bn.mov vs bn.movr) |
| indirect: |
| fields: |
| indirect: 31 |
| |
| # A specialised encoding for the loop instruction (only one source, no |
| # destination) |
| loop: |
| parents: |
| - custom3 |
| - funct3(funct3=b000) |
| fields: |
| bodysize: 31-20 |
| grs: 19-15 |
| fixed: |
| bits: 11-7 |
| value: bxxxxx |
| |
| # A specialised encoding for the loopi instruction (which, unusually, has 2 |
| # immediates) |
| loopi: |
| parents: |
| - custom3 |
| - funct3(funct3=b001) |
| fields: |
| bodysize: 31-20 |
| iterations: 19-15,11-7 |
| |
| # Used wide logical operations (bn.and, bn.or, bn.xor). |
| bna: |
| parents: |
| - custom3 |
| - wdr3 |
| - funct3 |
| - shift |
| - fg |
| |
| # Used for bn.not (no second source reg). |
| bnan: |
| parents: |
| - custom3 |
| - funct3 |
| - shift |
| - fg |
| - wrd |
| fields: |
| wrs1: 24-20 |
| fixed: |
| bits: 19-15 |
| value: bxxxxx |
| |
| # Used for the wide reg/reg ALU instructions. |
| bnaf: |
| parents: |
| - custom1 |
| - wdr3 |
| - funct3 |
| - shift |
| - fg |
| |
| # Used for the wide bn.addi and bn.subi instructions. |
| bnai: |
| parents: |
| - custom1 |
| - wrd |
| - funct3 |
| - fg |
| fields: |
| sub: 30 |
| imm: 29-20 |
| wrs: 19-15 |
| |
| # Used for bn.addm, bn.subm |
| bnam: |
| parents: |
| - custom1 |
| - wdr3 |
| - funct3 |
| fields: |
| sub: 30 |
| fixed: |
| bits: 31,29-25 |
| value: bxxxxxx |
| |
| # Used for bn.mulqacc |
| bnaq: |
| parents: |
| - custom2 |
| - wdr3 |
| - fg |
| fields: |
| so: 30 |
| wb0: 29 |
| qs2: 28-27 |
| qs1: 26-25 |
| shift: 14-13 |
| z: 12 |
| |
| # Unusual scheme used for bn.rshi (the immediate bleeds into the usual funct3 |
| # field) |
| bnr: |
| parents: |
| - custom3 |
| - wdr3 |
| fields: |
| imm: 31-25,14 |
| funct2: 13-12 |
| |
| # Used by bn.sel. |
| bns: |
| parents: |
| - custom0 |
| - wdr3 |
| - funct3(funct3=b000) |
| - fg |
| fields: |
| fixed: |
| bits: 30-27 |
| value: bxxxx |
| flag: 26-25 |
| |
| # Used by bn.cmp and bn.cmpb |
| bnc: |
| parents: |
| - custom0 |
| - wdr3(wrd=bxxxxx) |
| - funct3 |
| - shift |
| - fg |
| |
| # Used by bn.lid and bn.sid |
| bnxid: |
| parents: |
| - custom0 |
| - funct3 |
| fields: |
| imm: 11-9,31-25 |
| rs2: 24-20 |
| rs1: 19-15 |
| spp: 8 |
| dpp: 7 |
| |
| # Used by bn.mov |
| bnmov: |
| parents: |
| - custom0 |
| - funct3(funct3=b110) |
| - indirect(indirect=b0) |
| fields: |
| fixed_top: |
| bits: 30-20 |
| value: bxxxxxxxxxxx |
| src: 19-15 |
| dst: 11-7 |
| |
| # Used by bn.movr |
| bnmovr: |
| parents: |
| - custom0 |
| - funct3(funct3=b110) |
| - indirect(indirect=b1) |
| fields: |
| fixed_top: |
| bits: 30-25 |
| value: bxxxxxx |
| dst: 24-20 |
| src: 19-15 |
| spp: 9 |
| dpp: 7 |
| unused: |
| bits: 11-10,8 |
| value: bxxx |
| |
| # Used by bn.wsrrs and bn.wsrrw |
| wcsr: |
| parents: |
| - custom0 |
| - funct3(funct3=b111) |
| fields: |
| write: 31 |
| wcsr: 27-20 |
| wrs: 19-15 |
| wrd: 11-7 |
| fixed: |
| bits: 30-28 |
| value: bxxx |