CAPI=2:
# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
name: "lowrisc:ibex:ibex_core:0.1"
description: "Ibex CPU Core Components"

filesets:
  files_rtl:
    depend:
      - lowrisc:prim:assert
      - lowrisc:prim:clock_gating
      - lowrisc:prim:lfsr
      - lowrisc:ibex:ibex_pkg
      - lowrisc:ibex:ibex_icache
      - lowrisc:dv:dv_fcov_macros
    files:
      - rtl/ibex_alu.sv
      - rtl/ibex_branch_predict.sv
      - rtl/ibex_compressed_decoder.sv
      - rtl/ibex_controller.sv
      - rtl/ibex_cs_registers.sv
      - rtl/ibex_csr.sv
      - rtl/ibex_counter.sv
      - rtl/ibex_decoder.sv
      - rtl/ibex_ex_block.sv
      - rtl/ibex_fetch_fifo.sv
      - rtl/ibex_id_stage.sv
      - rtl/ibex_if_stage.sv
      - rtl/ibex_load_store_unit.sv
      - rtl/ibex_multdiv_fast.sv
      - rtl/ibex_multdiv_slow.sv
      - rtl/ibex_prefetch_buffer.sv
      - rtl/ibex_pmp.sv
      - rtl/neural_unit.sv
      - rtl/neur_decoder.sv
      - rtl/neur_out_unit.sv
      - rtl/mul_add_block.sv
      - rtl/mult_block.sv
      - rtl/mult_16_bits.sv
      - rtl/add_block.sv
      - rtl/adder_32_bits.sv
      - rtl/ibex_wb_stage.sv
      - rtl/ibex_dummy_instr.sv
      - rtl/ibex_core.sv
      - rtl/ibex_pmp_reset_default.svh: {is_include_file: true}
    file_type: systemVerilogSource

  files_lint_verilator:
    files:
      - lint/verilator_waiver.vlt: {file_type: vlt}

  files_lint_verible:
    files:
      - lint/verible_waiver.vbw: {file_type: veribleLintWaiver}

  files_check_tool_requirements:
    depend:
     - lowrisc:tool:check_tool_requirements

parameters:
  RVFI:
    datatype: bool
    paramtype: vlogdefine

  SYNTHESIS:
    datatype: bool
    paramtype: vlogdefine

  FPGA_XILINX:
    datatype: bool
    description: Identifies Xilinx FPGA targets to set DSP pragmas for performance counters.
    default: false
    paramtype: vlogdefine

  RV32E:
    datatype: int
    default: 0
    paramtype: vlogparam

  RV32M:
    datatype: str
    default: ibex_pkg::RV32MFast
    paramtype: vlogdefine
    description: "RV32M implementation parameter enum. See the ibex_pkg::rv32m_e enum in ibex_pkg.sv for permitted values."

  RV32B:
    datatype: str
    default: ibex_pkg::RV32BNone
    paramtype: vlogdefine
    description: "Bitmanip implementation parameter enum. See the ibex_pkg::rv32b_e enum in ibex_pkg.sv for permitted values."

  RegFile:
    datatype: str
    default: ibex_pkg::RegFileFF
    paramtype: vlogdefine
    description: "Register file implementation parameter enum. See the ibex_pkg::regfile_e enum in ibex_pkg.sv for permitted values."

  ICache:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enable instruction cache"

  ICacheECC:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enable ECC protection in instruction cache"

  BranchTargetALU:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enables separate branch target ALU (increasing branch performance EXPERIMENTAL) [0/1]"

  WritebackStage:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enables third pipeline stage (EXPERIMENTAL) [0/1]"

  BranchPredictor:
    datatype: int
    paramtype: vlogparam
    default: 0
    description: "Enables static branch prediction (EXPERIMENTAL)"

  DbgTriggerEn:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enable support for debug triggers. "

  SecureIbex:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enables security hardening features (EXPERIMENTAL) [0/1]"

  ICacheScramble:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enables ICache scrambling feature (EXPERIMENTAL) [0/1]"

  PMPEnable:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Enable PMP"

  PMPGranularity:
    datatype: int
    default: 0
    paramtype: vlogparam
    description: "Granularity of NAPOT range, 0 = 4 byte, 1 = byte, 2 = 16 byte, 3 = 32 byte etc"

  PMPNumRegions:
    datatype: int
    default: 4
    paramtype: vlogparam
    description: "Number of PMP regions"

  MHPMCounterNum:
    datatype: int
    paramtype: vlogparam
    default: 0
    description: Number of performance monitor event counters [0/29]

  MHPMCounterWidth:
    datatype: int
    paramtype: vlogparam
    default: 40
    description: Bit width of performance monitor event counters [32/64]

targets:
  default: &default_target
    filesets:
      - tool_verilator ? (files_lint_verilator)
      - tool_veriblelint ? (files_lint_verible)
      - files_rtl
      - files_check_tool_requirements
    toplevel: ibex_core
    parameters:
      - tool_vivado ? (FPGA_XILINX=true)
  lint:
    <<: *default_target
    parameters:
      - SYNTHESIS=true
      - RVFI=true
    default_tool: verilator
    tools:
      verilator:
        mode: lint-only
        verilator_options:
          - "-Wall"
          # RAM primitives wider than 64bit (required for ECC) fail to build in
          # Verilator without increasing the unroll count (see Verilator#1266)
          - "--unroll-count 72"
  format:
    filesets:
      - files_rtl
    parameters:
      - SYNTHESIS=true
      - RVFI=true
    default_tool: veribleformat
    toplevel: ibex_core
    tools:
      veribleformat:
        verible_format_args:
          - "--inplace"
