| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #ifndef VTA_HW_SPEC_CONST_H_ |
| #define VTA_HW_SPEC_CONST_H_ |
| |
| /*! Memory bus width */ |
| #define VTA_BUS_WIDTH (1 << VTA_LOG_BUS_WIDTH) |
| |
| /*! log2 of instruction data type width */ |
| #define VTA_LOG_INS_WIDTH 7 |
| /*! Instruction data type width */ |
| #define VTA_INS_WIDTH (1 << VTA_LOG_INS_WIDTH) |
| /*! log2 of micro op data type width */ |
| #define VTA_LOG_UOP_WIDTH 5 |
| /*! Micro Op data type width */ |
| #define VTA_UOP_WIDTH (1 << VTA_LOG_UOP_WIDTH) |
| /*! Weight data type width */ |
| #define VTA_WGT_WIDTH (1 << VTA_LOG_WGT_WIDTH) |
| /*! Input data type width */ |
| #define VTA_INP_WIDTH (1 << VTA_LOG_INP_WIDTH) |
| /*! Output data type width */ |
| #define VTA_OUT_WIDTH (1 << VTA_LOG_OUT_WIDTH) |
| /*! Accumulator data type width */ |
| #define VTA_ACC_WIDTH (1 << VTA_LOG_ACC_WIDTH) |
| |
| /*! Batch size (corresponds to A in (A,B)x(B,C) mat mult)*/ |
| #define VTA_BATCH (1 << VTA_LOG_BATCH) |
| /*! Blocking factor of inner most loop (corresponds to B in (A,B)x(B,C) mat mult) */ |
| #define VTA_BLOCK_IN (1 << VTA_LOG_BLOCK_IN) |
| /*! Blocking factor of the outer loop (corresponds to C in (A,B)x(B,C) mat mult) */ |
| #define VTA_BLOCK_OUT (1 << VTA_LOG_BLOCK_OUT) |
| |
| /*! On-chip micro-op buffer size in B */ |
| #define VTA_UOP_BUFF_SIZE (1 << VTA_LOG_UOP_BUFF_SIZE) |
| /*! On-chip weight buffer size in B */ |
| #define VTA_WGT_BUFF_SIZE (1 << VTA_LOG_WGT_BUFF_SIZE) |
| /*! On-chip activation buffer size in B */ |
| #define VTA_INP_BUFF_SIZE (1 << VTA_LOG_INP_BUFF_SIZE) |
| /*! On-chip accumulator buffer size in B */ |
| #define VTA_ACC_BUFF_SIZE (1 << VTA_LOG_ACC_BUFF_SIZE) |
| |
| /*! Input vector size in bits */ |
| #define VTA_INP_MATRIX_WIDTH (VTA_INP_WIDTH * VTA_BATCH * VTA_BLOCK_IN) |
| /*! Weight vector size in bits */ |
| #define VTA_WGT_MATRIX_WIDTH (VTA_WGT_WIDTH * VTA_BLOCK_OUT * VTA_BLOCK_IN) |
| /*! Accumulator vector size in bits */ |
| #define VTA_ACC_MATRIX_WIDTH (VTA_ACC_WIDTH * VTA_BATCH * VTA_BLOCK_OUT) |
| /*! Output vector size in bits */ |
| #define VTA_OUT_MATRIX_WIDTH (VTA_OUT_WIDTH * VTA_BATCH * VTA_BLOCK_OUT) |
| |
| /*! Ratio between input matrix size and axi width */ |
| #define INP_MAT_AXI_RATIO (VTA_INP_MATRIX_WIDTH / VTA_BUS_WIDTH) |
| /*! Ratio between weight matrix size and axi width */ |
| #define WGT_MAT_AXI_RATIO (VTA_WGT_MATRIX_WIDTH / VTA_BUS_WIDTH) |
| /*! Ratio between accumulator matrix size and axi width */ |
| #define ACC_MAT_AXI_RATIO (VTA_ACC_MATRIX_WIDTH / VTA_BUS_WIDTH) |
| /*! Ratio between output matrix size and axi width */ |
| #define OUT_MAT_AXI_RATIO (VTA_OUT_MATRIX_WIDTH / VTA_BUS_WIDTH) |
| |
| /*! Size of instruction buffer element in B */ |
| #define VTA_INS_ELEM_BYTES (VTA_INS_WIDTH / 8) |
| /*! Size of uop buffer element in B*/ |
| #define VTA_UOP_ELEM_BYTES (VTA_UOP_WIDTH / 8) |
| /*! Size of activation buffer element in B*/ |
| #define VTA_INP_ELEM_BYTES (VTA_INP_MATRIX_WIDTH / 8) |
| /*! Size of weight buffer element in B*/ |
| #define VTA_WGT_ELEM_BYTES (VTA_WGT_MATRIX_WIDTH / 8) |
| /*! Size of accumulator buffer element in B*/ |
| #define VTA_ACC_ELEM_BYTES (VTA_ACC_MATRIX_WIDTH / 8) |
| /*! Size of output buffer element in B*/ |
| #define VTA_OUT_ELEM_BYTES (VTA_OUT_MATRIX_WIDTH / 8) |
| |
| /*! On-chip micro-op buffer depth */ |
| #define VTA_UOP_BUFF_DEPTH (VTA_UOP_BUFF_SIZE / VTA_UOP_ELEM_BYTES) |
| /*! log2 of on-chip micro-op buffer depth */ |
| #define VTA_LOG_UOP_BUFF_DEPTH (VTA_LOG_UOP_BUFF_SIZE - VTA_LOG_UOP_WIDTH + 3) |
| // ! \brief On-chip weight buffer depth |
| #define VTA_WGT_BUFF_DEPTH (VTA_WGT_BUFF_SIZE / VTA_WGT_ELEM_BYTES) |
| /*! log2 of weight micro-op buffer depth */ |
| #define VTA_LOG_WGT_BUFF_DEPTH \ |
| (VTA_LOG_WGT_BUFF_SIZE - VTA_LOG_BLOCK_OUT - VTA_LOG_BLOCK_IN - VTA_LOG_WGT_WIDTH + 3) |
| /*! On-chip activation buffer depth */ |
| #define VTA_INP_BUFF_DEPTH (VTA_INP_BUFF_SIZE / VTA_INP_ELEM_BYTES) |
| /*! log2 of activation micro-op buffer depth */ |
| #define VTA_LOG_INP_BUFF_DEPTH \ |
| (VTA_LOG_INP_BUFF_SIZE - VTA_LOG_BATCH - VTA_LOG_BLOCK_IN - VTA_LOG_INP_WIDTH + 3) |
| /*! On-chip accumulator buffer depth */ |
| #define VTA_ACC_BUFF_DEPTH (VTA_ACC_BUFF_SIZE / VTA_ACC_ELEM_BYTES) |
| /*! log2 of on-chip accumulator buffer depth */ |
| #define VTA_LOG_ACC_BUFF_DEPTH \ |
| (VTA_LOG_ACC_BUFF_SIZE - VTA_LOG_BATCH - VTA_LOG_BLOCK_OUT - VTA_LOG_ACC_WIDTH + 3) |
| |
| /*! Instruction opcode field bitwidth */ |
| #define VTA_OPCODE_BIT_WIDTH 3 |
| /*! ALU opcode field bitwidth */ |
| #define VTA_ALU_OPCODE_BIT_WIDTH 3 |
| |
| /*! Opcode: load encoding */ |
| #define VTA_OPCODE_LOAD 0 |
| /*! Opcode: store encoding */ |
| #define VTA_OPCODE_STORE 1 |
| /*! Opcode: GEMM encoding */ |
| #define VTA_OPCODE_GEMM 2 |
| /*! Opcode: finish encoding */ |
| #define VTA_OPCODE_FINISH 3 |
| /*! Opcode: ALU encoding */ |
| #define VTA_OPCODE_ALU 4 |
| |
| /*! ALU opcode: unary min op */ |
| #define VTA_ALU_OPCODE_MIN 0 |
| /*! ALU opcode: unary max op */ |
| #define VTA_ALU_OPCODE_MAX 1 |
| /*! ALU opcode: binary add op */ |
| #define VTA_ALU_OPCODE_ADD 2 |
| /*! ALU opcode: shift right by immediate op */ |
| #define VTA_ALU_OPCODE_SHR 3 |
| /*! ALU opcode: mul */ |
| #define VTA_ALU_OPCODE_MUL 4 |
| |
| /*! Memory type field bitwidth */ |
| #define VTA_MEMOP_ID_BIT_WIDTH 3 |
| /*! Load/Store Instruction: DRAM address width*/ |
| #define VTA_MEMOP_SRAM_ADDR_BIT_WIDTH 16 |
| /*! Load/Store Instruction: DRAM address width*/ |
| #define VTA_MEMOP_DRAM_ADDR_BIT_WIDTH 32 |
| /*! Load/Store Instruction: transfer size width*/ |
| #define VTA_MEMOP_SIZE_BIT_WIDTH 16 |
| /*! Load/Store Instruction: stride size width*/ |
| #define VTA_MEMOP_STRIDE_BIT_WIDTH 16 |
| /*! Load/Store Instruction: padding width*/ |
| #define VTA_MEMOP_PAD_BIT_WIDTH 4 |
| /*! Load/Store Instruction: padding value encoding width*/ |
| #define VTA_MEMOP_PAD_VAL_BIT_WIDTH 2 |
| /*! GEMM/ALU Instruction: loop max iter bits */ |
| #define VTA_LOOP_ITER_WIDTH 14 |
| /*! ALU Instruction: immediate bitwidth*/ |
| #define VTA_ALUOP_IMM_BIT_WIDTH 16 |
| /*! ALU Instruction: shift arg bitwidth*/ |
| #define VTA_SHR_ARG_BIT_WIDTH (VTA_LOG_ACC_WIDTH) |
| /*! ALU Instruction: multiply arg bitwidth*/ |
| #define VTA_MUL_ARG_BIT_WIDTH 8 |
| |
| /*! Mem ID constant: uop memory */ |
| #define VTA_MEM_ID_UOP 0 |
| /*! Mem ID constant: weight memory */ |
| #define VTA_MEM_ID_WGT 1 |
| /*! Mem ID constant: input memory */ |
| #define VTA_MEM_ID_INP 2 |
| /*! Mem ID constant: accumulator/bias memory */ |
| #define VTA_MEM_ID_ACC 3 |
| /*! Mem ID constant: output store buffer */ |
| #define VTA_MEM_ID_OUT 4 |
| /*! Mem ID constant: accumulator/bias memory (from int_8 buffer) */ |
| #define VTA_MEM_ID_ACC_8BIT 5 |
| |
| #endif // VTA_HW_SPEC_CONST_H_ |