diff --git a/src/verilog/slcorem0.v b/src/verilog/slcorem0.v index caea7c2ae098766c6e2ad246bf90d237981936f7..7517ba238cf20d3f3590830862b60f5736773fcb 100644 --- a/src/verilog/slcorem0.v +++ b/src/verilog/slcorem0.v @@ -11,18 +11,19 @@ //----------------------------------------------------------------------------- module slcorem0 #( - parameter CLKGATE_PRESENT = 0, - parameter BE = 0, // 1: Big endian 0: little endian - parameter BKPT = 4, // Number of breakpoint comparators - parameter DBG = 1, // Debug configuration - parameter NUMIRQ = 32, // NUM of IRQ - parameter SMUL = 0, // Multiplier configuration - parameter SYST = 1, // SysTick - parameter WIC = 1, // Wake-up interrupt controller support - parameter WICLINES = 34, // Supported WIC lines - parameter WPT = 2, // Number of DWT comparators - parameter RESET_ALL_REGS = 0, // Do not reset all registers - parameter INCLUDE_JTAG = 0 // Do not Include JTAG feature + parameter CLKGATE_PRESENT = 0, + parameter BE = 0, // 1: Big endian 0: little endian + parameter BKPT = 4, // Number of breakpoint comparators + parameter DBG = 1, // Debug configuration + parameter NUMIRQ = 32, // NUM of IRQ + parameter SMUL = 0, // Multiplier configuration + parameter SYST = 1, // SysTick + parameter WIC = 1, // Wake-up interrupt controller support + parameter WICLINES = 34, // Supported WIC lines + parameter WPT = 2, // Number of DWT comparators + parameter RESET_ALL_REGS = 0, // Do not reset all registers + parameter INCLUDE_JTAG = 0, // Do not Include JTAG feature + parameter [31:0] ROMTABLE_BASE = 32'hE00FF003 // Defaultly Points to Core ROM Table )( // System Input Clocks and Resets input wire SYS_FCLK, // Free running clock @@ -167,20 +168,21 @@ module slcorem0 #( wire CORE_SHAREABLE; // Cortex-M0 Logic Instantiation - CORTEXM0INTEGRATION #( - .ACG (CLKGATE_PRESENT), // Architectural clock gating - .BE (BE), // Big-endian - .BKPT (BKPT), // Number of breakpoint comparators - .DBG (DBG), // Debug configuration - .JTAGnSW (INCLUDE_JTAG), // Debug port interface: JTAGnSW - .NUMIRQ (NUMIRQ), // Number of Interrupts - .RAR (RESET_ALL_REGS), // Reset All Registers - .SMUL (SMUL), // Multiplier configuration - .SYST (SYST), // SysTick - .WIC (WIC), // Wake-up interrupt controller support - .WICLINES (WICLINES), // Supported WIC lines - .WPT (WPT) // Number of DWT comparators - ) u_cortex_m0_integration ( + slcorem0_integration #( + .ACG (CLKGATE_PRESENT), // Architectural clock gating + .BE (BE), // Big-endian + .BKPT (BKPT), // Number of breakpoint comparators + .DBG (DBG), // Debug configuration + .JTAGnSW (INCLUDE_JTAG), // Debug port interface: JTAGnSW + .NUMIRQ (NUMIRQ), // Number of Interrupts + .RAR (RESET_ALL_REGS), // Reset All Registers + .SMUL (SMUL), // Multiplier configuration + .SYST (SYST), // SysTick + .WIC (WIC), // Wake-up interrupt controller support + .WICLINES (WICLINES), // Supported WIC lines + .WPT (WPT), // Number of DWT comparators + .ROMTABLE_BASE (ROMTABLE_BASE) + ) u_slcorem0_integration ( // System inputs .FCLK (SYS_FCLK), // FCLK .SCLK (CORE_SCLK), // SCLK generated from PMU diff --git a/src/verilog/slcorem0_integration.v b/src/verilog/slcorem0_integration.v new file mode 100644 index 0000000000000000000000000000000000000000..273370b190bb54446f35330d2b71e3bf7283da16 --- /dev/null +++ b/src/verilog/slcorem0_integration.v @@ -0,0 +1,429 @@ +//----------------------------------------------------------------------------- +// SLCore Core Integration +// - Modified Version of CORTEXM0INTEGRATION +// - Exposes ROM Table Wire +// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license. +// +// Contributors +// +// David Mapstone (d.a.mapstone@soton.ac.uk) +// +// Copyright (C) 2023, SoC Labs (www.soclabs.org) +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// The confidential and proprietary information contained in this file may +// only be used by a person authorised under and to the extent permitted +// by a subsisting licensing agreement from ARM Limited. +// +// (C) COPYRIGHT 2008-2009 ARM Limited. +// ALL RIGHTS RESERVED +// +// This entire notice must be reproduced on all copies of this file +// and copies of this file may only be made by a person if such person is +// permitted to do so under the terms of a subsisting license agreement +// from ARM Limited. +// +// SVN Information +// +// Checked In : $Date: 2009-03-21 16:43:18 +0000 (Sat, 21 Mar 2009) $ +// +// Revision : $Revision: 104871 $ +// +// Release Information : Cortex-M0-AT510-r0p0-00rel0 +//----------------------------------------------------------------------------- + +module slcorem0_integration + #( + // ---------------------------------------------------------------------- + // CORTEX-M0 INTEGRATION PER-INSTANCE PARAMETERIZATION: + // ---------------------------------------------------------------------- + parameter ACG = 1, // Architectural clock gating: + // 0 = absent + // 1 = present + // ---------------------------------------------------------------------- + parameter BE = 0, // Data transfer endianess: + // 0 = little-endian + // 1 = byte-invariant big-endian + // ---------------------------------------------------------------------- + parameter BKPT = 4, // Number of breakpoint comparators: + // 0 = none + // 1 = one + // 2 = two + // 3 = three + // 4 = four + // ---------------------------------------------------------------------- + parameter DBG = 1, // Debug configuration: + // 0 = no debug support + // 1 = implement debug support + // ---------------------------------------------------------------------- + parameter JTAGnSW = 0, // Debug port interface + // 0 = SerialWire interface + // 1 = JTAG interface + // ---------------------------------------------------------------------- + parameter NUMIRQ = 32, // Functional IRQ lines: + // 0 = none + // 1 = IRQ[0] + // 2 = IRQ[1:0] + // . . ... + // 32 = IRQ[31:0] + // ---------------------------------------------------------------------- + parameter RAR = 0, // Reset-all-register option + // 0 = standard, architectural reset + // 1 = extended, all register reset + // ---------------------------------------------------------------------- + parameter SMUL = 0, // Multiplier configuration: + // 0 = MULS is single cycle (fast) + // 1 = MULS takes 32-cycles (small) + // ---------------------------------------------------------------------- + parameter SYST = 1, // SysTick option: + // 0 = SysTick not present + // 1 = SysTick present + // ---------------------------------------------------------------------- + parameter WIC = 1, // Wake-up interrupt controller support: + // 0 = no support + // 1 = WIC deep-sleep supported + // ---------------------------------------------------------------------- + parameter WICLINES = 34, // Supported WIC lines: + // 2 = NMI and RXEV + // 3 = NMI, RXEV and IRQ[0] + // 4 = NMI, RXEV and IRQ[1:0] + // . . ... + // 34 = NMI, RXEV and IRQ[31:0] + // ---------------------------------------------------------------------- + parameter WPT = 2, // Number of DWT comparators + // 0 = none + // 1 = one + // 2 = two + // ---------------------------------------------------------------------- + parameter [31:0] ROMTABLE_BASE = 32'hE00FF003) // ROM Table Base Address + // - Defaultly points to Core ROMTABLE + // ---------------------------------------------------------------------- + + (// CLOCK AND RESETS + input wire FCLK, + input wire SCLK, + input wire HCLK, + input wire DCLK, + input wire PORESETn, + input wire DBGRESETn, + input wire HRESETn, + input wire SWCLKTCK, + input wire nTRST, + + // AHB-LITE MASTER PORT + output wire [31:0] HADDR, + output wire [ 2:0] HBURST, + output wire HMASTLOCK, + output wire [ 3:0] HPROT, + output wire [ 2:0] HSIZE, + output wire [ 1:0] HTRANS, + output wire [31:0] HWDATA, + output wire HWRITE, + input wire [31:0] HRDATA, + input wire HREADY, + input wire HRESP, + output wire HMASTER, + + // CODE SEQUENTIALITY AND SPECULATION + output wire CODENSEQ, + output wire [ 2:0] CODEHINTDE, + output wire SPECHTRANS, + + // DEBUG + input wire SWDITMS, + input wire TDI, + output wire SWDO, + output wire SWDOEN, + output wire TDO, + output wire nTDOEN, + input wire DBGRESTART, + output wire DBGRESTARTED, + input wire EDBGRQ, + output wire HALTED, + + // MISC + input wire NMI, + input wire [31:0] IRQ, + output wire TXEV, + input wire RXEV, + output wire LOCKUP, + output wire SYSRESETREQ, + input wire [25:0] STCALIB, + input wire STCLKEN, + input wire [ 7:0] IRQLATENCY, + input wire [27:0] ECOREVNUM, // [27:20] to DAP, [19:0] to core + + // POWER MANAGEMENT + output wire GATEHCLK, + output wire SLEEPING, + output wire SLEEPDEEP, + output wire WAKEUP, + output wire [33:0] WICSENSE, + input wire SLEEPHOLDREQn, + output wire SLEEPHOLDACKn, + input wire WICENREQ, + output wire WICENACK, + output wire CDBGPWRUPREQ, + input wire CDBGPWRUPACK, + + // SCAN IO + input wire SE, + input wire RSTBYPASS + ); + + // ------------------------------------------------------------ + // Configurability + // ------------------------------------------------------------ + + wire cfg_dbg = DBG != 0; // Reduce DBG param to a wire + + // ------------------------------------------------------------ + // Define sub-module interconnect wires + // ------------------------------------------------------------ + + wire dp_reset_n; // DAP DP reset (synchronised) + + wire [31:0] slv_rdata; // Core -> DAP read data + wire slv_ready; // Core -> DAP bus ready + wire slv_resp; // Core -> DAP error response + + wire wic_clear; // NVIC -> WIC clear + wire wic_ds_req_n; // WIC -> NVIC mode request + wire wic_ds_ack_n; // NVIC -> WIC mode acknowledge + wire wic_load; // NVIC -> WIC load + wire [31:0] wic_mask_isr; // NVIC -> WIC IRQs mask + wire wic_mask_nmi; // NVIC -> WIC NMI mask + wire wic_mask_rxev; // NVIC -> WIC RXEV mask + + wire [33:0] wic_pend; // interrupt pend lines + + wire [33:0] wic_sense; // WIC sensitivity output + + wire [31:0] slv_addr_dap; // DAP -> Core address + wire [31:0] slv_wdata_dap; // DAP -> Core write data + wire [ 1:0] slv_trans_dap; // DAP -> Core transaction + wire slv_write_dap; // DAP -> Core write + wire [ 1:0] slv_size_dap; // DAP -> Core size + + wire sw_do; // DAP serial-wire output + wire sw_do_en; // DAP serial-wire out enable + wire t_do; // DAP TDO + wire t_do_en_n; // DAP TDO enable + wire cdbg_pwrup_req; // DAP powerup request + + // ------------------------------------------------------------ + // Tie off key debug signals if no debug is implemented + // ------------------------------------------------------------ + + // this logic is present to allow synthesis to strip out the + // debug-access-port if no debug is required; implementors + // may choose simply not to instantiate the DAP sub-module + + wire [31:0] slv_addr = cfg_dbg ? slv_addr_dap : {32{1'b0}}; + wire [31:0] slv_wdata = cfg_dbg ? slv_wdata_dap : {32{1'b0}}; + wire [ 1:0] slv_trans = cfg_dbg ? slv_trans_dap : {2{1'b0}}; + wire slv_write = cfg_dbg ? slv_write_dap : 1'b0; + wire [ 1:0] slv_size = cfg_dbg ? slv_size_dap : {2{1'b0}}; + wire device_en = cfg_dbg ? 1'b1 : 1'b0; + + wire sw_di_t_ms = cfg_dbg ? SWDITMS : 1'b1; + wire t_di = cfg_dbg ? TDI : 1'b0; + wire cdbg_pwrup_ack = cfg_dbg ? CDBGPWRUPACK : 1'b0; + wire [31:0] slv_rdata_dap = cfg_dbg ? slv_rdata : {32{1'b0}}; + wire slv_ready_dap = cfg_dbg ? slv_ready : 1'b0; + wire slv_resp_dap = cfg_dbg ? slv_resp : 1'b0; + + // ------------------------------------------------------------ + // Reset synchronizer for dp_reset + // ------------------------------------------------------------ + + cm0_dbg_reset_sync #(.PRESENT(DBG)) + u_dpreset_sync + ( + .RSTIN (PORESETn), + .CLK (SWCLKTCK), + .SE (SE), + .RSTBYPASS (RSTBYPASS), + .RSTOUT (dp_reset_n)); + + // ------------------------------------------------------------ + // Generate signal that can be used to gate system clock + // ------------------------------------------------------------ + + // HCLK to core (and system) may be gated if the core is + // sleeping, and there is no chance of a debug transaction + + wire gate_hclk = ( (SLEEPING | ~SLEEPHOLDACKn) & + ~cdbg_pwrup_ack ); + + // ------------------------------------------------------------ + // Connect wake-up interrupt controller to Cortex-M0 NVIC + // ------------------------------------------------------------ + + // the WIC module makes no distinction between NMI, RXEV or + // regular interrupts, so simply assign NMI, RXEV and the + // configured number of IRQ signals consistently to the least + // significant bits of input and output ports + + wire [33:0] wic_mask = { wic_mask_isr[31:0], + wic_mask_nmi, + wic_mask_rxev }; + + wire [33:0] wic_int = { IRQ[31:0], + NMI, + RXEV }; + + wire [31:0] irq_pend = IRQ | wic_pend[33:2]; + wire nmi_pend = NMI | wic_pend[1]; + wire rxev_pend = RXEV | wic_pend[0]; + + // ------------------------------------------------------------ + + // ------------------------------------------------------------ + // Cortex-M0 processor instantiation + // ------------------------------------------------------------ + + CORTEXM0 + #(.ACG(ACG), .AHBSLV(0), .BE(BE), .BKPT(BKPT), + .DBG(DBG), .NUMIRQ(NUMIRQ), .RAR(RAR), .SMUL(SMUL), + .SYST(SYST), .WIC(WIC), .WICLINES(WICLINES), .WPT(WPT)) + u_cortexm0 + ( + // Outputs + .HADDR (HADDR[31:0]), + .HBURST (HBURST[2:0]), + .HMASTLOCK (HMASTLOCK), + .HPROT (HPROT[3:0]), + .HSIZE (HSIZE[2:0]), + .HTRANS (HTRANS[1:0]), + .HWDATA (HWDATA[31:0]), + .HWRITE (HWRITE), + .HMASTER (HMASTER), + .SLVRDATA (slv_rdata[31:0]), + .SLVREADY (slv_ready), + .SLVRESP (slv_resp), + .DBGRESTARTED (DBGRESTARTED), + .HALTED (HALTED), + .TXEV (TXEV), + .LOCKUP (LOCKUP), + .SYSRESETREQ (SYSRESETREQ), + .CODENSEQ (CODENSEQ), + .CODEHINTDE (CODEHINTDE[2:0]), + .SPECHTRANS (SPECHTRANS), + .SLEEPING (SLEEPING), + .SLEEPDEEP (SLEEPDEEP), + .SLEEPHOLDACKn (SLEEPHOLDACKn), + .WICDSACKn (wic_ds_ack_n), + .WICMASKISR (wic_mask_isr[31:0]), + .WICMASKNMI (wic_mask_nmi), + .WICMASKRXEV (wic_mask_rxev), + .WICLOAD (wic_load), + .WICCLEAR (wic_clear), + // Inputs + .SCLK (SCLK), + .HCLK (HCLK), + .DCLK (DCLK), + .DBGRESETn (DBGRESETn), + .HRESETn (HRESETn), + .HRDATA (HRDATA[31:0]), + .HREADY (HREADY), + .HRESP (HRESP), + .SLVADDR (slv_addr[31:0]), + .SLVSIZE (slv_size[1:0]), + .SLVTRANS (slv_trans[1:0]), + .SLVWDATA (slv_wdata[31:0]), + .SLVWRITE (slv_write), + .DBGRESTART (DBGRESTART), + .EDBGRQ (EDBGRQ), + .NMI (nmi_pend), + .IRQ (irq_pend[31:0]), + .RXEV (rxev_pend), + .STCALIB (STCALIB[25:0]), + .STCLKEN (STCLKEN), + .IRQLATENCY (IRQLATENCY[7:0]), + .ECOREVNUM (ECOREVNUM[19:0]), + .SLEEPHOLDREQn (SLEEPHOLDREQn), + .WICDSREQn (wic_ds_req_n), + .SE (SE)); + + // ------------------------------------------------------------ + // Cortex-M0 debug-access-port instantiation + // ------------------------------------------------------------ + + CORTEXM0DAP + #(.JTAGnSW(JTAGnSW), + .DBG(DBG), + .RAR(RAR)) + u_dap + (// Outputs + .SWDO (sw_do), + .SWDOEN (sw_do_en), + .TDO (t_do), + .nTDOEN (t_do_en_n), + .CDBGPWRUPREQ (cdbg_pwrup_req), + .SLVADDR (slv_addr_dap[31:0]), + .SLVWDATA (slv_wdata_dap[31:0]), + .SLVTRANS (slv_trans_dap[1:0]), + .SLVWRITE (slv_write_dap), + .SLVSIZE (slv_size_dap[1:0]), + // Inputs + .SWCLKTCK (SWCLKTCK), + .nTRST (nTRST), + .DPRESETn (dp_reset_n), + .APRESETn (DBGRESETn), + .SWDITMS (sw_di_t_ms), + .TDI (t_di), + .CDBGPWRUPACK (cdbg_pwrup_ack), + .DEVICEEN (device_en), + .DCLK (DCLK), + .SLVRDATA (slv_rdata_dap[31:0]), + .SLVREADY (slv_ready_dap), + .SLVRESP (slv_resp_dap), + .BASEADDR (ROMTABLE_BASE), + .ECOREVNUM (ECOREVNUM[27:20]), + .SE (SE) + ); + + // ------------------------------------------------------------ + // Cortex-M0 wake-up interrupt controller instantiation + // ------------------------------------------------------------ + + cortexm0_wic + #(.WIC(WIC), .WICLINES(WICLINES)) + u_wic + (// Outputs + .WAKEUP (WAKEUP), + .WICSENSE (wic_sense[33:0]), + .WICPEND (wic_pend[33:0]), + .WICDSREQn (wic_ds_req_n), + .WICENACK (WICENACK), + // Inputs + .FCLK (FCLK), + .nRESET (HRESETn), + .WICLOAD (wic_load), + .WICCLEAR (wic_clear), + .WICINT (wic_int[33:0]), + .WICMASK (wic_mask[33:0]), + .WICENREQ (WICENREQ), + .WICDSACKn (wic_ds_ack_n)); + + // ------------------------------------------------------------ + // Assign outputs + // ------------------------------------------------------------ + + assign GATEHCLK = gate_hclk; + + assign SWDO = cfg_dbg ? sw_do : 1'b0; + assign SWDOEN = cfg_dbg ? sw_do_en : 1'b0; + assign TDO = t_do; + assign nTDOEN = cfg_dbg ? t_do_en_n : 1'b1; + assign CDBGPWRUPREQ = cfg_dbg ? cdbg_pwrup_req : 1'b0; + + assign WICSENSE = wic_sense[33:0]; + + +endmodule // CORTEXM0INTEGRATION + +// --------------------------------------------------------------- +// EOF +// ---------------------------------------------------------------