📄 or1200_defines.v
字号:
`define OR1200_ICINDX `OR1200_ICSIZE-2 // 10`define OR1200_ICINDXH `OR1200_ICSIZE-1 // 11`define OR1200_ICTAGL `OR1200_ICINDXH+1 // 12`define OR1200_ICTAG `OR1200_ICSIZE-`OR1200_ICLS // 8`define OR1200_ICTAG_W 21`endif`ifdef OR1200_IC_1W_8KB`define OR1200_ICSIZE 13 // 8192`define OR1200_ICINDX `OR1200_ICSIZE-2 // 11`define OR1200_ICINDXH `OR1200_ICSIZE-1 // 12`define OR1200_ICTAGL `OR1200_ICINDXH+1 // 13`define OR1200_ICTAG `OR1200_ICSIZE-`OR1200_ICLS // 9`define OR1200_ICTAG_W 20`endif///////////////////////////////////////////////////// Data cache (DC)//// 3 for 8 bytes, 4 for 16 bytes etc`define OR1200_DCLS 4// Define to perform store refill (potential performance penalty)// `define OR1200_DC_STORE_REFILL//// DC configurations//`ifdef OR1200_DC_1W_4KB`define OR1200_DCSIZE 12 // 4096`define OR1200_DCINDX `OR1200_DCSIZE-2 // 10`define OR1200_DCINDXH `OR1200_DCSIZE-1 // 11`define OR1200_DCTAGL `OR1200_DCINDXH+1 // 12`define OR1200_DCTAG `OR1200_DCSIZE-`OR1200_DCLS // 8`define OR1200_DCTAG_W 21`endif`ifdef OR1200_DC_1W_8KB`define OR1200_DCSIZE 13 // 8192`define OR1200_DCINDX `OR1200_DCSIZE-2 // 11`define OR1200_DCINDXH `OR1200_DCSIZE-1 // 12`define OR1200_DCTAGL `OR1200_DCINDXH+1 // 13`define OR1200_DCTAG `OR1200_DCSIZE-`OR1200_DCLS // 9`define OR1200_DCTAG_W 20`endif///////////////////////////////////////////////////// Store buffer (SB)////// Store buffer//// It will improve performance by "caching" CPU stores// using store buffer. This is most important for function// prologues because DC can only work in write though mode// and all stores would have to complete external WB writes// to memory.// Store buffer is between DC and data BIU.// All stores will be stored into store buffer and immediately// completed by the CPU, even though actual external writes// will be performed later. As a consequence store buffer masks// all data bus errors related to stores (data bus errors// related to loads are delivered normally).// All pending CPU loads will wait until store buffer is empty to// ensure strict memory model. Right now this is necessary because// we don't make destinction between cached and cache inhibited// address space, so we simply empty store buffer until loads// can begin.//// It makes design a bit bigger, depending what is the number of// entries in SB FIFO. Number of entries can be changed further// down.////`define OR1200_SB_IMPLEMENTED//// Number of store buffer entries//// Verified number of entries are 4 and 8 entries// (2 and 3 for OR1200_SB_LOG). OR1200_SB_ENTRIES must// always match 2**OR1200_SB_LOG.// To disable store buffer, undefine// OR1200_SB_IMPLEMENTED.//`define OR1200_SB_LOG 2 // 2 or 3`define OR1200_SB_ENTRIES 4 // 4 or 8///////////////////////////////////////////////////// Quick Embedded Memory (QMEM)////// Quick Embedded Memory//// Instantiation of dedicated insn/data memory (RAM or ROM).// Insn fetch has effective throughput 1insn / clock cycle.// Data load takes two clock cycles / access, data store// takes 1 clock cycle / access (if there is no insn fetch)).// Memory instantiation is shared between insn and data,// meaning if insn fetch are performed, data load/store// performance will be lower.//// Main reason for QMEM is to put some time critical functions// into this memory and to have predictable and fast access// to these functions. (soft fpu, context switch, exception// handlers, stack, etc)//// It makes design a bit bigger and slower. QMEM sits behind// IMMU/DMMU so all addresses are physical (so the MMUs can be// used with QMEM and QMEM is seen by the CPU just like any other// memory in the system). IC/DC are sitting behind QMEM so the// whole design timing might be worse with QMEM implemented.//`define OR1200_QMEM_IMPLEMENTED//// Base address and mask of QMEM//// Base address defines first address of QMEM. Mask defines// QMEM range in address space. Actual size of QMEM is however// determined with instantiated RAM/ROM. However bigger// mask will reserve more address space for QMEM, but also// make design faster, while more tight mask will take// less address space but also make design slower. If// instantiated RAM/ROM is smaller than space reserved with// the mask, instatiated RAM/ROM will also be shadowed// at higher addresses in reserved space.//`define OR1200_QMEM_IADDR 32'h0080_0000`define OR1200_QMEM_IMASK 32'hfff0_0000 // Max QMEM size 1MB`define OR1200_QMEM_DADDR 32'h0080_0000`define OR1200_QMEM_DMASK 32'hfff0_0000 // Max QMEM size 1MB//// QMEM interface byte-select capability//// To enable qmem_sel* ports, define this macro.////`define OR1200_QMEM_BSEL//// QMEM interface acknowledge//// To enable qmem_ack port, define this macro.////`define OR1200_QMEM_ACK///////////////////////////////////////////////////////// VR, UPR and Configuration Registers////// VR, UPR and configuration registers are optional. If // implemented, operating system can automatically figure// out how to use the processor because it knows // what units are available in the processor and how they// are configured.//// This section must be last in or1200_defines.v file so// that all units are already configured and thus// configuration registers are properly set.// // Define if you want configuration registers implemented`define OR1200_CFGR_IMPLEMENTED// Define if you want full address decode inside SYS group`define OR1200_SYS_FULL_DECODE// Offsets of VR, UPR and CFGR registers`define OR1200_SPRGRP_SYS_VR 4'h0`define OR1200_SPRGRP_SYS_UPR 4'h1`define OR1200_SPRGRP_SYS_CPUCFGR 4'h2`define OR1200_SPRGRP_SYS_DMMUCFGR 4'h3`define OR1200_SPRGRP_SYS_IMMUCFGR 4'h4`define OR1200_SPRGRP_SYS_DCCFGR 4'h5`define OR1200_SPRGRP_SYS_ICCFGR 4'h6`define OR1200_SPRGRP_SYS_DCFGR 4'h7// VR fields`define OR1200_VR_REV_BITS 5:0`define OR1200_VR_RES1_BITS 15:6`define OR1200_VR_CFG_BITS 23:16`define OR1200_VR_VER_BITS 31:24// VR values`define OR1200_VR_REV 6'h01`define OR1200_VR_RES1 10'h000`define OR1200_VR_CFG 8'h00`define OR1200_VR_VER 8'h12// UPR fields`define OR1200_UPR_UP_BITS 0`define OR1200_UPR_DCP_BITS 1`define OR1200_UPR_ICP_BITS 2`define OR1200_UPR_DMP_BITS 3`define OR1200_UPR_IMP_BITS 4`define OR1200_UPR_MP_BITS 5`define OR1200_UPR_DUP_BITS 6`define OR1200_UPR_PCUP_BITS 7`define OR1200_UPR_PMP_BITS 8`define OR1200_UPR_PICP_BITS 9`define OR1200_UPR_TTP_BITS 10`define OR1200_UPR_RES1_BITS 23:11`define OR1200_UPR_CUP_BITS 31:24// UPR values`define OR1200_UPR_UP 1'b1`ifdef OR1200_NO_DC`define OR1200_UPR_DCP 1'b0`else`define OR1200_UPR_DCP 1'b1`endif`ifdef OR1200_NO_IC`define OR1200_UPR_ICP 1'b0`else`define OR1200_UPR_ICP 1'b1`endif`ifdef OR1200_NO_DMMU`define OR1200_UPR_DMP 1'b0`else`define OR1200_UPR_DMP 1'b1`endif`ifdef OR1200_NO_IMMU`define OR1200_UPR_IMP 1'b0`else`define OR1200_UPR_IMP 1'b1`endif`define OR1200_UPR_MP 1'b1 // MAC always present`ifdef OR1200_DU_IMPLEMENTED`define OR1200_UPR_DUP 1'b1`else`define OR1200_UPR_DUP 1'b0`endif`define OR1200_UPR_PCUP 1'b0 // Performance counters not present`ifdef OR1200_DU_IMPLEMENTED`define OR1200_UPR_PMP 1'b1`else`define OR1200_UPR_PMP 1'b0`endif`ifdef OR1200_DU_IMPLEMENTED`define OR1200_UPR_PICP 1'b1`else`define OR1200_UPR_PICP 1'b0`endif`ifdef OR1200_DU_IMPLEMENTED`define OR1200_UPR_TTP 1'b1`else`define OR1200_UPR_TTP 1'b0`endif`define OR1200_UPR_RES1 13'h0000`define OR1200_UPR_CUP 8'h00// CPUCFGR fields`define OR1200_CPUCFGR_NSGF_BITS 3:0`define OR1200_CPUCFGR_HGF_BITS 4`define OR1200_CPUCFGR_OB32S_BITS 5`define OR1200_CPUCFGR_OB64S_BITS 6`define OR1200_CPUCFGR_OF32S_BITS 7`define OR1200_CPUCFGR_OF64S_BITS 8`define OR1200_CPUCFGR_OV64S_BITS 9`define OR1200_CPUCFGR_RES1_BITS 31:10// CPUCFGR values`define OR1200_CPUCFGR_NSGF 4'h0`define OR1200_CPUCFGR_HGF 1'b0`define OR1200_CPUCFGR_OB32S 1'b1`define OR1200_CPUCFGR_OB64S 1'b0`define OR1200_CPUCFGR_OF32S 1'b0`define OR1200_CPUCFGR_OF64S 1'b0`define OR1200_CPUCFGR_OV64S 1'b0`define OR1200_CPUCFGR_RES1 22'h000000// DMMUCFGR fields`define OR1200_DMMUCFGR_NTW_BITS 1:0`define OR1200_DMMUCFGR_NTS_BITS 4:2`define OR1200_DMMUCFGR_NAE_BITS 7:5`define OR1200_DMMUCFGR_CRI_BITS 8`define OR1200_DMMUCFGR_PRI_BITS 9`define OR1200_DMMUCFGR_TEIRI_BITS 10`define OR1200_DMMUCFGR_HTR_BITS 11`define OR1200_DMMUCFGR_RES1_BITS 31:12// DMMUCFGR values`ifdef OR1200_NO_DMMU`define OR1200_DMMUCFGR_NTW 2'h0 // Irrelevant`define OR1200_DMMUCFGR_NTS 3'h0 // Irrelevant`define OR1200_DMMUCFGR_NAE 3'h0 // Irrelevant`define OR1200_DMMUCFGR_CRI 1'b0 // Irrelevant`define OR1200_DMMUCFGR_PRI 1'b0 // Irrelevant`define OR1200_DMMUCFGR_TEIRI 1'b0 // Irrelevant`define OR1200_DMMUCFGR_HTR 1'b0 // Irrelevant`define OR1200_DMMUCFGR_RES1 20'h00000`else`define OR1200_DMMUCFGR_NTW 2'h0 // 1 TLB way`define OR1200_DMMUCFGR_NTS 3'h`OR1200_DTLB_INDXW // Num TLB sets`define OR1200_DMMUCFGR_NAE 3'h0 // No ATB entries`define OR1200_DMMUCFGR_CRI 1'b0 // No control register`define OR1200_DMMUCFGR_PRI 1'b0 // No protection reg`define OR1200_DMMUCFGR_TEIRI 1'b1 // TLB entry inv reg impl.`define OR1200_DMMUCFGR_HTR 1'b0 // No HW TLB reload`define OR1200_DMMUCFGR_RES1 20'h00000`endif// IMMUCFGR fields`define OR1200_IMMUCFGR_NTW_BITS 1:0`define OR1200_IMMUCFGR_NTS_BITS 4:2`define OR1200_IMMUCFGR_NAE_BITS 7:5`define OR1200_IMMUCFGR_CRI_BITS 8`define OR1200_IMMUCFGR_PRI_BITS 9`define OR1200_IMMUCFGR_TEIRI_BITS 10`define OR1200_IMMUCFGR_HTR_BITS 11`define OR1200_IMMUCFGR_RES1_BITS 31:12// IMMUCFGR values`ifdef OR1200_NO_IMMU`define OR1200_IMMUCFGR_NTW 2'h0 // Irrelevant`define OR1200_IMMUCFGR_NTS 3'h0 // Irrelevant`define OR1200_IMMUCFGR_NAE 3'h0 // Irrelevant`define OR1200_IMMUCFGR_CRI 1'b0 // Irrelevant`define OR1200_IMMUCFGR_PRI 1'b0 // Irrelevant`define OR1200_IMMUCFGR_TEIRI 1'b0 // Irrelevant`define OR1200_IMMUCFGR_HTR 1'b0 // Irrelevant`define OR1200_IMMUCFGR_RES1 20'h00000`else`define OR1200_IMMUCFGR_NTW 2'h0 // 1 TLB way`define OR1200_IMMUCFGR_NTS 3'h`OR1200_ITLB_INDXW // Num TLB sets`define OR1200_IMMUCFGR_NAE 3'h0 // No ATB entry`define OR1200_IMMUCFGR_CRI 1'b0 // No control reg`define OR1200_IMMUCFGR_PRI 1'b0 // No protection reg`define OR1200_IMMUCFGR_TEIRI 1'b1 // TLB entry inv reg impl`define OR1200_IMMUCFGR_HTR 1'b0 // No HW TLB reload`define OR1200_IMMUCFGR_RES1 20'h00000`endif// DCCFGR fields`define OR1200_DCCFGR_NCW_BITS 2:0`define OR1200_DCCFGR_NCS_BITS 6:3`define OR1200_DCCFGR_CBS_BITS 7`define OR1200_DCCFGR_CWS_BITS 8`define OR1200_DCCFGR_CCRI_BITS 9`define OR1200_DCCFGR_CBIRI_BITS 10`define OR1200_DCCFGR_CBPRI_BITS 11`define OR1200_DCCFGR_CBLRI_BITS 12`define OR1200_DCCFGR_CBFRI_BITS 13`define OR1200_DCCFGR_CBWBRI_BITS 14`define OR1200_DCCFGR_RES1_BITS 31:15// DCCFGR values`ifdef OR1200_NO_DC`define OR1200_DCCFGR_NCW 3'h0 // Irrelevant`define OR1200_DCCFGR_NCS 4'h0 // Irrelevant`define OR1200_DCCFGR_CBS 1'b0 // Irrelevant`define OR1200_DCCFGR_CWS 1'b0 // Irrelevant`define OR1200_DCCFGR_CCRI 1'b1 // Irrelevant`define OR1200_DCCFGR_CBIRI 1'b1 // Irrelevant`define OR1200_DCCFGR_CBPRI 1'b0 // Irrelevant`define OR1200_DCCFGR_CBLRI 1'b0 // Irrelevant`define OR1200_DCCFGR_CBFRI 1'b1 // Irrelevant`define OR1200_DCCFGR_CBWBRI 1'b0 // Irrelevant`define OR1200_DCCFGR_RES1 17'h00000`else`define OR1200_DCCFGR_NCW 3'h0 // 1 cache way`define OR1200_DCCFGR_NCS (`OR1200_DCTAG) // Num cache sets`define OR1200_DCCFGR_CBS (`OR1200_DCLS-4) // 16 byte cache block`define OR1200_DCCFGR_CWS 1'b0 // Write-through strategy`define OR1200_DCCFGR_CCRI 1'b1 // Cache control reg impl.`define OR1200_DCCFGR_CBIRI 1'b1 // Cache block inv reg impl.`define OR1200_DCCFGR_CBPRI 1'b0 // Cache block prefetch reg not impl.`define OR1200_DCCFGR_CBLRI 1'b0 // Cache block lock reg not impl.`define OR1200_DCCFGR_CBFRI 1'b1 // Cache block flush reg impl.`define OR1200_DCCFGR_CBWBRI 1'b0 // Cache block WB reg not impl.`define OR1200_DCCFGR_RES1 17'h00000`endif// ICCFGR fields`define OR1200_ICCFGR_NCW_BITS 2:0`define OR1200_ICCFGR_NCS_BITS 6:3`define OR1200_ICCFGR_CBS_BITS 7`define OR1200_ICCFGR_CWS_BITS 8`define OR1200_ICCFGR_CCRI_BITS 9`define OR1200_ICCFGR_CBIRI_BITS 10`define OR1200_ICCFGR_CBPRI_BITS 11`define OR1200_ICCFGR_CBLRI_BITS 12`define OR1200_ICCFGR_CBFRI_BITS 13`define OR1200_ICCFGR_CBWBRI_BITS 14`define OR1200_ICCFGR_RES1_BITS 31:15// ICCFGR values`ifdef OR1200_NO_IC`define OR1200_ICCFGR_NCW 3'h0 // Irrelevant`define OR1200_ICCFGR_NCS 4'h0 // Irrelevant`define OR1200_ICCFGR_CBS 1'b0 // Irrelevant`define OR1200_ICCFGR_CWS 1'b0 // Irrelevant`define OR1200_ICCFGR_CCRI 1'b0 // Irrelevant`define OR1200_ICCFGR_CBIRI 1'b0 // Irrelevant`define OR1200_ICCFGR_CBPRI 1'b0 // Irrelevant`define OR1200_ICCFGR_CBLRI 1'b0 // Irrelevant`define OR1200_ICCFGR_CBFRI 1'b0 // Irrelevant`define OR1200_ICCFGR_CBWBRI 1'b0 // Irrelevant`define OR1200_ICCFGR_RES1 17'h00000`else`define OR1200_ICCFGR_NCW 3'h0 // 1 cache way`define OR1200_ICCFGR_NCS (`OR1200_ICTAG) // Num cache sets`define OR1200_ICCFGR_CBS (`OR1200_ICLS-4) // 16 byte cache block`define OR1200_ICCFGR_CWS 1'b0 // Irrelevant`define OR1200_ICCFGR_CCRI 1'b1 // Cache control reg impl.`define OR1200_ICCFGR_CBIRI 1'b1 // Cache block inv reg impl.`define OR1200_ICCFGR_CBPRI 1'b0 // Cache block prefetch reg not impl.`define OR1200_ICCFGR_CBLRI 1'b0 // Cache block lock reg not impl.`define OR1200_ICCFGR_CBFRI 1'b1 // Cache block flush reg impl.`define OR1200_ICCFGR_CBWBRI 1'b0 // Irrelevant`define OR1200_ICCFGR_RES1 17'h00000`endif// DCFGR fields`define OR1200_DCFGR_NDP_BITS 2:0`define OR1200_DCFGR_WPCI_BITS 3`define OR1200_DCFGR_RES1_BITS 31:4// DCFGR values`ifdef OR1200_DU_HWBKPTS`define OR1200_DCFGR_NDP 3'h`OR1200_DU_DVRDCR_PAIRS // # of DVR/DCR pairs`ifdef OR1200_DU_DWCR0`define OR1200_DCFGR_WPCI 1'b1`else`define OR1200_DCFGR_WPCI 1'b0 // WP counters not impl.`endif`else`define OR1200_DCFGR_NDP 3'h0 // Zero DVR/DCR pairs`define OR1200_DCFGR_WPCI 1'b0 // WP counters not impl.`endif`define OR1200_DCFGR_RES1 28'h0000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -