--- /dev/null
+`define RegFileSize 32 // describes the size of ht register file in the processor.
+`ifdef spfpu
+ `define FLEN 32
+`endif
+`ifdef dpfpu
+ `define FLEN 64
+`endif
+//`define fpu_hierarchical //Define this if you want hierarchical modules in verilog
+
+`include "instance_defines.bsv"
+
+//`define MMU
+`define PRFDEPTH 6
+`ifdef RV64
+ `define Burst_length_bits 8
+ `define byte_offset 2
+ `define DCACHE_ADDR 64
+ `define DCACHE_BLOCK_SIZE 4
+ `define DCACHE_WORD_SIZE 8
+/////////////////////////////MMU parameters///////////////////////////////////
+`define OFFSET 12
+`define ASID 8
+///////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////
+ // TLM2 Request Response definitions for Processor to Bus connection
+ `define TLM_PRM_CPU_REQ 4, 64, 64, 5, Bit #(0)
+ `define TLM_PRM_CPU_RSP 4, 64, 64, 5, Bit #(0)
+
+ // TLM2 Request Response definitions for Memory to Bus connection
+ `define TLM_PRM_MEM_REQ 4, 64, 64, 5, Bit #(0)
+ `define TLM_PRM_MEM_RSP 4, 64, 64, 5, Bit #(0)
+
+ // Axi Request Response definitions for Processor as a Master
+ `define AXI_PRM_CPU 4, 64, 64, 5, Bit #(0) // Fabric Interface
+ `define AXI_XTR_CPU TLMRequest #(`TLM_PRM_CPU_REQ), TLMResponse #(`TLM_PRM_CPU_RSP), `AXI_PRM_CPU // Transactor Interface
+
+ // Axi Request Response definitions for Memory as a Slave
+ `define AXI_PRM_MEM 4, 64, 64, 5, Bit #(0) // Fabric Interface
+ `define AXI_XTR_MEM TLMRequest #(`TLM_PRM_MEM_REQ), TLMResponse #(`TLM_PRM_MEM_RSP), `AXI_PRM_MEM // Transactor Interface
+///////////////////////////////////////////////////////////////////////////////
+`else
+ `define byte_offset 1
+ `define Addr_width 32 // the address width
+ `define DCACHE_ADDR 32
+ `define DCACHE_BLOCK_SIZE 8
+ `define DCACHE_WORD_SIZE 4
+///////////////////////////////////////////////////////////////////////////////
+ // TLM2 Request Response definitions for Processor to Bus connection
+ `define TLM_PRM_CPU_REQ 4, 32, 32, 5, Bit #(0)
+ `define TLM_PRM_CPU_RSP 4, 32, 32, 5, Bit #(0)
+
+ // TLM2 Request Response definitions for Memory to Bus connection
+ `define TLM_PRM_MEM_REQ 4, 32, 32, 5, Bit #(0)
+ `define TLM_PRM_MEM_RSP 4, 32, 32, 5, Bit #(0)
+
+ // Axi Request Response definitions for Processor as a Master
+ `define AXI_PRM_CPU 4, 32, 32, 5, Bit #(0) // Fabric Interface
+ `define AXI_XTR_CPU TLMRequest #(`TLM_PRM_CPU_REQ), TLMResponse #(`TLM_PRM_CPU_RSP), `AXI_PRM_CPU // Transactor Interface
+
+ // Axi Request Response definitions for Memory as a Slave
+ `define AXI_PRM_MEM 4, 32, 32, 5, Bit #(0) // Fabric Interface
+ `define AXI_XTR_MEM TLMRequest #(`TLM_PRM_MEM_REQ), TLMResponse #(`TLM_PRM_MEM_RSP), `AXI_PRM_MEM // Transactor Interface
+///////////////////////////////////////////////////////////////////////////////
+`endif
+
+`define Loop 1
+`define BAUD_RATE 130
+`ifdef verilog
+ `define Addr_space 22 //since we are leaving off the lower 2 bits of address(byte addressable memory), we have to
+`else
+ `define Addr_space 30
+`endif
+`ifdef simulate
+ `define BAUD_RATE 5 //130 //
+`endif
+`define INTERRUPT_PINS 64
+
+// Branch_predictor_paramters
+/////////////////////////// CACHE RELATED PARAMETERS ////////////////////////////////
+`define DCACHE_WAYS 4
+`define DCACHE_SETS 512
+
+`define ICACHE_WAYS 4 // way_bits =2
+`define ICACHE_BLOCK_SIZE 8 // word_bits = 3
+`define ICACHE_SETS 512 // set_bits =7
+`define ICACHE_WORD_SIZE 4 // byte_bits=2
+`define ICACHE_TAG_BITS 20 // tag_bits = 52
+`define DCACHE_TAG_BITS 20 // tag_bits = 52
+`define BTB_DEPTH 256
+`define RAS_DEPTH 8
+/////////////////////////////////////////////////////////////////////////////////////
+`ifdef RV64
+ `define MISA_BITS 'h141129 //'h082C849//// 'h40101121 // A + F + I + M + U
+ `define MXL_BITS 'h2
+`else
+ `define MISA_BITS 'h082C849 // 'h40101121 // A + F + I + M + U
+ `define MXL_BITS 'h1
+`endif
+`define MTVEC_DEFAULT 'h00000000
+`define STVEC_DEFAULT 'h00000000
+`define UTVEC_DEFAULT 'h00000000
+/////////////////////////// Register Mapping for Machine Mode Regs /////////////////
+`define MSTATUS 'h00 //'h300 // Machine Status register
+`define MISA 'h01 //'h301 // ISA and extensions
+`define MEDELEG 'h02 //'h302 // Machine exception delegation
+`define MIDELEG 'h03 //'h303 // Machine interrupt delegation
+`define MIE 'h04 //'h304 // Machine interrupt enable
+`define MTVEC 'h05 //'h305 // Machine trap-handler base address
+`define MCOUNTEREN 'h06 //'h306 // Machine counter setup register
+`define MHPMEVENTSTART 'h23 //'h323 // statr of event selectors
+`define MHPMEVENTEND 'h26 //'h326 // end of event selectors
+`define MSCRATCH 'h40 //'h340 // Scratch rgister for machine trap hanglers
+`define MEPC 'h41 //'h341 // Machine exception program counter
+`define MCAUSE 'h42 //'h342 // Machine trap cause
+`define MTVAL 'h43 //'h343 // Machine bad address
+`define MIP 'h44 //'h344 // Machine interrupt pending
+`define MPOWERCONTROL 'h45 //'h345 // 2 bits to control the power switches.
+`define PMPCFG0 'hA0 //'h3A0 //
+`ifndef RV64
+ `define PMPCFG1 'hA1 //'h3A1 // Physical Memory Protection Configuration Registers
+`endif
+`define PMPCFG2 'hA2 //'h3A2 // Physical Memory Protection Configuration Registers
+`ifndef RV64
+ `define PMPCFG3 'hA3 //'h3A3 // Physical Memory Protection Configuration Registers
+`endif
+`define PMPADDRSTART 'hB0 //PMP Address array start
+`define PMPADDREND 'hB7 //PMP Address array end
+`define MCYCLE 'h00 //'hB00 // Machine cycle counter
+`define MTIME 'h01 //'hB01 // mtime register (Non-standard r/w)
+`define MINSTRET 'h02 //'hB02 // Machine instructions retired.
+`define MHPMCOUNTSTART 'h03 //'hB03 // start address for performance counters
+`define MHPMCOUNTEND 'h05 //'hB05 // end address for performance counters
+`define MTIMECMP 'h20 //'hB20 // time compare register (Non-standard r/w)
+`define MCYCLEH 'h80 //'hB80 // Upper 32 bits of mcycle
+`define MTIMEH 'h81 //'hB81 // mtime hi-register (Non-standard r/w)
+`define MINSTRETH 'h82 //'hB82 // Upper 32 bits of minstret.
+`define MHPMCOUNTHSTART 'h83 //'hB83 // start address for performance counters higher bits
+`define MHPMCOUNTHEND 'h85 //'hB86 // end address for performance counters higher bits
+`define MTIMECMPH 'hA0 //'hBA0 // time compare hi-register (Non-standard r/w)
+`define MHPMTHRESSTART 'hA3 //'hBA3 // start of counter-thresholds
+`define MHPMTHRESEND 'hA5 //'hBA6 // end of counter-thresholds
+`define MVENDORID 'h11 //'hF11 // Vendor ID
+`define MARCHID 'h12 //'hF12 // Architecture ID
+`define MIMPID 'h13 //'hF13 // Implementation ID
+`define MHARTID 'h14 //'hF14 // Hardware Thread ID
+`define MBOOTSEQ 'h15 //'hF15 // Hardware Thread ID
+
+`define MHPMTHRESHSTART 'hE0 //'h7E0 // start of counter-thresholds
+`define MHPMTHRESHEND 'hE2 //'h7FC // end of counter-thresholds
+/////////////////////////// Register Mapping for Supervisor Mode Regs /////////////////
+`define SSTATUS 'h00 //'h100 // Supervisor Status register
+`define SEDELEG 'h02 //'h102 // Supervisor exception delegation
+`define SIDELEG 'h03 //'h103 // Supervisor interrupt delegation
+`define SIE 'h04 //'h104 // Supervisor interrupt enable
+`define STVEC 'h05 //'h105 // Supervisor trap-handler base address
+`define SCOUNTEREN 'h06 //'h106 // Supervisor counter setup register
+`define SSCRATCH 'h40 //'h140 // Scratch register for supervisor trap hanglers
+`define SEPC 'h41 //'h141 // Supervisor exception program counter
+`define SCAUSE 'h42 //'h142 // Supervisor trap cause
+`define STVAL 'h43 //'h143 // Supervisor bad address or illegal instruction
+`define SIP 'h44 //'h144 // Supervisor interrupt pending
+`define SATP 'h80 //'h180 // Supervisor interrupt pending
+
+/////////////////////////// Register Mapping for User Mode Regs /////////////////
+`define USTATUS 'h00 //'h000 // User status register
+`define FFLAGS 'h01 //'h001 // FP Accrued exceptions
+`define FRM 'h02 //'h002 // FP Dynamic rounding mode
+`define FCSR 'h03 //'h003 // FP Control and status register
+`define UIE 'h04 //'h004 // User interrupt enable register
+`define UTVEC 'h05 //'h005 // User trap handler base address
+`define USCRATCH 'h40 //'h040 // Scratch register for user trap handlers
+`define UEPC 'h41 //'h041 // User exception program counter
+`define UCAUSE 'h42 //'h042 // User trap cause
+`define UTVAL 'h43 //'h043 // User bad address or illegal instruction
+`define UIP 'h44 //'h044 // User interrupt pending
+`define UMEMSE 'h45 //'h045 // Machine Memory Structures enable
+`define UCYCLE 'h00 //'hC00 // cycle counter for RDCYCLE instruction.
+`define UTIME 'h01 //'hC01 // Tiemr for RDTIME instruction
+`define UINSTRET 'h02 //'hC02 // Instruction retired counter for RDINSTRET
+`define UCYCLEH 'h80 //'hC80 // Upper 32bits of UCYCLE
+`define UTIMEH 'h81 //'hC81 // Upper 32bits of UTIME
+`define UINSTRETH 'h82 //'hC82 // Upper 32bits of UINSTRET
+`define HPMCOUNTSTART 'h03 //'hC03 // start address for performance counters
+`define HPMCOUNTEND 'h05 //'hC06 // start address for performance counters
+`define HPMCOUNTHSTART 'h83 //'hC83 // start address for performance counters higher bits
+`define HPMCOUNTHEND 'h85 //'hC86 // end address for performance counters higher bits
+
+////////////////////////////////////////////////////////////////////////////////////
+/////////// Debug registers //////////////////////////
+`define DCSR 'hb0 //'h7b0
+`define DPC 'hb1 //'h7b1
+`define DSCRATCH0 'hb2 //'h7b2
+`define DSCRATCH1 'hb3 //'h7b3
+`define DENTRY 'hb4 //'h7b4 // holds the address of the debug entry for self loop
+`define TSELECT 'ha0 // 'h7a0 // holds the tselect information
+`define TDATA1 'ha1 // 'h7a1 // holds the first trigger data
+`define TDATA2 'ha2 // 'h7a2 // holds the first trigger data
+////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////// funct3 defintions for ISA ////////////////////
+`define JALR_f3 'b000
+`define BEQ_f3 'b000
+`define BNE_f3 'b001
+`define BLT_f3 'b100
+`define BGE_f3 'b101
+`define BLTU_f3 'b110
+`define BGEU_f3 'b111
+`define LB_f3 'b000
+`define Lh_f3 'b001
+`define LW_f3 'b010
+`define LBU_f3 'b100
+`define LHU_f3 'b101
+`define LWU_f3 'b110
+`define SB_f3 'b000
+`define SH_f3 'b001
+`define SW_f3 'b010
+`define ADD_SUB_f3 'b000
+`define SLT_SLTI_f3 'b010
+`define SLTU_SLTIU_f3 'b011
+`define XOR_XORI_f3 'b100
+`define OR_ORI_f3 'b110
+`define AND_ANDI_f3 'b111
+`define SLL_SLLI_f3 'b001
+`define SR_SRI_f3 'b101
+`define ECALL_f3 'b000
+`define EBREAK_f3 'b000
+`define CSRRW_f3 'b001
+`define CSRRS_f3 'b010
+`define CSRRC_f3 'b011
+`define CSRRWI_f3 'b101
+`define CSRRSI_f3 'b110
+`define CSRRCI_f3 'b111
+`define MUL_f3 'b000
+`define MULH_f3 'b001
+`define MULHSU_f3 'b010
+`define MULHU_f3 'b011
+`define DIV_f3 'b100
+`define DIVU_f3 'b101
+`define REM_f3 'b110
+`define REMU_f3 'b111
+`define ATOMIC_f3 'b010
+`define FENCE_f3 'b000
+`define FENCEI_f3 'b001
+/////////////////////////////////////////////////////////////////////////
+////////////////////// opcode definitions of ISA ////////////////////////
+`define LUI_op 'b01101
+`define AUIPC_op 'b00101
+`define JAL_op 'b11011
+`define JALR_op 'b11001
+`define BRANCH_op 'b11000
+`define LOAD_op 'b00000
+`define FLOAD_op 'b00001
+`define STORE_op 'b01000
+`define FSTORE_op 'b01001
+`define IMM_ARITH_op 'b00100
+`define ARITH_op 'b01100
+`ifdef RV64
+ `define IMM_ARITHW_op 'b00110
+ `define ARITHW_op 'b01110
+ `define MULDIVW_op 'b01110
+`endif
+`define CSR_op 'b11100
+`define MULDIV_op 'b01100
+`define ATOMIC_op 'b01011
+`define FMADD_op 'b10000
+`define FMSUB_op 'b10001
+`define FNMSUB_op 'b10010
+`define FNMADD_op 'b10011
+`define FLOAT_op 'b10100
+`define FENCE_op 'b00011
+//////////////////////////////////////////////////////////////////////////
+/////////////// funct7 deifnition of ISA /////////////////////////////////
+`define SLLI_f7 'b0000000
+`define LOGIC_SHIFT_f7 'b0000000
+`define ARITH_SHIFT_f7 'b0100000
+`define ARITH_f7 'b0000000
+`define SUB_f7 'b0100000
+`define MULDIV_f7 'b0000001
+`define SFENCE_VMA 'b0001001
+`define LR_f5 'b00010
+`define SC_f5 'b00011
+`define AMOSWAP_f5 'b00001
+`define AMOADD_f5 'b00000
+`define AMOXOR_f5 'b00100
+`define AMOAND_f5 'b01100
+`define AMOOR_f5 'b01000
+`define AMOMIN_f5 'b10000
+`define AMOMAX_f5 'b10100
+`define AMOMINU_f5 'b11000
+`define AMOMAXU_f5 'b11100
+`define AMOMIN_f5 'b10000
+`define AMOMAX_f5 'b10100
+
+
+`define FADD_f5 'b00000
+`define FSUB_f5 'b00001
+`define FMUL_f5 'b00010
+`define FDIV_f5 'b00011
+`define FSQRT_f5 'b01011
+`define FP_OPCODE 'b0100
+`define FCMP_f5 'b10100
+`define FMMAX_f5 'b00101
+`define FCVT_F_I_f5 'b11010
+`define FCVT_I_F_f5 'b11000
+`define FSGNJN_f5 'b00100
+`define FCLASS_f5 'b11100
+`define FCVT_S_D_f5 'b01000
+`define FMV_X_S_f7 'b1110000
+`define FMV_S_X_f7 'b1111000
+`define FMV_X_D_f7 'b1110001
+`define FMV_D_X_f7 'b1111001
+
+
+
+
+///////////////////////////////////////////////////////////////////////////
+///////////////// Event Values of Performance Counters ////////////////////
+`define PERFMONITORS 64
+`define CYCLECOUNTERS 13
+`define ICACHE_MISS 0
+`define ICACHE_CACHEABLE `ICACHE_MISS+1
+`define ICACHE_LINEREPLACE `ICACHE_CACHEABLE+1
+`define ICACHE_TLBMISS `ICACHE_LINEREPLACE+1
+`define ICACHE_MISALIGNED `ICACHE_TLBMISS+1
+`define ICACHE_PREFETCHMISS `ICACHE_MISALIGNED+1
+`define COND_BRANCH `ICACHE_PREFETCHMISS+1
+`define COND_BRANCH_TAKEN `COND_BRANCH+1
+`define COND_BRANCH_MISPREDICTED `COND_BRANCH_TAKEN+1
+`define TAKEN_BRANCH_MISPREDICTED `COND_BRANCH_MISPREDICTED+1
+`define UNCOND_JUMPS `TAKEN_BRANCH_MISPREDICTED+1
+`define SPFPU_INST `UNCOND_JUMPS+1
+`define DPFPU_INST `SPFPU_INST+1
+`define DCACHE_TLBMISS `DPFPU_INST+1
+`define TOTAL_LOADS `DCACHE_TLBMISS+1
+`define TOTAL_STORES `TOTAL_LOADS+1
+`define TOTAL_ATOMIC `TOTAL_STORES+1
+`define DCACHE_LOAD_MISS `TOTAL_ATOMIC+1
+`define DCACHE_STORE_MISS `DCACHE_LOAD_MISS+1
+`define DCACHE_ATOMIC_MISS `DCACHE_STORE_MISS+1
+`define DCACHE_CACHEABLE_LOAD `DCACHE_ATOMIC_MISS+1
+`define DCACHE_CACHEABLE_STORE `DCACHE_CACHEABLE_LOAD+1
+`define DCACHE_CACHEABLE_ATOMIC `DCACHE_CACHEABLE_STORE+1
+`define DCACHE_WRITEBACKS `DCACHE_CACHEABLE_ATOMIC+1
+`define DCACHE_LINEREPLACE `DCACHE_WRITEBACKS+1
+`define DCACHE_MISALIGNED `DCACHE_LINEREPLACE+1
+`define EXCEPTIONS_TAKEN `DCACHE_MISALIGNED+1
+`define INTERRUPTS_TAKEN `EXCEPTIONS_TAKEN+1
+`define MULDIV_INSTRUCTIONS `INTERRUPTS_TAKEN+1
+`define MEMORY_INSTRUCTIONS `MULDIV_INSTRUCTIONS+1
+`define EXEC_FLUSHES `MEMORY_INSTRUCTIONS+1
+`define WB_FLUSHES `EXEC_FLUSHES+1
+
+`define USERMODE_CYCLES 30
+`define SUPERVISORMODE_CYCLES 31
+`define MACHINEMODE_CYLES 32
+`define MISPREDICTION_STALLS 33
+`define INTERRUPT_STALLS 34
+`define DFENCE_CYCLES 35
+`define IFENCE_CYCLES 36
+`define DCACHE_MISS_CYCLES 37
+`define ICACHE_MISS_CYCLES 38
+`define FPBUSY_CYCLES 39
+`define DIVISIONBUSY_CYCLES 40
+`define TOTAL_STALL_CYCLES 41
+`define PAGEWALK_CYCLES 42
+`define COREBUS_CYCLES 43
+
+///////////////////////////////////////////////////////////////////////////////////
+/*====== Define the slave number of each peripheral=== */
+//`ifdef simulate
+// `define Sdram_slave_num 0
+// `define Sdram_cfg_slave_num `Sdram_slave_num
+// `define BootRom_slave_num `Sdram_cfg_slave_num+1
+// `define Uart0_slave_num `BootRom_slave_num+1
+// `define Uart1_slave_num `Uart0_slave_num+1
+// `define Debug_slave_num `Uart1_slave_num+1
+// `define Plic_slave_num `Debug_slave_num+1
+// `define Qspi0_slave_num `Plic_slave_num
+// `define Qspi1_slave_num `Qspi0_slave_num
+// `define Num_Slaves `Qspi1_slave_num
+//`else
+// `define Uart0_slave_num 0
+// `define Uart1_slave_num 1
+// `define Qspi0_slave_num 2
+// `define Qspi1_slave_num 3
+// `define I2c0_slave_num 4
+// `define I2c1_slave_num 5
+// `define Sdram_slave_num 6
+// `define Sdram_cfg_slave_num 7
+// `define Dma_slave_num 8
+// `define Hyperflash_mem_slave_num 9
+// `define Hyperflash_reg_slave_num 10
+// `define Debug_slave_num 11
+// `define AxiExp1_slave_num 12
+// `define GPIO_slave_num 13
+// `define BootRom_slave_num 14
+// `define PLIC_slave_num 15
+// `define TCM_slave_num 16
+//`endif
+/*=================================================== */
+
+/*===== Define the base address of each peripheral === */
+ `define DebugBase 'h00000000
+ `define DebugEnd 'h000000FF
+ `define BootRomBase 'h00001000
+ `define BootRomEnd 'h00010FFF
+ `define DMABase 'h00011600
+ `define DMAEnd 'h000116FF // TODO
+ `define SDRAMCfgBase 'h00011700
+ `define SDRAMCfgEnd 'h000117FF // 12 32-bit registers
+ `define TCMBase 'h00020000 //
+ `define TCMEnd 'h00040000 // 128KB
+ `define VMEBase 'h40000000
+ `define VMEEnd 'h4FFFFFFF // 1GB
+ `ifdef FlexBus_verify
+ `define FlexBusBase 'h80000000
+ `define FlexBusEnd 'h8FFFFFFF
+ `else
+ `define FlexBusBase 'h50000000
+ `define FlexBusEnd 'h5FFFFFFF
+ `endif
+ `ifdef FlexBus_verify
+ `define SDRAMMemBase 'h50000000
+ `define SDRAMMemEnd 'h5FFFFFFF // 1GB
+ `else
+ `define SDRAMMemBase 'h80000000
+ `define SDRAMMemEnd 'h8FFFFFFF // 1GB
+ `endif
+ `define AxiExp1Base 'hC0000000
+ `define AxiExp1End 'hFFFFFFFF
+/*=================================================== */
+/*== Define the range of bytes per peripheral====
+`ifdef simulate
+ `define MemCRange 'h7FFFFFFF
+ `define ConfigMRange 'h3000
+ `define DebugRange 'h44
+`else
+ `define BootRomRange 'hFFF //4KB for Now
+ `define GPIORange 'h8 //2 registers for GPIO
+ `define UART0Range 'h38 //8 Registers
+ `define UART1Range 'h38 //2 registers
+ `define I2C0Range 'h38 //6 Registers. Adding +2 to just have a backup, if at all it might be required
+ `define I2C1Range 'h38 //8 registers
+ `define DMARange 'hFF
+ `define SDRAMCfgRange 'h58 //12 registers
+ `define QSPI0CfgRange 'h60 //13 registers
+ `define QSPI1CfgRange 'h60 //13 registers
+ `define HyperCfgRange 'h70 //15 registers
+ `define SDRAMMemRange 'hFFFFFFF //512 MB
+ `define HyperMemRange 'hFFFFFFF //512 MB
+ `define QSPI0MemRange 'h7FFFFFFF //2 GB
+ `define QSPI1MemRange 'h7FFFFFFF //2 GB
+ `define AxiExpRange 'hFFFFFFFF //512 MB for now!
+ `define DebugRange 'h44 //16 Registers -- 32 bit
+`endif
+ /*=================================================== */
+
+++ /dev/null
-`define RegFileSize 32 // describes the size of ht register file in the processor.
-`ifdef spfpu
- `define FLEN 32
-`endif
-`ifdef dpfpu
- `define FLEN 64
-`endif
-//`define fpu_hierarchical //Define this if you want hierarchical modules in verilog
-
-`include "instance_defines.bsv"
-
-//`define MMU
-`define PRFDEPTH 6
-`ifdef RV64
- `define Burst_length_bits 8
- `define byte_offset 2
- `define DCACHE_ADDR 64
- `define DCACHE_BLOCK_SIZE 4
- `define DCACHE_WORD_SIZE 8
-/////////////////////////////MMU parameters///////////////////////////////////
-`define OFFSET 12
-`define ASID 8
-///////////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////////
- // TLM2 Request Response definitions for Processor to Bus connection
- `define TLM_PRM_CPU_REQ 4, 64, 64, 5, Bit #(0)
- `define TLM_PRM_CPU_RSP 4, 64, 64, 5, Bit #(0)
-
- // TLM2 Request Response definitions for Memory to Bus connection
- `define TLM_PRM_MEM_REQ 4, 64, 64, 5, Bit #(0)
- `define TLM_PRM_MEM_RSP 4, 64, 64, 5, Bit #(0)
-
- // Axi Request Response definitions for Processor as a Master
- `define AXI_PRM_CPU 4, 64, 64, 5, Bit #(0) // Fabric Interface
- `define AXI_XTR_CPU TLMRequest #(`TLM_PRM_CPU_REQ), TLMResponse #(`TLM_PRM_CPU_RSP), `AXI_PRM_CPU // Transactor Interface
-
- // Axi Request Response definitions for Memory as a Slave
- `define AXI_PRM_MEM 4, 64, 64, 5, Bit #(0) // Fabric Interface
- `define AXI_XTR_MEM TLMRequest #(`TLM_PRM_MEM_REQ), TLMResponse #(`TLM_PRM_MEM_RSP), `AXI_PRM_MEM // Transactor Interface
-///////////////////////////////////////////////////////////////////////////////
-`else
- `define byte_offset 1
- `define Addr_width 32 // the address width
- `define DCACHE_ADDR 32
- `define DCACHE_BLOCK_SIZE 8
- `define DCACHE_WORD_SIZE 4
-///////////////////////////////////////////////////////////////////////////////
- // TLM2 Request Response definitions for Processor to Bus connection
- `define TLM_PRM_CPU_REQ 4, 32, 32, 5, Bit #(0)
- `define TLM_PRM_CPU_RSP 4, 32, 32, 5, Bit #(0)
-
- // TLM2 Request Response definitions for Memory to Bus connection
- `define TLM_PRM_MEM_REQ 4, 32, 32, 5, Bit #(0)
- `define TLM_PRM_MEM_RSP 4, 32, 32, 5, Bit #(0)
-
- // Axi Request Response definitions for Processor as a Master
- `define AXI_PRM_CPU 4, 32, 32, 5, Bit #(0) // Fabric Interface
- `define AXI_XTR_CPU TLMRequest #(`TLM_PRM_CPU_REQ), TLMResponse #(`TLM_PRM_CPU_RSP), `AXI_PRM_CPU // Transactor Interface
-
- // Axi Request Response definitions for Memory as a Slave
- `define AXI_PRM_MEM 4, 32, 32, 5, Bit #(0) // Fabric Interface
- `define AXI_XTR_MEM TLMRequest #(`TLM_PRM_MEM_REQ), TLMResponse #(`TLM_PRM_MEM_RSP), `AXI_PRM_MEM // Transactor Interface
-///////////////////////////////////////////////////////////////////////////////
-`endif
-
-`define Loop 1
-`define BAUD_RATE 130
-`ifdef verilog
- `define Addr_space 22 //since we are leaving off the lower 2 bits of address(byte addressable memory), we have to
-`else
- `define Addr_space 30
-`endif
-`ifdef simulate
- `define BAUD_RATE 5 //130 //
-`endif
-`define INTERRUPT_PINS 64
-
-// Branch_predictor_paramters
-/////////////////////////// CACHE RELATED PARAMETERS ////////////////////////////////
-`define DCACHE_WAYS 4
-`define DCACHE_SETS 512
-
-`define ICACHE_WAYS 4 // way_bits =2
-`define ICACHE_BLOCK_SIZE 8 // word_bits = 3
-`define ICACHE_SETS 512 // set_bits =7
-`define ICACHE_WORD_SIZE 4 // byte_bits=2
-`define ICACHE_TAG_BITS 20 // tag_bits = 52
-`define DCACHE_TAG_BITS 20 // tag_bits = 52
-`define BTB_DEPTH 256
-`define RAS_DEPTH 8
-/////////////////////////////////////////////////////////////////////////////////////
-`ifdef RV64
- `define MISA_BITS 'h141129 //'h082C849//// 'h40101121 // A + F + I + M + U
- `define MXL_BITS 'h2
-`else
- `define MISA_BITS 'h082C849 // 'h40101121 // A + F + I + M + U
- `define MXL_BITS 'h1
-`endif
-`define MTVEC_DEFAULT 'h00000000
-`define STVEC_DEFAULT 'h00000000
-`define UTVEC_DEFAULT 'h00000000
-/////////////////////////// Register Mapping for Machine Mode Regs /////////////////
-`define MSTATUS 'h00 //'h300 // Machine Status register
-`define MISA 'h01 //'h301 // ISA and extensions
-`define MEDELEG 'h02 //'h302 // Machine exception delegation
-`define MIDELEG 'h03 //'h303 // Machine interrupt delegation
-`define MIE 'h04 //'h304 // Machine interrupt enable
-`define MTVEC 'h05 //'h305 // Machine trap-handler base address
-`define MCOUNTEREN 'h06 //'h306 // Machine counter setup register
-`define MHPMEVENTSTART 'h23 //'h323 // statr of event selectors
-`define MHPMEVENTEND 'h26 //'h326 // end of event selectors
-`define MSCRATCH 'h40 //'h340 // Scratch rgister for machine trap hanglers
-`define MEPC 'h41 //'h341 // Machine exception program counter
-`define MCAUSE 'h42 //'h342 // Machine trap cause
-`define MTVAL 'h43 //'h343 // Machine bad address
-`define MIP 'h44 //'h344 // Machine interrupt pending
-`define MPOWERCONTROL 'h45 //'h345 // 2 bits to control the power switches.
-`define PMPCFG0 'hA0 //'h3A0 //
-`ifndef RV64
- `define PMPCFG1 'hA1 //'h3A1 // Physical Memory Protection Configuration Registers
-`endif
-`define PMPCFG2 'hA2 //'h3A2 // Physical Memory Protection Configuration Registers
-`ifndef RV64
- `define PMPCFG3 'hA3 //'h3A3 // Physical Memory Protection Configuration Registers
-`endif
-`define PMPADDRSTART 'hB0 //PMP Address array start
-`define PMPADDREND 'hB7 //PMP Address array end
-`define MCYCLE 'h00 //'hB00 // Machine cycle counter
-`define MTIME 'h01 //'hB01 // mtime register (Non-standard r/w)
-`define MINSTRET 'h02 //'hB02 // Machine instructions retired.
-`define MHPMCOUNTSTART 'h03 //'hB03 // start address for performance counters
-`define MHPMCOUNTEND 'h05 //'hB05 // end address for performance counters
-`define MTIMECMP 'h20 //'hB20 // time compare register (Non-standard r/w)
-`define MCYCLEH 'h80 //'hB80 // Upper 32 bits of mcycle
-`define MTIMEH 'h81 //'hB81 // mtime hi-register (Non-standard r/w)
-`define MINSTRETH 'h82 //'hB82 // Upper 32 bits of minstret.
-`define MHPMCOUNTHSTART 'h83 //'hB83 // start address for performance counters higher bits
-`define MHPMCOUNTHEND 'h85 //'hB86 // end address for performance counters higher bits
-`define MTIMECMPH 'hA0 //'hBA0 // time compare hi-register (Non-standard r/w)
-`define MHPMTHRESSTART 'hA3 //'hBA3 // start of counter-thresholds
-`define MHPMTHRESEND 'hA5 //'hBA6 // end of counter-thresholds
-`define MVENDORID 'h11 //'hF11 // Vendor ID
-`define MARCHID 'h12 //'hF12 // Architecture ID
-`define MIMPID 'h13 //'hF13 // Implementation ID
-`define MHARTID 'h14 //'hF14 // Hardware Thread ID
-`define MBOOTSEQ 'h15 //'hF15 // Hardware Thread ID
-
-`define MHPMTHRESHSTART 'hE0 //'h7E0 // start of counter-thresholds
-`define MHPMTHRESHEND 'hE2 //'h7FC // end of counter-thresholds
-/////////////////////////// Register Mapping for Supervisor Mode Regs /////////////////
-`define SSTATUS 'h00 //'h100 // Supervisor Status register
-`define SEDELEG 'h02 //'h102 // Supervisor exception delegation
-`define SIDELEG 'h03 //'h103 // Supervisor interrupt delegation
-`define SIE 'h04 //'h104 // Supervisor interrupt enable
-`define STVEC 'h05 //'h105 // Supervisor trap-handler base address
-`define SCOUNTEREN 'h06 //'h106 // Supervisor counter setup register
-`define SSCRATCH 'h40 //'h140 // Scratch register for supervisor trap hanglers
-`define SEPC 'h41 //'h141 // Supervisor exception program counter
-`define SCAUSE 'h42 //'h142 // Supervisor trap cause
-`define STVAL 'h43 //'h143 // Supervisor bad address or illegal instruction
-`define SIP 'h44 //'h144 // Supervisor interrupt pending
-`define SATP 'h80 //'h180 // Supervisor interrupt pending
-
-/////////////////////////// Register Mapping for User Mode Regs /////////////////
-`define USTATUS 'h00 //'h000 // User status register
-`define FFLAGS 'h01 //'h001 // FP Accrued exceptions
-`define FRM 'h02 //'h002 // FP Dynamic rounding mode
-`define FCSR 'h03 //'h003 // FP Control and status register
-`define UIE 'h04 //'h004 // User interrupt enable register
-`define UTVEC 'h05 //'h005 // User trap handler base address
-`define USCRATCH 'h40 //'h040 // Scratch register for user trap handlers
-`define UEPC 'h41 //'h041 // User exception program counter
-`define UCAUSE 'h42 //'h042 // User trap cause
-`define UTVAL 'h43 //'h043 // User bad address or illegal instruction
-`define UIP 'h44 //'h044 // User interrupt pending
-`define UMEMSE 'h45 //'h045 // Machine Memory Structures enable
-`define UCYCLE 'h00 //'hC00 // cycle counter for RDCYCLE instruction.
-`define UTIME 'h01 //'hC01 // Tiemr for RDTIME instruction
-`define UINSTRET 'h02 //'hC02 // Instruction retired counter for RDINSTRET
-`define UCYCLEH 'h80 //'hC80 // Upper 32bits of UCYCLE
-`define UTIMEH 'h81 //'hC81 // Upper 32bits of UTIME
-`define UINSTRETH 'h82 //'hC82 // Upper 32bits of UINSTRET
-`define HPMCOUNTSTART 'h03 //'hC03 // start address for performance counters
-`define HPMCOUNTEND 'h05 //'hC06 // start address for performance counters
-`define HPMCOUNTHSTART 'h83 //'hC83 // start address for performance counters higher bits
-`define HPMCOUNTHEND 'h85 //'hC86 // end address for performance counters higher bits
-
-////////////////////////////////////////////////////////////////////////////////////
-/////////// Debug registers //////////////////////////
-`define DCSR 'hb0 //'h7b0
-`define DPC 'hb1 //'h7b1
-`define DSCRATCH0 'hb2 //'h7b2
-`define DSCRATCH1 'hb3 //'h7b3
-`define DENTRY 'hb4 //'h7b4 // holds the address of the debug entry for self loop
-`define TSELECT 'ha0 // 'h7a0 // holds the tselect information
-`define TDATA1 'ha1 // 'h7a1 // holds the first trigger data
-`define TDATA2 'ha2 // 'h7a2 // holds the first trigger data
-////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////// funct3 defintions for ISA ////////////////////
-`define JALR_f3 'b000
-`define BEQ_f3 'b000
-`define BNE_f3 'b001
-`define BLT_f3 'b100
-`define BGE_f3 'b101
-`define BLTU_f3 'b110
-`define BGEU_f3 'b111
-`define LB_f3 'b000
-`define Lh_f3 'b001
-`define LW_f3 'b010
-`define LBU_f3 'b100
-`define LHU_f3 'b101
-`define LWU_f3 'b110
-`define SB_f3 'b000
-`define SH_f3 'b001
-`define SW_f3 'b010
-`define ADD_SUB_f3 'b000
-`define SLT_SLTI_f3 'b010
-`define SLTU_SLTIU_f3 'b011
-`define XOR_XORI_f3 'b100
-`define OR_ORI_f3 'b110
-`define AND_ANDI_f3 'b111
-`define SLL_SLLI_f3 'b001
-`define SR_SRI_f3 'b101
-`define ECALL_f3 'b000
-`define EBREAK_f3 'b000
-`define CSRRW_f3 'b001
-`define CSRRS_f3 'b010
-`define CSRRC_f3 'b011
-`define CSRRWI_f3 'b101
-`define CSRRSI_f3 'b110
-`define CSRRCI_f3 'b111
-`define MUL_f3 'b000
-`define MULH_f3 'b001
-`define MULHSU_f3 'b010
-`define MULHU_f3 'b011
-`define DIV_f3 'b100
-`define DIVU_f3 'b101
-`define REM_f3 'b110
-`define REMU_f3 'b111
-`define ATOMIC_f3 'b010
-`define FENCE_f3 'b000
-`define FENCEI_f3 'b001
-/////////////////////////////////////////////////////////////////////////
-////////////////////// opcode definitions of ISA ////////////////////////
-`define LUI_op 'b01101
-`define AUIPC_op 'b00101
-`define JAL_op 'b11011
-`define JALR_op 'b11001
-`define BRANCH_op 'b11000
-`define LOAD_op 'b00000
-`define FLOAD_op 'b00001
-`define STORE_op 'b01000
-`define FSTORE_op 'b01001
-`define IMM_ARITH_op 'b00100
-`define ARITH_op 'b01100
-`ifdef RV64
- `define IMM_ARITHW_op 'b00110
- `define ARITHW_op 'b01110
- `define MULDIVW_op 'b01110
-`endif
-`define CSR_op 'b11100
-`define MULDIV_op 'b01100
-`define ATOMIC_op 'b01011
-`define FMADD_op 'b10000
-`define FMSUB_op 'b10001
-`define FNMSUB_op 'b10010
-`define FNMADD_op 'b10011
-`define FLOAT_op 'b10100
-`define FENCE_op 'b00011
-//////////////////////////////////////////////////////////////////////////
-/////////////// funct7 deifnition of ISA /////////////////////////////////
-`define SLLI_f7 'b0000000
-`define LOGIC_SHIFT_f7 'b0000000
-`define ARITH_SHIFT_f7 'b0100000
-`define ARITH_f7 'b0000000
-`define SUB_f7 'b0100000
-`define MULDIV_f7 'b0000001
-`define SFENCE_VMA 'b0001001
-`define LR_f5 'b00010
-`define SC_f5 'b00011
-`define AMOSWAP_f5 'b00001
-`define AMOADD_f5 'b00000
-`define AMOXOR_f5 'b00100
-`define AMOAND_f5 'b01100
-`define AMOOR_f5 'b01000
-`define AMOMIN_f5 'b10000
-`define AMOMAX_f5 'b10100
-`define AMOMINU_f5 'b11000
-`define AMOMAXU_f5 'b11100
-`define AMOMIN_f5 'b10000
-`define AMOMAX_f5 'b10100
-
-
-`define FADD_f5 'b00000
-`define FSUB_f5 'b00001
-`define FMUL_f5 'b00010
-`define FDIV_f5 'b00011
-`define FSQRT_f5 'b01011
-`define FP_OPCODE 'b0100
-`define FCMP_f5 'b10100
-`define FMMAX_f5 'b00101
-`define FCVT_F_I_f5 'b11010
-`define FCVT_I_F_f5 'b11000
-`define FSGNJN_f5 'b00100
-`define FCLASS_f5 'b11100
-`define FCVT_S_D_f5 'b01000
-`define FMV_X_S_f7 'b1110000
-`define FMV_S_X_f7 'b1111000
-`define FMV_X_D_f7 'b1110001
-`define FMV_D_X_f7 'b1111001
-
-
-
-
-///////////////////////////////////////////////////////////////////////////
-///////////////// Event Values of Performance Counters ////////////////////
-`define PERFMONITORS 64
-`define CYCLECOUNTERS 13
-`define ICACHE_MISS 0
-`define ICACHE_CACHEABLE `ICACHE_MISS+1
-`define ICACHE_LINEREPLACE `ICACHE_CACHEABLE+1
-`define ICACHE_TLBMISS `ICACHE_LINEREPLACE+1
-`define ICACHE_MISALIGNED `ICACHE_TLBMISS+1
-`define ICACHE_PREFETCHMISS `ICACHE_MISALIGNED+1
-`define COND_BRANCH `ICACHE_PREFETCHMISS+1
-`define COND_BRANCH_TAKEN `COND_BRANCH+1
-`define COND_BRANCH_MISPREDICTED `COND_BRANCH_TAKEN+1
-`define TAKEN_BRANCH_MISPREDICTED `COND_BRANCH_MISPREDICTED+1
-`define UNCOND_JUMPS `TAKEN_BRANCH_MISPREDICTED+1
-`define SPFPU_INST `UNCOND_JUMPS+1
-`define DPFPU_INST `SPFPU_INST+1
-`define DCACHE_TLBMISS `DPFPU_INST+1
-`define TOTAL_LOADS `DCACHE_TLBMISS+1
-`define TOTAL_STORES `TOTAL_LOADS+1
-`define TOTAL_ATOMIC `TOTAL_STORES+1
-`define DCACHE_LOAD_MISS `TOTAL_ATOMIC+1
-`define DCACHE_STORE_MISS `DCACHE_LOAD_MISS+1
-`define DCACHE_ATOMIC_MISS `DCACHE_STORE_MISS+1
-`define DCACHE_CACHEABLE_LOAD `DCACHE_ATOMIC_MISS+1
-`define DCACHE_CACHEABLE_STORE `DCACHE_CACHEABLE_LOAD+1
-`define DCACHE_CACHEABLE_ATOMIC `DCACHE_CACHEABLE_STORE+1
-`define DCACHE_WRITEBACKS `DCACHE_CACHEABLE_ATOMIC+1
-`define DCACHE_LINEREPLACE `DCACHE_WRITEBACKS+1
-`define DCACHE_MISALIGNED `DCACHE_LINEREPLACE+1
-`define EXCEPTIONS_TAKEN `DCACHE_MISALIGNED+1
-`define INTERRUPTS_TAKEN `EXCEPTIONS_TAKEN+1
-`define MULDIV_INSTRUCTIONS `INTERRUPTS_TAKEN+1
-`define MEMORY_INSTRUCTIONS `MULDIV_INSTRUCTIONS+1
-`define EXEC_FLUSHES `MEMORY_INSTRUCTIONS+1
-`define WB_FLUSHES `EXEC_FLUSHES+1
-
-`define USERMODE_CYCLES 30
-`define SUPERVISORMODE_CYCLES 31
-`define MACHINEMODE_CYLES 32
-`define MISPREDICTION_STALLS 33
-`define INTERRUPT_STALLS 34
-`define DFENCE_CYCLES 35
-`define IFENCE_CYCLES 36
-`define DCACHE_MISS_CYCLES 37
-`define ICACHE_MISS_CYCLES 38
-`define FPBUSY_CYCLES 39
-`define DIVISIONBUSY_CYCLES 40
-`define TOTAL_STALL_CYCLES 41
-`define PAGEWALK_CYCLES 42
-`define COREBUS_CYCLES 43
-
-///////////////////////////////////////////////////////////////////////////////////
-/*====== Define the slave number of each peripheral=== */
-//`ifdef simulate
-// `define Sdram_slave_num 0
-// `define Sdram_cfg_slave_num `Sdram_slave_num
-// `define BootRom_slave_num `Sdram_cfg_slave_num+1
-// `define Uart0_slave_num `BootRom_slave_num+1
-// `define Uart1_slave_num `Uart0_slave_num+1
-// `define Debug_slave_num `Uart1_slave_num+1
-// `define Plic_slave_num `Debug_slave_num+1
-// `define Qspi0_slave_num `Plic_slave_num
-// `define Qspi1_slave_num `Qspi0_slave_num
-// `define Num_Slaves `Qspi1_slave_num
-//`else
-// `define Uart0_slave_num 0
-// `define Uart1_slave_num 1
-// `define Qspi0_slave_num 2
-// `define Qspi1_slave_num 3
-// `define I2c0_slave_num 4
-// `define I2c1_slave_num 5
-// `define Sdram_slave_num 6
-// `define Sdram_cfg_slave_num 7
-// `define Dma_slave_num 8
-// `define Hyperflash_mem_slave_num 9
-// `define Hyperflash_reg_slave_num 10
-// `define Debug_slave_num 11
-// `define AxiExp1_slave_num 12
-// `define GPIO_slave_num 13
-// `define BootRom_slave_num 14
-// `define PLIC_slave_num 15
-// `define TCM_slave_num 16
-//`endif
-/*=================================================== */
-
-/*===== Define the base address of each peripheral === */
- `define DebugBase 'h00000000
- `define DebugEnd 'h000000FF
- `define BootRomBase 'h00001000
- `define BootRomEnd 'h00010FFF
- `define DMABase 'h00011600
- `define DMAEnd 'h000116FF // TODO
- `define SDRAMCfgBase 'h00011700
- `define SDRAMCfgEnd 'h000117FF // 12 32-bit registers
- `define TCMBase 'h00020000 //
- `define TCMEnd 'h00040000 // 128KB
- `define VMEBase 'h40000000
- `define VMEEnd 'h4FFFFFFF // 1GB
- `ifdef FlexBus_verify
- `define FlexBusBase 'h80000000
- `define FlexBusEnd 'h8FFFFFFF
- `else
- `define FlexBusBase 'h50000000
- `define FlexBusEnd 'h5FFFFFFF
- `endif
- `ifdef FlexBus_verify
- `define SDRAMMemBase 'h50000000
- `define SDRAMMemEnd 'h5FFFFFFF // 1GB
- `else
- `define SDRAMMemBase 'h80000000
- `define SDRAMMemEnd 'h8FFFFFFF // 1GB
- `endif
- `define AxiExp1Base 'hC0000000
- `define AxiExp1End 'hFFFFFFFF
-/*=================================================== */
-/*== Define the range of bytes per peripheral====
-`ifdef simulate
- `define MemCRange 'h7FFFFFFF
- `define ConfigMRange 'h3000
- `define DebugRange 'h44
-`else
- `define BootRomRange 'hFFF //4KB for Now
- `define GPIORange 'h8 //2 registers for GPIO
- `define UART0Range 'h38 //8 Registers
- `define UART1Range 'h38 //2 registers
- `define I2C0Range 'h38 //6 Registers. Adding +2 to just have a backup, if at all it might be required
- `define I2C1Range 'h38 //8 registers
- `define DMARange 'hFF
- `define SDRAMCfgRange 'h58 //12 registers
- `define QSPI0CfgRange 'h60 //13 registers
- `define QSPI1CfgRange 'h60 //13 registers
- `define HyperCfgRange 'h70 //15 registers
- `define SDRAMMemRange 'hFFFFFFF //512 MB
- `define HyperMemRange 'hFFFFFFF //512 MB
- `define QSPI0MemRange 'h7FFFFFFF //2 GB
- `define QSPI1MemRange 'h7FFFFFFF //2 GB
- `define AxiExpRange 'hFFFFFFFF //512 MB for now!
- `define DebugRange 'h44 //16 Registers -- 32 bit
-`endif
- /*=================================================== */
-