blob: 3fcb96f2d10ecc45b3a8d01d2157abd5dd74e8b9 [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: 2021 , Dinesh Annayya
//
// Licensed 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.
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
//
//////////////////////////////////////////////////////////////////////
//// ////
//// Digital core ////
//// ////
//// This file is part of the riscduino cores project ////
//// https://github.com/dineshannayya/riscduino.git ////
//// ////
//// Description ////
//// This is digital core and integrate all the main block ////
//// here. Following block are integrated here ////
//// 1. 32 bit Risc V Core * 4 core ////
//// 2. Quad SPI Master(SPI Flash/SRAM) ////
//// 3. Wishbone Cross Bar ////
//// 4. 2 x UART ////
//// 5, USB 1.1 Host ////
//// 6. SPI Master (Single) ////
//// 7. TCM SRAM 2KB ////
//// 8. 2KB icache and 2KB dcache ////
//// 9. 6 Channel ADC (Pending) ////
//// 10. Pinmux with GPIO and 6 PWM ////
//// 11. 15 x hardware Semaphore ////
//// 12. 4 x ws281x driver ////
//// 13. 3 x Hardware Timer ////
//// 14. UART Master ////
//// 15. SPI Slave (As Arduino ISP) ////
//// ////
//// To Do: ////
//// nothing ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesh.annayya@gmail.com ////
//// ////
//// Revision : ////
//// 0.1 - 16th Feb 2021, Dinesh A ////
//// Initial integration with Risc-V core + ////
//// Wishbone Cross Bar + SPI Master ////
//// 0.2 - 17th June 2021, Dinesh A ////
//// 1. In risc core, wishbone and core domain is ////
//// created ////
//// 2. cpu and rtc clock are generated in glbl reg block ////
//// 3. in wishbone interconnect:- Stagging flop are added ////
//// at interface to break wishbone timing path ////
//// 4. buswidth warning are fixed inside spi_master ////
//// modified rtl files are ////
//// verilog/rtl/digital_core/src/digital_core.sv ////
//// verilog/rtl/digital_core/src/glbl_cfg.sv ////
//// verilog/rtl/lib/wb_stagging.sv ////
//// verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv ////
//// verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv ////
//// verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv ////
//// verilog/rtl/user_project_wrapper.v ////
//// verilog/rtl/wb_interconnect/src/wb_interconnect.sv ////
//// verilog/rtl/spi_master/src/spim_clkgen.sv ////
//// verilog/rtl/spi_master/src/spim_ctrl.sv ////
//// 0.3 - 20th June 2021, Dinesh A ////
//// 1. uart core is integrated ////
//// 2. 3rd Slave ported added to wishbone interconnect ////
//// 0.4 - 25th June 2021, Dinesh A ////
//// Moved the pad logic inside sdram,spi,uart block to ////
//// avoid logic at digital core level ////
//// 0.5 - 25th June 2021, Dinesh A ////
//// Since carvel gives only 16MB address space for user ////
//// space, we have implemented indirect address select ////
//// with 8 bit bank select given inside wb_host ////
//// core Address = {Bank_Sel[7:0], Wb_Address[23:0] ////
//// caravel user address space is ////
//// 0x3000_0000 to 0x30FF_FFFF ////
//// 0.6 - 27th June 2021, Dinesh A ////
//// Digital core level tie are moved inside IP to avoid ////
//// power hook up at core level ////
//// u_risc_top - test_mode & test_rst_n ////
//// u_intercon - s*_wbd_err_i ////
//// unused wb_cti_i is removed from u_sdram_ctrl ////
//// 0.7 - 28th June 2021, Dinesh A ////
//// wb_interconnect master port are interchanged for ////
//// better physical placement. ////
//// m0 - External HOST ////
//// m1 - RISC IMEM ////
//// m2 - RISC DMEM ////
//// 0.8 - 6th July 2021, Dinesh A ////
//// For Better SDRAM Interface timing we have taping ////
//// sdram_clock goint to io_out[29] directly from ////
//// global register block, this help in better SDRAM ////
//// interface timing control ////
//// 0.9 - 7th July 2021, Dinesh A ////
//// Removed 2 Unused port connection io_in[31:30] to ////
//// spi_master to avoid lvs issue ////
//// 1.0 - 28th July 2021, Dinesh A ////
//// i2cm integrated part of uart_i2cm module, ////
//// due to number of IO pin limitation, ////
//// Only UART OR I2C selected based on config mode ////
//// 1.1 - 1st Aug 2021, Dinesh A ////
//// usb1.1 host integrated part of uart_i2cm_usb module,////
//// due to number of IO pin limitation, ////
//// Only UART/I2C/USB selected based on config mode ////
//// 1.2 - 29th Sept 2021, Dinesh.A ////
//// 1. copied the repo from yifive and renames as ////
//// riscdunino ////
//// 2. Removed the SDRAM controlled ////
//// 3. Added PinMux ////
//// 4. Added SAR ADC for 6 channel ////
//// 1.3 - 30th Sept 2021, Dinesh.A ////
//// 2KB SRAM Interface added to RISC Core ////
//// 1.4 - 13th Oct 2021, Dinesh A ////
//// Basic verification and Synthesis cleanup ////
//// 1.5 - 6th Nov 2021, Dinesh A ////
//// Clock Skew block moved inside respective block due ////
//// to top-level power hook-up challenges for small IP ////
//// 1.6 Nov 14, 2021, Dinesh A ////
//// Major bug, clock divider inside the wb_host reset ////
//// connectivity open is fixed ////
//// 1.7 Nov 15, 2021, Dinesh A ////
//// Bug fix in clk_ctrl High/Low counter width ////
//// Removed sram_clock ////
//// 1.8 Nov 23, 2021, Dinesh A ////
//// Three Chip Specific Signature added at PinMux Reg ////
//// reg_22,reg_23,reg_24 ////
//// 1.9 Dec 11, 2021, Dinesh A ////
//// 2 x 2K SRAM added into Wishbone Interface ////
//// Temporary ADC block removed ////
//// 2.0 Dec 14, 2021, Dinesh A ////
//// Added two more 2K SRAM added into Wishbone Interface ////
//// 2.1 Dec 16, 2021, Dinesh A ////
//// 1.4 MBIST controller changed to single one ////
//// 2.Added one more SRAM to TCM memory ////
//// 3.WishBone Interconnect chang to take care mbist changes////
//// 4.Pinmux change to take care of mbist changes ////
//// 2.2 Dec 20, 2021, Dinesh A ////
//// 1. MBIST design issue fix for yosys ////
//// 2. Full chip Timing and Transition clean-up ////
//// 2.3 Dec 24, 2021, Dinesh A ////
//// UART Master added with message handler at wb_host ////
//// 2.4 Jan 01, 2022, Dinesh A ////
//// LA[0] is added as soft reset option at wb_port ////
//// 2.5 Jan 06, 2022, Dinesh A ////
//// TCM RAM Bug fix inside syntacore ////
//// 2.6 Jan 08, 2022, Dinesh A ////
//// Pinmux Interrupt Logic change ////
//// 3.0 Jan 14, 2022, Dinesh A ////
//// Moving from riscv core from syntacore/scr1 to ////
//// yfive/ycr1 on sankranti 2022 (A Hindu New Year) ////
//// 3.1 Jan 15, 2022, Dinesh A ////
//// Major changes in qspim logic to handle special mode ////
//// 3.2 Feb 02, 2022, Dinesh A ////
//// Bug fix around icache/dcache and wishbone burst ////
//// access clean-up ////
//// 3.3 Feb 08, 2022, Dinesh A ////
//// support added spisram support in qspim ip ////
//// There are 4 chip select available in qspim ////
//// CS#0/CS#1 targeted for SPI FLASH ////
//// CS#2/CS#3 targeted for SPI SRAM ////
//// 3.4 Feb 14, 2022, Dinesh A ////
//// burst mode supported added in imem buffer inside ////
//// riscv core ////
//// 3.5 Feb 22, 2022 Dinesh A ////
//// A. To create more space in die, we have removed mbist ////
//// controller and 4x 2KB RAM ////
//// B. Risc core will have core with common icache,dcache ////
//// TCM memory ////
//// C. Individual block reset are moved to pinmux to ////
//// support peripheral reset from Risc and WishBone ////
//// Host. ////
//// 3.6 Feb 19, Dinesh A ////
//// A. Changed Module: wb_host ////
//// wishbone slave clock generation config increase from ////
//// 3 to 4 bit support clock source selection ////
//// B. Changed Module: qspim ////
//// 1. Bug fix in spi rise and fall pulse relation w.r.t ////
//// spi_clk. Note: Previous version work only with ////
//// spi clock config = 0x2 ////
//// 2. spi_oen generation fix for different spi mode ////
//// 3. spi_csn de-assertion fix for different spi clk div ////
//// 3.7 Mar 2 2022, Dinesh A ////
//// 1. qspi cs# port mapping changed from io 28:25 to 25:28////
//// 2. sspi, bug fix in reg access and endian support added////
//// 3. Wishbone interconnect now support cross-connect ////
//// feature ////
//// 3.8 Mar 10 2022, Dinesh A ////
//// 1. usb chip select bug inside uart_* wrapper ////
//// 2. in wb_host, increased usb clk ctrl to 4 to 8 bit ////
//// 3.9 Mar 16 2022, Dinesh A ////
//// 1. 3 Timer added ////
//// 2. Pinmux Register address movement ////
//// 3. Risc fuse_mhartid is removed and internal tied ////
//// inside risc core ////
//// 4. caravel wb addressing issue restrict to 0x300FFFFF////
//// 4.0 Mar 26 2022, Dinesh A ////
//// 1. Four core risc v integration ////
//// 4.1 April 1 2022, Dinesh A ////
//// 1. sram lanuch phase control added inside risc core ////
//// 4.2 April 6 2022, Dinesh A ////
//// 1. SSPI CS# increased from 1 to 4 ////
//// 2. uart port increase to two ////
//// 4.3 May 24 2022, Dinesh A ////
//// Re targetted the design to mpw-6 tools set and risc ////
//// core logic are timing optimized to 100mhz ////
//// 4.4 May 29 2022, Dinesh A ////
//// 1. Digital PLL integrated and clock debug signal add ////
//// @digitial io [33] port ////
//// 4.6 June 13 2022, Dinesh A ////
//// 1. icache and dcache bypass config addded ////
//// 4.7 July 08 2022, Dinesh A ////
//// Pinmux changes to support SPI CS port matching to ////
//// arduino ////
//// 4.8 July 20 2022, Dinesh A ////
//// SPI ISP boot option added in wb_host, spi slave uses ////
//// same spi master interface, but will be active only ////
//// when internal SPI config disabled + RESET PIN = 0 ////
//// 4.9 Aug 5 2022, Dinesh A ////
//// changes in sspim ////
//// A. SPI Mode 0 to 3 support added, ////
//// B. SPI Duplex mode TX-RX Mode added ////
//// 5.0 Aug 15 2022, Dinesh A ////
//// A. 15 Hardware Semahore added ////
//// B. Pinmux Address Space are Split as ////
//// `define ADDR_SPACE_PINMUX 32'h1002_0000 ////
//// `define ADDR_SPACE_GLBL 32'h1002_0000 ////
//// `define ADDR_SPACE_GPIO 32'h1002_0040 ////
//// `define ADDR_SPACE_PWM 32'h1002_0080 ////
//// `define ADDR_SPACE_TIMER 32'h1002_00C0 ////
//// `define ADDR_SPACE_SEMA 32'h1002_0100 ////
//// 5.1 Aug 24 2022, Dinesh A ////
//// A. GPIO interrupt generation changed from 1 to 32 ////
//// B. Total interrupt to Riscv changed from 16 to 32 ////
//// C. uart_master disable option added at pinmux ////
//// D. Timer interrupt related clean-up ////
//// E. 4x ws281x driver logic added ////
//// F. 4x ws281x driver are mux with 16x gpio ////
//// G. gpio type select the normal gpio vs ws281x ////
//// 5.2 Aug 26 2022, Dinesh A ////
//// A. We have copied the user_defines.h from caravel ////
//// and configured all the GPIO from 5 onwards as ////
//// GPIO_MODE_USER_STD_BIDIRECTIONAL ////
//// ////
//// As digitial-io[0-5] reserved at power up. ////
//// B. to keep at least one uart access, ////
//// we have moved UART_RXD[1] from io[3] to io[6] ////
//// C. SPI Slave SSN move from io[0] to [7] ////
//// 5.3 Sept 2 2022, Dinesh A ////
//// A. System Strap implementation ////
//// B. Arduino pins are moved to take care of caravel ////
//// digital-io[0-4] resevred ////
//// C. global register space increased from 16 to 32 ////
//// D. reset fsm is implementation with soft reboot ////
//// option ////
//// E. strap based booting option added for qspi ////
//// 5.4 Sept 7 2022, Dinesh A ////
//// A. PLL configuration are moved from wb_host to ////
//// pinmux to help risc core to do pll config and reboot////
//// B. PLL configuration are kept in p_reset_n to avoid ////
//// initialized on soft reboot. ////
//// C. Master Uart has two strap bit to control the ////
//// boot up config ////
//// 2'b00 - 50Mhz, 2'b01 - 40Mhz, 2'b10 - 50Mhz, ////
//// 2'b11 - LA control ////
//// 5.5 Sept 14 2022, Dinesh A ////
//// A. Auto Baud detection added in uart master as ////
//// power on user_clock1 is not decided, strap def ////
//// changed ////
//// 2'b00 - Auto, 2'b01 - 50Mhz, 2'b10 - 4Mhz, ////
//// 2'b11 - LA control ////
//// B. digital_pll is re-synth with maual placement ////
//// 5.6 Sept 29 2022, Dinesh A ////
//// A. 4x 8bit DAC Integration ////
//// B. clock skew control added for core clock ////
//// 5.8 Nov 20, 2022, Dinesh A ////
//// A. Pinmux - Double Sync added for usb & i2c inter ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer. ////
//// ////
//// This source file is free software; you can redistribute it ////
//// and/or modify it under the terms of the GNU Lesser General ////
//// Public License as published by the Free Software Foundation; ////
//// either version 2.1 of the License, or (at your option) any ////
//// later version. ////
//// ////
//// This source is distributed in the hope that it will be ////
//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
//// PURPOSE. See the GNU Lesser General Public License for more ////
//// details. ////
//// ////
//// You should have received a copy of the GNU Lesser General ////
//// Public License along with this source; if not, download it ////
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
/*********************************************************************
Memory Map: ////
////
SOC Memory Map ////
0x0000_0000 to 0x0FFF_FFFF - QSPIM MEMORY ////
0x1000_0000 to 0x1000_00FF - QSPIM REG
0x1001_0000 to 0x1001_003F - UART0
0x1001_0040 to 0x1001_007F - I2
0x1001_0080 to 0x1001_00BF - USB
0x1001_00C0 to 0x1001_00FF - SSPIM
0x1001_0100 to 0x1001_013F - UART1
0x1002_0000 to 0x1002_00FF - PINMUX
Caravel Memory Map:
-----------------------------------------------------------------------
caravel user space is 0x3000_0000 to 0x300F_FFFF
So we have allocated
0x3008_0000 - 0x3008_00FF - Assigned to WB Host Address Space
Since We need more than 16MB Address space to access SDRAM/SPI we have
added indirect MSB 13 bit address select option
So Address will be {Bank_Sel[15:3], wbm_adr_i[18:0]}
---------------------------------------------------------------------
0x3080_0000 to 0x3080_00FF - WB HOST
0x3000_0000 to 0x307F_FFFF - Indirect Address
{Bank_Sel[15:3],WB ADDR[18:0]}
***********************************************************************/
/***********************************************************************
* Caravel I/O mapping
*
* mprj_io[37] io_in/out/oeb/in_3v3[26] --- ---
* mprj_io[36] io_in/out/oeb/in_3v3[25] --- ---
* mprj_io[35] io_in/out/oeb/in_3v3[24] gpio_analog/noesd[17] ---
* mprj_io[34] io_in/out/oeb/in_3v3[23] gpio_analog/noesd[16] ---
* mprj_io[33] io_in/out/oeb/in_3v3[22] gpio_analog/noesd[15] ---
* mprj_io[32] io_in/out/oeb/in_3v3[21] gpio_analog/noesd[14] ---
* mprj_io[31] io_in/out/oeb/in_3v3[20] gpio_analog/noesd[13] ---
* mprj_io[30] io_in/out/oeb/in_3v3[19] gpio_analog/noesd[12] ---
* mprj_io[29] io_in/out/oeb/in_3v3[18] gpio_analog/noesd[11] ---
* mprj_io[28] io_in/out/oeb/in_3v3[17] gpio_analog/noesd[10] ---
* mprj_io[27] io_in/out/oeb/in_3v3[16] gpio_analog/noesd[9] ---
* mprj_io[26] io_in/out/oeb/in_3v3[15] gpio_analog/noesd[8] ---
* mprj_io[25] io_in/out/oeb/in_3v3[14] gpio_analog/noesd[7] ---
* mprj_io[24] --- --- user_analog[10]
* mprj_io[23] --- --- user_analog[9]
* mprj_io[22] --- --- user_analog[8]
* mprj_io[21] --- --- user_analog[7]
* mprj_io[20] --- --- user_analog[6] clamp[2]
* mprj_io[19] --- --- user_analog[5] clamp[1]
* mprj_io[18] --- --- user_analog[4] clamp[0]
* mprj_io[17] --- --- user_analog[3]
* mprj_io[16] --- --- user_analog[2]
* mprj_io[15] --- --- user_analog[1]
* mprj_io[14] --- --- user_analog[0]
* mprj_io[13] io_in/out/oeb/in_3v3[13] gpio_analog/noesd[6] ---
* mprj_io[12] io_in/out/oeb/in_3v3[12] gpio_analog/noesd[5] ---
* mprj_io[11] io_in/out/oeb/in_3v3[11] gpio_analog/noesd[4] ---
* mprj_io[10] io_in/out/oeb/in_3v3[10] gpio_analog/noesd[3] ---
* mprj_io[9] io_in/out/oeb/in_3v3[9] gpio_analog/noesd[2] ---
* mprj_io[8] io_in/out/oeb/in_3v3[8] gpio_analog/noesd[1] ---
* mprj_io[7] io_in/out/oeb/in_3v3[7] gpio_analog/noesd[0] ---
* mprj_io[6] io_in/out/oeb/in_3v3[6] --- ---
* mprj_io[5] io_in/out/oeb/in_3v3[5] --- ---
* mprj_io[4] io_in/out/oeb/in_3v3[4] --- ---
* mprj_io[3] io_in/out/oeb/in_3v3[3] --- ---
* mprj_io[2] io_in/out/oeb/in_3v3[2] --- ---
* mprj_io[1] io_in/out/oeb/in_3v3[1] --- ---
* mprj_io[0] io_in/out/oeb/in_3v3[0] --- ---
************************************************************************/
`include "user_params.svh"
module user_project_wrapper (
`ifdef USE_POWER_PINS
inout vdda1, // User area 1 3.3V supply
inout vdda2, // User area 2 3.3V supply
inout vssa1, // User area 1 analog ground
inout vssa2, // User area 2 analog ground
inout vccd1, // User area 1 1.8V supply
inout vccd2, // User area 2 1.8v supply
inout vssd1, // User area 1 digital ground
inout vssd2, // User area 2 digital ground
`endif
input wire wb_clk_i , // System clock
input wire user_clock2 , // user Clock
input wire wb_rst_i , // Regular Reset signal
input wire wbs_cyc_i , // strobe/request
input wire wbs_stb_i , // strobe/request
input wire [WB_WIDTH-1:0] wbs_adr_i , // address
input wire wbs_we_i , // write
input wire [WB_WIDTH-1:0] wbs_dat_i , // data output
input wire [3:0] wbs_sel_i , // byte enable
output wire [WB_WIDTH-1:0] wbs_dat_o , // data input
output wire wbs_ack_o , // acknowlegement
// Analog (direct connection to GPIO pad---use with caution)
// Note that analog I/O is not available on the 7 lowest-numbered
// GPIO pads, and so the analog_io indexing is offset from the
// GPIO indexing by 7 (also upper 2 GPIOs do not have analog_io).
inout [28:0] analog_io,
// Logic Analyzer Signals
input wire [127:0] la_data_in ,
output wire [127:0] la_data_out ,
input wire [127:0] la_oenb ,
// IOs
input wire [37:0] io_in ,
output wire [37:0] io_out ,
output wire [37:0] io_oeb ,
output wire [2:0] user_irq
);
//---------------------------------------------------
// Local Parameter Declaration
// --------------------------------------------------
parameter BIST_NO_SRAM = 4; // NO of MBIST MEMORY
parameter SDR_DW = 8; // SDR Data Width
parameter SDR_BW = 1; // SDR Byte Width
parameter WB_WIDTH = 32; // WB ADDRESS/DARA WIDTH
parameter BIST1_ADDR_WD = 11; // 512x32 SRAM
parameter BIST_DATA_WD = 32;
//---------------------------------------------------------------------
// Wishbone Risc V Dcache Memory Interface
//---------------------------------------------------------------------
wire wbd_riscv_dcache_stb_i ; // strobe/request
wire [WB_WIDTH-1:0] wbd_riscv_dcache_adr_i ; // address
wire wbd_riscv_dcache_we_i ; // write
wire [WB_WIDTH-1:0] wbd_riscv_dcache_dat_i ; // data output
wire [3:0] wbd_riscv_dcache_sel_i ; // byte enable
wire [9:0] wbd_riscv_dcache_bl_i ; // burst length
wire wbd_riscv_dcache_bry_i ; // burst ready
wire [WB_WIDTH-1:0] wbd_riscv_dcache_dat_o ; // data input
wire wbd_riscv_dcache_ack_o ; // acknowlegement
wire wbd_riscv_dcache_lack_o ; // last burst acknowlegement
wire wbd_riscv_dcache_err_o ; // error
// CACHE SRAM Memory I/F
wire dcache_mem_clk0 ; // CLK
wire dcache_mem_csb0 ; // CS#
wire dcache_mem_web0 ; // WE#
wire [8:0] dcache_mem_addr0 ; // Address
wire [3:0] dcache_mem_wmask0 ; // WMASK#
wire [31:0] dcache_mem_din0 ; // Write Data
wire [31:0] dcache_mem_dout0 ; // Read Data
// SRAM-0 PORT-1, IMEM I/F
wire dcache_mem_clk1 ; // CLK
wire dcache_mem_csb1 ; // CS#
wire [8:0] dcache_mem_addr1 ; // Address
wire [31:0] dcache_mem_dout1 ; // Read Data
//---------------------------------------------------------------------
// Wishbone Risc V Icache Memory Interface
//---------------------------------------------------------------------
wire wbd_riscv_icache_stb_i ; // strobe/request
wire [WB_WIDTH-1:0] wbd_riscv_icache_adr_i ; // address
wire wbd_riscv_icache_we_i ; // write
wire [3:0] wbd_riscv_icache_sel_i ; // byte enable
wire [9:0] wbd_riscv_icache_bl_i ; // burst length
wire wbd_riscv_icache_bry_i ; // burst ready
wire [WB_WIDTH-1:0] wbd_riscv_icache_dat_o ; // data input
wire wbd_riscv_icache_ack_o ; // acknowlegement
wire wbd_riscv_icache_lack_o ; // last burst acknowlegement
wire wbd_riscv_icache_err_o ; // error
// CACHE SRAM Memory I/F
wire icache_mem_clk0 ; // CLK
wire icache_mem_csb0 ; // CS#
wire icache_mem_web0 ; // WE#
wire [8:0] icache_mem_addr0 ; // Address
wire [3:0] icache_mem_wmask0 ; // WMASK#
wire [31:0] icache_mem_din0 ; // Write Data
// wire [31:0] icache_mem_dout0 ; // Read Data
// SRAM-0 PORT-1, IMEM I/F
wire icache_mem_clk1 ; // CLK
wire icache_mem_csb1 ; // CS#
wire [8:0] icache_mem_addr1 ; // Address
wire [31:0] icache_mem_dout1 ; // Read Data
//---------------------------------------------------------------------
// RISC V Wishbone Data Memory Interface
//---------------------------------------------------------------------
wire wbd_riscv_dmem_stb_i ; // strobe/request
wire [WB_WIDTH-1:0] wbd_riscv_dmem_adr_i ; // address
wire wbd_riscv_dmem_we_i ; // write
wire [WB_WIDTH-1:0] wbd_riscv_dmem_dat_i ; // data output
wire [3:0] wbd_riscv_dmem_sel_i ; // byte enable
wire [2:0] wbd_riscv_dmem_bl_i ; // byte enable
wire wbd_riscv_dmem_bry_i ; // burst access ready
wire [WB_WIDTH-1:0] wbd_riscv_dmem_dat_o ; // data input
wire wbd_riscv_dmem_ack_o ; // acknowlegement
wire wbd_riscv_dmem_lack_o ; // acknowlegement
wire wbd_riscv_dmem_err_o ; // error
//---------------------------------------------------------------------
// WB HOST Interface
//---------------------------------------------------------------------
wire wbd_int_cyc_i ; // strobe/request
wire wbd_int_stb_i ; // strobe/request
wire [WB_WIDTH-1:0] wbd_int_adr_i ; // address
wire wbd_int_we_i ; // write
wire [WB_WIDTH-1:0] wbd_int_dat_i ; // data output
wire [3:0] wbd_int_sel_i ; // byte enable
wire [WB_WIDTH-1:0] wbd_int_dat_o ; // data input
wire wbd_int_ack_o ; // acknowlegement
wire wbd_int_err_o ; // error
//---------------------------------------------------------------------
// SPI Master Wishbone Interface
//---------------------------------------------------------------------
wire wbd_spim_stb_o ; // strobe/request
wire [WB_WIDTH-1:0] wbd_spim_adr_o ; // address
wire wbd_spim_we_o ; // write
wire [WB_WIDTH-1:0] wbd_spim_dat_o ; // data output
wire [3:0] wbd_spim_sel_o ; // byte enable
wire [9:0] wbd_spim_bl_o ; // Burst count
wire wbd_spim_bry_o ; // Busrt Ready
wire wbd_spim_cyc_o ;
wire [WB_WIDTH-1:0] wbd_spim_dat_i ; // data input
wire wbd_spim_ack_i ; // acknowlegement
wire wbd_spim_lack_i ; // Last acknowlegement
wire wbd_spim_err_i ; // error
//---------------------------------------------------------------------
// SPI Master Wishbone Interface
//---------------------------------------------------------------------
wire wbd_adc_stb_o ;
wire [7:0] wbd_adc_adr_o ;
wire wbd_adc_we_o ; // 1 - Write, 0 - Read
wire [WB_WIDTH-1:0] wbd_adc_dat_o ;
wire [WB_WIDTH/8-1:0] wbd_adc_sel_o ; // Byte enable
wire wbd_adc_cyc_o ;
wire [2:0] wbd_adc_cti_o ;
wire [WB_WIDTH-1:0] wbd_adc_dat_i ;
wire wbd_adc_ack_i ;
//---------------------------------------------------------------------
// Global Register Wishbone Interface
//---------------------------------------------------------------------
wire wbd_glbl_stb_o ; // strobe/request
wire [9:0] wbd_glbl_adr_o ; // address
wire wbd_glbl_we_o ; // write
wire [WB_WIDTH-1:0] wbd_glbl_dat_o ; // data output
wire [3:0] wbd_glbl_sel_o ; // byte enable
wire wbd_glbl_cyc_o ;
wire [WB_WIDTH-1:0] wbd_glbl_dat_i ; // data input
wire wbd_glbl_ack_i ; // acknowlegement
wire wbd_glbl_err_i ; // error
//---------------------------------------------------------------------
// Global Register Wishbone Interface
//---------------------------------------------------------------------
wire wbd_uart_stb_o ; // strobe/request
wire [8:0] wbd_uart_adr_o ; // address
wire wbd_uart_we_o ; // write
wire [31:0] wbd_uart_dat_o ; // data output
wire [3:0] wbd_uart_sel_o ; // byte enable
wire wbd_uart_cyc_o ;
wire [31:0] wbd_uart_dat_i ; // data input
wire wbd_uart_ack_i ; // acknowlegement
wire wbd_uart_err_i ; // error
//----------------------------------------------------
// CPU Configuration
//----------------------------------------------------
wire cpu_intf_rst_n ;
wire [3:0] cpu_core_rst_n ;
wire qspim_rst_n ;
wire sspim_rst_n ;
wire [1:0] uart_rst_n ; // uart reset
wire i2c_rst_n ; // i2c reset
wire usb_rst_n ; // i2c reset
wire bist_rst_n ; // i2c reset
wire cpu_clk ;
wire rtc_clk ;
wire usb_clk ;
wire wbd_clk_int ;
wire wbd_clk_wh ;
wire wbd_clk_spi ;
wire wbd_clk_pinmux ;
wire wbd_int_rst_n ;
wire wbd_pll_rst_n ;
wire [31:0] irq_lines ;
wire soft_irq ;
wire [7:0] cfg_glb_ctrl ;
wire [31:0] cfg_clk_skew_ctrl1 ;
wire [31:0] cfg_clk_skew_ctrl2 ;
wire [3:0] cfg_wcska_wi ; // clock skew adjust for wishbone interconnect
wire [3:0] cfg_wcska_wh ; // clock skew adjust for web host
wire [3:0] cfg_wcska_riscv ; // clock skew adjust for riscv
wire [3:0] cfg_wcska_uart ; // clock skew adjust for uart
wire [3:0] cfg_wcska_qspi ; // clock skew adjust for spi
wire [3:0] cfg_wcska_pinmux ; // clock skew adjust for pinmux
wire [3:0] cfg_wcska_qspi_co ; // clock skew adjust for global reg
// Bus Repeater Signals output from Wishbone Interface
wire [3:0] cfg_wcska_riscv_rp ; // clock skew adjust for riscv
wire [3:0] cfg_wcska_uart_rp ; // clock skew adjust for uart
wire [3:0] cfg_wcska_qspi_rp ; // clock skew adjust for spi
wire [3:0] cfg_wcska_pinmux_rp ; // clock skew adjust for pinmux
wire [3:0] cfg_wcska_qspi_co_rp ; // clock skew adjust for global reg
wire [31:0] irq_lines_rp ; // Repeater
wire soft_irq_rp ; // Repeater
wire wbd_clk_risc_rp ;
wire wbd_clk_qspi_rp ;
wire wbd_clk_uart_rp ;
wire wbd_clk_pinmux_rp ;
wire wbd_clk_pinmux_skew ;
// Progammable Clock Skew inserted signals
wire wbd_clk_wi_skew ; // clock for wishbone interconnect with clock skew
wire wbd_clk_riscv_skew ; // clock for riscv with clock skew
wire wbd_clk_uart_skew ; // clock for uart with clock skew
wire wbd_clk_spi_skew ; // clock for spi with clock skew
wire wbd_clk_glbl_skew ; // clock for global reg with clock skew
wire wbd_clk_wh_skew ; // clock for global reg
wire [31:0] spi_debug ;
wire [31:0] pinmux_debug ;
wire dbg_clk_mon ; // clock monitoring port
wire [63:0] riscv_debug ;
// SFLASH I/F
wire sflash_sck ;
wire [3:0] sflash_ss ;
wire [3:0] sflash_oen ;
wire [3:0] sflash_do ;
wire [3:0] sflash_di ;
// SSRAM I/F
//wire ssram_sck ;
//wire ssram_ss ;
//wire ssram_oen ;
//wire [3:0] ssram_do ;
//wire [3:0] ssram_di ;
// USB I/F
wire usb_dp_o ;
wire usb_dn_o ;
wire usb_oen ;
wire usb_dp_i ;
wire usb_dn_i ;
// UART I/F
wire [1:0] uart_txd ;
wire [1:0] uart_rxd ;
// I2CM I/F
wire i2cm_clk_o ;
wire i2cm_clk_i ;
wire i2cm_clk_oen ;
wire i2cm_data_oen ;
wire i2cm_data_o ;
wire i2cm_data_i ;
// SPI MASTER
wire spim_sck ;
wire spim_ss ;
wire spim_miso ;
wire spim_mosi ;
wire [7:0] sar2dac ;
wire analog_dac_out ;
wire pulse1m_mclk ;
wire h_reset_n ;
`ifndef SCR1_TCM_MEM
// SRAM-0 PORT-0 - DMEM I/F
wire sram0_clk0 ; // CLK
wire sram0_csb0 ; // CS#
wire sram0_web0 ; // WE#
wire [8:0] sram0_addr0 ; // Address
wire [3:0] sram0_wmask0 ; // WMASK#
wire [31:0] sram0_din0 ; // Write Data
wire [31:0] sram0_dout0 ; // Read Data
// SRAM-0 PORT-1, IMEM I/F
wire sram0_clk1 ; // CLK
wire sram0_csb1 ; // CS#
wire [8:0] sram0_addr1 ; // Address
wire [31:0] sram0_dout1 ; // Read Data
// SRAM-1 PORT-0 - DMEM I/F
wire sram1_clk0 ; // CLK
wire sram1_csb0 ; // CS#
wire sram1_web0 ; // WE#
wire [8:0] sram1_addr0 ; // Address
wire [3:0] sram1_wmask0 ; // WMASK#
wire [31:0] sram1_din0 ; // Write Data
wire [31:0] sram1_dout0 ; // Read Data
// SRAM-1 PORT-1, IMEM I/F
wire sram1_clk1 ; // CLK
wire sram1_csb1 ; // CS#
wire [8:0] sram1_addr1 ; // Address
wire [31:0] sram1_dout1 ; // Read Data
`endif
// SPIM I/F
wire sspim_sck ; // clock out
wire sspim_so ; // serial data out
wire sspim_si ; // serial data in
wire [3:0] sspim_ssn ; // cs_n
// SPIS I/F
wire sspis_sck ; // clock out
wire sspis_so ; // serial data out
wire sspis_si ; // serial data in
wire sspis_ssn ; // cs_n
wire usb_intr_o ;
wire i2cm_intr_o ;
//----------------------------------------------------------------
// UART Master I/F
// -------------------------------------------------------------
wire uartm_rxd ;
wire uartm_txd ;
//----------------------------------------------------------------
// Digital PLL I/F
// -------------------------------------------------------------
wire cfg_pll_enb ; // Enable PLL
wire [4:0] cfg_pll_fed_div ; // PLL feedback division ratio
wire cfg_dco_mode ; // Run PLL in DCO mode
wire [25:0] cfg_dc_trim ; // External trim for DCO mode
wire pll_ref_clk ; // Input oscillator to match
wire [1:0] pll_clk_out ; // Two 90 degree clock phases
wire [3:0] spi_csn ;
wire xtal_clk ;
wire e_reset_n ;
wire p_reset_n ;
wire s_reset_n ;
wire cfg_strap_pad_ctrl ;
wire e_reset_n_rp ;
wire p_reset_n_rp ;
wire s_reset_n_rp ;
wire cfg_strap_pad_ctrl_rp ;
//----------------------------------------------------------------------
// DAC Config
//----------------------------------------------------------------------
wire [7:0] cfg_dac0_mux_sel ;
wire [7:0] cfg_dac1_mux_sel ;
wire [7:0] cfg_dac2_mux_sel ;
wire [7:0] cfg_dac3_mux_sel ;
//---------------------------------------------------------------------
// Strap
//---------------------------------------------------------------------
wire [31:0] system_strap ;
wire [31:0] strap_sticky ;
wire [1:0] strap_uartm ;
wire [31:0] system_strap_rp ;
wire [31:0] strap_sticky_rp ;
wire [1:0] strap_uartm_rp ;
wire [1:0] strap_qspi_flash = system_strap[`STRAP_QSPI_FLASH];
wire strap_qspi_sram = system_strap[`STRAP_QSPI_SRAM];
wire strap_qspi_pre_sram = system_strap[`STRAP_QSPI_PRE_SRAM];
wire strap_qspi_init_bypass = system_strap[`STRAP_QSPI_INIT_BYPASS];
//--------------------------------------------------------------------------
// Pinmux Risc core config
// -------------------------------------------------------------------------
wire [15:0] cfg_riscv_ctrl;
wire [3:0] cfg_riscv_sram_lphase = cfg_riscv_ctrl[3:0];
wire [2:0] cfg_riscv_cache_ctrl = cfg_riscv_ctrl[6:4];
wire [1:0] cfg_riscv_debug_sel = cfg_riscv_ctrl[9:8];
wire cfg_bypass_icache = cfg_riscv_ctrl[10];
wire cfg_bypass_dcache = cfg_riscv_ctrl[11];
/////////////////////////////////////////////////////////
// System/WB Clock Skew Ctrl
////////////////////////////////////////////////////////
assign cfg_wcska_wi = cfg_clk_skew_ctrl1[3:0];
assign cfg_wcska_wh = cfg_clk_skew_ctrl1[7:4];
assign cfg_wcska_riscv = cfg_clk_skew_ctrl1[11:8];
assign cfg_wcska_qspi = cfg_clk_skew_ctrl1[15:12];
assign cfg_wcska_uart = cfg_clk_skew_ctrl1[19:16];
assign cfg_wcska_pinmux = cfg_clk_skew_ctrl1[23:20];
assign cfg_wcska_qspi_co = cfg_clk_skew_ctrl1[27:24];
/////////////////////////////////////////////////////////
// RISCV Clock skew control
/////////////////////////////////////////////////////////
wire [3:0] cfg_ccska_riscv_intf_rp ;
wire [3:0] cfg_ccska_riscv_icon_rp ;
wire [3:0] cfg_ccska_riscv_core0_rp ;
wire [3:0] cfg_ccska_riscv_core1_rp ;
wire [3:0] cfg_ccska_riscv_core2_rp ;
wire [3:0] cfg_ccska_riscv_core3_rp ;
wire [3:0] cfg_ccska_riscv_intf = cfg_clk_skew_ctrl2[3:0];
wire [3:0] cfg_ccska_riscv_icon = cfg_clk_skew_ctrl2[7:4];
wire [3:0] cfg_ccska_riscv_core0 = cfg_clk_skew_ctrl2[11:8];
wire [3:0] cfg_ccska_riscv_core1 = cfg_clk_skew_ctrl2[15:12];
wire [3:0] cfg_ccska_riscv_core2 = cfg_clk_skew_ctrl2[19:16];
wire [3:0] cfg_ccska_riscv_core3 = cfg_clk_skew_ctrl2[23:20];
assign la_data_out[127:0] = {pinmux_debug,spi_debug,riscv_debug};
wire int_pll_clock = pll_clk_out[0];
wb_host u_wb_host(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
.user_clock1 (wb_clk_i ),
.user_clock2 (user_clock2 ),
.int_pll_clock (int_pll_clock ),
.cpu_clk (cpu_clk ),
// to/from Pinmux
.xtal_clk (xtal_clk ),
.e_reset_n (e_reset_n ), // external reset
.p_reset_n (p_reset_n ), // power-on reset
.s_reset_n (s_reset_n ), // soft reset
.cfg_strap_pad_ctrl (cfg_strap_pad_ctrl ),
.system_strap (system_strap ),
.strap_sticky (strap_sticky_rp ),
.strap_uartm (strap_uartm_rp ),
.wbd_int_rst_n (wbd_int_rst_n ),
.wbd_pll_rst_n (wbd_pll_rst_n ),
// Master Port
.wbm_rst_i (wb_rst_i ),
.wbm_clk_i (wb_clk_i ),
.wbm_cyc_i (wbs_cyc_i ),
.wbm_stb_i (wbs_stb_i ),
.wbm_adr_i (wbs_adr_i ),
.wbm_we_i (wbs_we_i ),
.wbm_dat_i (wbs_dat_i ),
.wbm_sel_i (wbs_sel_i ),
.wbm_dat_o (wbs_dat_o ),
.wbm_ack_o (wbs_ack_o ),
.wbm_err_o ( ),
// Clock Skeq Adjust
.wbd_clk_int (wbd_clk_int ),
.wbd_clk_wh (wbd_clk_wh ),
.cfg_cska_wh (cfg_wcska_wh ),
// Slave Port
.wbs_clk_out (wbd_clk_int ),
.wbs_clk_i (wbd_clk_wh ),
.wbs_cyc_o (wbd_int_cyc_i ),
.wbs_stb_o (wbd_int_stb_i ),
.wbs_adr_o (wbd_int_adr_i ),
.wbs_we_o (wbd_int_we_i ),
.wbs_dat_o (wbd_int_dat_i ),
.wbs_sel_o (wbd_int_sel_i ),
.wbs_dat_i (wbd_int_dat_o ),
.wbs_ack_i (wbd_int_ack_o ),
.wbs_err_i (wbd_int_err_o ),
.cfg_clk_skew_ctrl1 (cfg_clk_skew_ctrl1 ),
.cfg_clk_skew_ctrl2 (cfg_clk_skew_ctrl2 ),
.la_data_in (la_data_in[17:0] ),
.uartm_rxd (uartm_rxd ),
.uartm_txd (uartm_txd ),
.sclk (sspis_sck ),
.ssn (sspis_ssn ),
.sdin (sspis_si ),
.sdout (sspis_so ),
.sdout_oen ( )
);
// This rtl/gds picked from efabless caravel project
dg_pll u_pll(
`ifdef USE_POWER_PINS
.VPWR (vccd1 ),
.VGND (vssd1 ),
`endif
.resetb (wbd_pll_rst_n ),
.enable (cfg_pll_enb ),
.div (cfg_pll_fed_div ),
.dco (cfg_dco_mode ),
.ext_trim (cfg_dc_trim ),
.osc (pll_ref_clk ),
.clockp (pll_clk_out )
);
//------------------------------------------------------------------------------
// RISC V Core instance
//------------------------------------------------------------------------------
ycr4_top_wb u_riscv_top (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
.wbd_clk_int (wbd_clk_risc_rp ),
.cfg_wcska_riscv_intf (cfg_wcska_riscv_rp ),
.wbd_clk_skew (wbd_clk_riscv_skew ),
// Reset
.pwrup_rst_n (wbd_int_rst_n ),
.rst_n (wbd_int_rst_n ),
.cpu_intf_rst_n (cpu_intf_rst_n ),
.cpu_core_rst_n (cpu_core_rst_n ),
.riscv_debug (riscv_debug ),
.core_debug_sel (cfg_riscv_debug_sel ),
.cfg_sram_lphase (cfg_riscv_sram_lphase ),
.cfg_cache_ctrl (cfg_riscv_cache_ctrl ),
.cfg_bypass_icache (cfg_bypass_icache ),
.cfg_bypass_dcache (cfg_bypass_dcache ),
// Clock
.core_clk_int (cpu_clk ),
.cfg_ccska_riscv_intf (cfg_ccska_riscv_intf_rp ),
.cfg_ccska_riscv_icon (cfg_ccska_riscv_icon_rp ),
.cfg_ccska_riscv_core0 (cfg_ccska_riscv_core0_rp ),
.cfg_ccska_riscv_core1 (cfg_ccska_riscv_core1_rp ),
.cfg_ccska_riscv_core2 (cfg_ccska_riscv_core2_rp ),
.cfg_ccska_riscv_core3 (cfg_ccska_riscv_core3_rp ),
.rtc_clk (rtc_clk ),
// IRQ
.irq_lines (irq_lines_rp ),
.soft_irq (soft_irq_rp ), // TODO - Interrupts
// DFT
// .test_mode (1'b0 ), // Moved inside IP
// .test_rst_n (1'b1 ), // Moved inside IP
`ifndef SCR1_TCM_MEM
// SRAM-0 PORT-0
.sram0_clk0 (sram0_clk0 ),
.sram0_csb0 (sram0_csb0 ),
.sram0_web0 (sram0_web0 ),
.sram0_addr0 (sram0_addr0 ),
.sram0_wmask0 (sram0_wmask0 ),
.sram0_din0 (sram0_din0 ),
.sram0_dout0 (sram0_dout0 ),
// SRAM-0 PORT-0
.sram0_clk1 (sram0_clk1 ),
.sram0_csb1 (sram0_csb1 ),
.sram0_addr1 (sram0_addr1 ),
.sram0_dout1 (sram0_dout1 ),
// // SRAM-1 PORT-0
// .sram1_clk0 (sram1_clk0 ),
// .sram1_csb0 (sram1_csb0 ),
// .sram1_web0 (sram1_web0 ),
// .sram1_addr0 (sram1_addr0 ),
// .sram1_wmask0 (sram1_wmask0 ),
// .sram1_din0 (sram1_din0 ),
// .sram1_dout0 (sram1_dout0 ),
//
// // SRAM PORT-0
// .sram1_clk1 (sram1_clk1 ),
// .sram1_csb1 (sram1_csb1 ),
// .sram1_addr1 (sram1_addr1 ),
// .sram1_dout1 (sram1_dout1 ),
`endif
.wb_rst_n (wbd_int_rst_n ),
.wb_clk (wbd_clk_riscv_skew ),
// Instruction cache memory interface
.wb_icache_stb_o (wbd_riscv_icache_stb_i ),
.wb_icache_adr_o (wbd_riscv_icache_adr_i ),
.wb_icache_we_o (wbd_riscv_icache_we_i ),
.wb_icache_sel_o (wbd_riscv_icache_sel_i ),
.wb_icache_bl_o (wbd_riscv_icache_bl_i ),
.wb_icache_bry_o (wbd_riscv_icache_bry_i ),
.wb_icache_dat_i (wbd_riscv_icache_dat_o ),
.wb_icache_ack_i (wbd_riscv_icache_ack_o ),
.wb_icache_lack_i (wbd_riscv_icache_lack_o ),
.wb_icache_err_i (wbd_riscv_icache_err_o ),
.icache_mem_clk0 (icache_mem_clk0 ), // CLK
.icache_mem_csb0 (icache_mem_csb0 ), // CS#
.icache_mem_web0 (icache_mem_web0 ), // WE#
.icache_mem_addr0 (icache_mem_addr0 ), // Address
.icache_mem_wmask0 (icache_mem_wmask0 ), // WMASK#
.icache_mem_din0 (icache_mem_din0 ), // Write Data
// .icache_mem_dout0 (icache_mem_dout0 ), // Read Data
.icache_mem_clk1 (icache_mem_clk1 ), // CLK
.icache_mem_csb1 (icache_mem_csb1 ), // CS#
.icache_mem_addr1 (icache_mem_addr1 ), // Address
.icache_mem_dout1 (icache_mem_dout1 ), // Read Data
// Data cache memory interface
.wb_dcache_stb_o (wbd_riscv_dcache_stb_i ),
.wb_dcache_adr_o (wbd_riscv_dcache_adr_i ),
.wb_dcache_we_o (wbd_riscv_dcache_we_i ),
.wb_dcache_dat_o (wbd_riscv_dcache_dat_i ),
.wb_dcache_sel_o (wbd_riscv_dcache_sel_i ),
.wb_dcache_bl_o (wbd_riscv_dcache_bl_i ),
.wb_dcache_bry_o (wbd_riscv_dcache_bry_i ),
.wb_dcache_dat_i (wbd_riscv_dcache_dat_o ),
.wb_dcache_ack_i (wbd_riscv_dcache_ack_o ),
.wb_dcache_lack_i (wbd_riscv_dcache_lack_o ),
.wb_dcache_err_i (wbd_riscv_dcache_err_o ),
.dcache_mem_clk0 (dcache_mem_clk0 ), // CLK
.dcache_mem_csb0 (dcache_mem_csb0 ), // CS#
.dcache_mem_web0 (dcache_mem_web0 ), // WE#
.dcache_mem_addr0 (dcache_mem_addr0 ), // Address
.dcache_mem_wmask0 (dcache_mem_wmask0 ), // WMASK#
.dcache_mem_din0 (dcache_mem_din0 ), // Write Data
.dcache_mem_dout0 (dcache_mem_dout0 ), // Read Data
.dcache_mem_clk1 (dcache_mem_clk1 ), // CLK
.dcache_mem_csb1 (dcache_mem_csb1 ), // CS#
.dcache_mem_addr1 (dcache_mem_addr1 ), // Address
.dcache_mem_dout1 (dcache_mem_dout1 ), // Read Data
// Data memory interface
.wbd_dmem_stb_o (wbd_riscv_dmem_stb_i ),
.wbd_dmem_adr_o (wbd_riscv_dmem_adr_i ),
.wbd_dmem_we_o (wbd_riscv_dmem_we_i ),
.wbd_dmem_dat_o (wbd_riscv_dmem_dat_i ),
.wbd_dmem_sel_o (wbd_riscv_dmem_sel_i ),
.wbd_dmem_bl_o (wbd_riscv_dmem_bl_i ),
.wbd_dmem_bry_o (wbd_riscv_dmem_bry_i ),
.wbd_dmem_dat_i (wbd_riscv_dmem_dat_o ),
.wbd_dmem_ack_i (wbd_riscv_dmem_ack_o ),
.wbd_dmem_lack_i (wbd_riscv_dmem_lack_o ),
.wbd_dmem_err_i (wbd_riscv_dmem_err_o )
);
`ifndef SCR1_TCM_MEM
sky130_sram_2kbyte_1rw1r_32x512_8 u_tsram0_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// area 1 1.8V supply
.vssd1 (vssd1 ),// area 1 digital ground
`endif
// Port 0: RW
.clk0 (sram0_clk0 ),
.csb0 (sram0_csb0 ),
.web0 (sram0_web0 ),
.wmask0 (sram0_wmask0 ),
.addr0 (sram0_addr0 ),
.din0 (sram0_din0 ),
.dout0 (sram0_dout0 ),
// Port 1: R
.clk1 (sram0_clk1 ),
.csb1 (sram0_csb1 ),
.addr1 (sram0_addr1 ),
.dout1 (sram0_dout1 )
);
/***
sky130_sram_2kbyte_1rw1r_32x512_8 u_tsram1_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (sram1_clk0 ),
.csb0 (sram1_csb0 ),
.web0 (sram1_web0 ),
.wmask0 (sram1_wmask0 ),
.addr0 (sram1_addr0 ),
.din0 (sram1_din0 ),
.dout0 (sram1_dout0 ),
// Port 1: R
.clk1 (sram1_clk1 ),
.csb1 (sram1_csb1 ),
.addr1 (sram1_addr1 ),
.dout1 (sram1_dout1 )
);
***/
`endif
sky130_sram_2kbyte_1rw1r_32x512_8 u_icache_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (icache_mem_clk0 ),
.csb0 (icache_mem_csb0 ),
.web0 (icache_mem_web0 ),
.wmask0 (icache_mem_wmask0 ),
.addr0 (icache_mem_addr0 ),
.din0 (icache_mem_din0 ),
.dout0 ( ),
// Port 1: R
.clk1 (icache_mem_clk1 ),
.csb1 (icache_mem_csb1 ),
.addr1 (icache_mem_addr1 ),
.dout1 (icache_mem_dout1 )
);
sky130_sram_2kbyte_1rw1r_32x512_8 u_dcache_2kb(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
// Port 0: RW
.clk0 (dcache_mem_clk0 ),
.csb0 (dcache_mem_csb0 ),
.web0 (dcache_mem_web0 ),
.wmask0 (dcache_mem_wmask0 ),
.addr0 (dcache_mem_addr0 ),
.din0 (dcache_mem_din0 ),
.dout0 (dcache_mem_dout0 ),
// Port 1: R
.clk1 (dcache_mem_clk1 ),
.csb1 (dcache_mem_csb1 ),
.addr1 (dcache_mem_addr1 ),
.dout1 (dcache_mem_dout1 )
);
/*********************************************************
* SPI Master
* This is implementation of an SPI master that is controlled via an AXI bus .
* It has FIFOs for transmitting and receiving data.
* It supports both the normal SPI mode and QPI mode with 4 data lines.
* *******************************************************/
qspim_top
#(
`ifndef SYNTHESIS
.WB_WIDTH (WB_WIDTH )
`endif
) u_qspi_master
(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
.mclk (wbd_clk_spi ),
.rst_n (qspim_rst_n ),
.strap_flash (strap_qspi_flash ),
.strap_pre_sram (strap_qspi_pre_sram ),
.strap_sram (strap_qspi_sram ),
.cfg_init_bypass (strap_qspi_init_bypass ),
// Clock Skew Adjust
.cfg_cska_sp_co (cfg_wcska_qspi_co_rp ),
.cfg_cska_spi (cfg_wcska_qspi_rp ),
.wbd_clk_int (wbd_clk_qspi_rp ),
.wbd_clk_spi (wbd_clk_spi ),
.wbd_stb_i (wbd_spim_stb_o ),
.wbd_adr_i (wbd_spim_adr_o ),
.wbd_we_i (wbd_spim_we_o ),
.wbd_dat_i (wbd_spim_dat_o ),
.wbd_sel_i (wbd_spim_sel_o ),
.wbd_bl_i (wbd_spim_bl_o ),
.wbd_bry_i (wbd_spim_bry_o ),
.wbd_dat_o (wbd_spim_dat_i ),
.wbd_ack_o (wbd_spim_ack_i ),
.wbd_lack_o (wbd_spim_lack_i ),
.wbd_err_o (wbd_spim_err_i ),
.spi_debug (spi_debug ),
// Pad Interface
.spi_sdi (sflash_di ),
.spi_clk (sflash_sck ),
.spi_csn (spi_csn ),
.spi_sdo (sflash_do ),
.spi_oen (sflash_oen )
);
wb_interconnect #(
`ifndef SYNTHESIS
.CH_CLK_WD (4 ),
.CH_DATA_WD (146 )
`endif
) u_intercon (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
.ch_clk_in ({
wbd_clk_int,
wbd_clk_int,
wbd_clk_int,
wbd_clk_int} ),
.ch_clk_out ({
wbd_clk_pinmux_rp,
wbd_clk_uart_rp,
wbd_clk_qspi_rp,
wbd_clk_risc_rp} ),
.ch_data_in ({
strap_sticky[31:0],
strap_uartm[1:0],
system_strap[31:0],
p_reset_n,
e_reset_n,
cfg_strap_pad_ctrl,
soft_irq,
irq_lines[31:0],
cfg_ccska_riscv_core3[3:0],
cfg_ccska_riscv_core2[3:0],
cfg_ccska_riscv_core1[3:0],
cfg_ccska_riscv_core0[3:0],
cfg_ccska_riscv_icon[3:0],
cfg_ccska_riscv_intf[3:0],
cfg_wcska_qspi_co[3:0],
cfg_wcska_pinmux[3:0],
cfg_wcska_uart[3:0],
cfg_wcska_qspi[3:0],
cfg_wcska_riscv[3:0]
} ),
.ch_data_out ({
strap_sticky_rp[31:0],
strap_uartm_rp[1:0],
system_strap_rp[31:0],
p_reset_n_rp,
e_reset_n_rp,
cfg_strap_pad_ctrl_rp,
soft_irq_rp,
irq_lines_rp[31:0],
cfg_ccska_riscv_core3_rp[3:0],
cfg_ccska_riscv_core2_rp[3:0],
cfg_ccska_riscv_core1_rp[3:0],
cfg_ccska_riscv_core0_rp[3:0],
cfg_ccska_riscv_icon_rp[3:0],
cfg_ccska_riscv_intf_rp[3:0],
cfg_wcska_qspi_co_rp[3:0],
cfg_wcska_pinmux_rp[3:0],
cfg_wcska_uart_rp[3:0],
cfg_wcska_qspi_rp[3:0],
cfg_wcska_riscv_rp[3:0]
} ),
// Clock Skew adjust
.wbd_clk_int (wbd_clk_int ),
.cfg_cska_wi (cfg_wcska_wi ),
.wbd_clk_wi (wbd_clk_wi_skew ),
.clk_i (wbd_clk_wi_skew ),
.rst_n (wbd_int_rst_n ),
// Master 0 Interface
.m0_wbd_dat_i (wbd_int_dat_i ),
.m0_wbd_adr_i (wbd_int_adr_i ),
.m0_wbd_sel_i (wbd_int_sel_i ),
.m0_wbd_we_i (wbd_int_we_i ),
.m0_wbd_cyc_i (wbd_int_cyc_i ),
.m0_wbd_stb_i (wbd_int_stb_i ),
.m0_wbd_dat_o (wbd_int_dat_o ),
.m0_wbd_ack_o (wbd_int_ack_o ),
.m0_wbd_err_o (wbd_int_err_o ),
// Master 1 Interface
.m1_wbd_dat_i (wbd_riscv_dmem_dat_i ),
.m1_wbd_adr_i (wbd_riscv_dmem_adr_i ),
.m1_wbd_sel_i (wbd_riscv_dmem_sel_i ),
.m1_wbd_bl_i (wbd_riscv_dmem_bl_i ),
.m1_wbd_bry_i (wbd_riscv_dmem_bry_i ),
.m1_wbd_we_i (wbd_riscv_dmem_we_i ),
.m1_wbd_cyc_i (wbd_riscv_dmem_stb_i ),
.m1_wbd_stb_i (wbd_riscv_dmem_stb_i ),
.m1_wbd_dat_o (wbd_riscv_dmem_dat_o ),
.m1_wbd_ack_o (wbd_riscv_dmem_ack_o ),
.m1_wbd_lack_o (wbd_riscv_dmem_lack_o ),
.m1_wbd_err_o (wbd_riscv_dmem_err_o ),
// Master 2 Interface
.m2_wbd_dat_i (wbd_riscv_dcache_dat_i ),
.m2_wbd_adr_i (wbd_riscv_dcache_adr_i ),
.m2_wbd_sel_i (wbd_riscv_dcache_sel_i ),
.m2_wbd_bl_i (wbd_riscv_dcache_bl_i ),
.m2_wbd_bry_i (wbd_riscv_dcache_bry_i ),
.m2_wbd_we_i (wbd_riscv_dcache_we_i ),
.m2_wbd_cyc_i (wbd_riscv_dcache_stb_i ),
.m2_wbd_stb_i (wbd_riscv_dcache_stb_i ),
.m2_wbd_dat_o (wbd_riscv_dcache_dat_o ),
.m2_wbd_ack_o (wbd_riscv_dcache_ack_o ),
.m2_wbd_lack_o (wbd_riscv_dcache_lack_o ),
.m2_wbd_err_o (wbd_riscv_dcache_err_o ),
// Master 3 Interface
.m3_wbd_adr_i (wbd_riscv_icache_adr_i ),
.m3_wbd_sel_i (wbd_riscv_icache_sel_i ),
.m3_wbd_bl_i (wbd_riscv_icache_bl_i ),
.m3_wbd_bry_i (wbd_riscv_icache_bry_i ),
.m3_wbd_we_i (wbd_riscv_icache_we_i ),
.m3_wbd_cyc_i (wbd_riscv_icache_stb_i ),
.m3_wbd_stb_i (wbd_riscv_icache_stb_i ),
.m3_wbd_dat_o (wbd_riscv_icache_dat_o ),
.m3_wbd_ack_o (wbd_riscv_icache_ack_o ),
.m3_wbd_lack_o (wbd_riscv_icache_lack_o ),
.m3_wbd_err_o (wbd_riscv_icache_err_o ),
// Slave 0 Interface
// .s0_wbd_err_i (1'b0 ), - Moved inside IP
.s0_wbd_dat_i (wbd_spim_dat_i ),
.s0_wbd_ack_i (wbd_spim_ack_i ),
.s0_wbd_lack_i (wbd_spim_lack_i ),
.s0_wbd_dat_o (wbd_spim_dat_o ),
.s0_wbd_adr_o (wbd_spim_adr_o ),
.s0_wbd_bry_o (wbd_spim_bry_o ),
.s0_wbd_bl_o (wbd_spim_bl_o ),
.s0_wbd_sel_o (wbd_spim_sel_o ),
.s0_wbd_we_o (wbd_spim_we_o ),
.s0_wbd_cyc_o (wbd_spim_cyc_o ),
.s0_wbd_stb_o (wbd_spim_stb_o ),
// Slave 1 Interface
// .s1_wbd_err_i (1'b0 ), - Moved inside IP
.s1_wbd_dat_i (wbd_uart_dat_i ),
.s1_wbd_ack_i (wbd_uart_ack_i ),
.s1_wbd_dat_o (wbd_uart_dat_o ),
.s1_wbd_adr_o (wbd_uart_adr_o ),
.s1_wbd_sel_o (wbd_uart_sel_o ),
.s1_wbd_we_o (wbd_uart_we_o ),
.s1_wbd_cyc_o (wbd_uart_cyc_o ),
.s1_wbd_stb_o (wbd_uart_stb_o ),
// Slave 2 Interface
// .s2_wbd_err_i (1'b0 ), - Moved inside IP
.s2_wbd_dat_i (wbd_glbl_dat_i ),
.s2_wbd_ack_i (wbd_glbl_ack_i ),
.s2_wbd_dat_o (wbd_glbl_dat_o ),
.s2_wbd_adr_o (wbd_glbl_adr_o ),
.s2_wbd_sel_o (wbd_glbl_sel_o ),
.s2_wbd_we_o (wbd_glbl_we_o ),
.s2_wbd_cyc_o (wbd_glbl_cyc_o ),
.s2_wbd_stb_o (wbd_glbl_stb_o )
);
uart_i2c_usb_spi_top u_uart_i2c_usb_spi (
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
.wbd_clk_int (wbd_clk_uart_rp ),
.cfg_cska_uart (cfg_wcska_uart_rp ),
.wbd_clk_uart (wbd_clk_uart_skew ),
.uart_rstn (uart_rst_n ), // uart reset
.i2c_rstn (i2c_rst_n ), // i2c reset
.usb_rstn (usb_rst_n ), // USB reset
.spi_rstn (sspim_rst_n ), // SPI reset
.app_clk (wbd_clk_uart_skew ),
.usb_clk (usb_clk ),
// Reg Bus Interface Signal
.reg_cs (wbd_uart_stb_o ),
.reg_wr (wbd_uart_we_o ),
.reg_addr (wbd_uart_adr_o[8:0] ),
.reg_wdata (wbd_uart_dat_o ),
.reg_be (wbd_uart_sel_o ),
// Outputs
.reg_rdata (wbd_uart_dat_i ),
.reg_ack (wbd_uart_ack_i ),
// Pad interface
.scl_pad_i (i2cm_clk_i ),
.scl_pad_o (i2cm_clk_o ),
.scl_pad_oen_o (i2cm_clk_oen ),
.sda_pad_i (i2cm_data_i ),
.sda_pad_o (i2cm_data_o ),
.sda_padoen_o (i2cm_data_oen ),
.i2cm_intr_o (i2cm_intr_o ),
.uart_rxd (uart_rxd ),
.uart_txd (uart_txd ),
.usb_in_dp (usb_dp_i ),
.usb_in_dn (usb_dn_i ),
.usb_out_dp (usb_dp_o ),
.usb_out_dn (usb_dn_o ),
.usb_out_tx_oen (usb_oen ),
.usb_intr_o (usb_intr_o ),
// SPIM Master
.sspim_sck (sspim_sck ),
.sspim_so (sspim_so ),
.sspim_si (sspim_si ),
.sspim_ssn (sspim_ssn )
);
pinmux_top u_pinmux(
`ifdef USE_POWER_PINS
.vccd1 (vccd1 ),// User area 1 1.8V supply
.vssd1 (vssd1 ),// User area 1 digital ground
`endif
//clk skew adjust
.cfg_cska_pinmux (cfg_wcska_pinmux_rp ),
.wbd_clk_int (wbd_clk_pinmux_rp ),
.wbd_clk_pinmux (wbd_clk_pinmux_skew ),
// System Signals
// Inputs
.mclk (wbd_clk_pinmux_skew ),
.e_reset_n (e_reset_n_rp ),
.p_reset_n (p_reset_n_rp ),
.s_reset_n (wbd_int_rst_n ),
.cfg_strap_pad_ctrl (cfg_strap_pad_ctrl_rp ),
.system_strap (system_strap_rp ),
.strap_sticky (strap_sticky ),
.strap_uartm (strap_uartm ),
.user_clock1 (wb_clk_i ),
.user_clock2 (user_clock2 ),
.int_pll_clock (int_pll_clock ),
.xtal_clk (xtal_clk ),
.cpu_clk (cpu_clk ),
.rtc_clk (rtc_clk ),
.usb_clk (usb_clk ),
// Reset Control
.cpu_core_rst_n (cpu_core_rst_n ),
.cpu_intf_rst_n (cpu_intf_rst_n ),
.qspim_rst_n (qspim_rst_n ),
.sspim_rst_n (sspim_rst_n ),
.uart_rst_n (uart_rst_n ),
.i2cm_rst_n (i2c_rst_n ),
.usb_rst_n (usb_rst_n ),
.cfg_riscv_ctrl (cfg_riscv_ctrl ),
// Reg Bus Interface Signal
.reg_cs (wbd_glbl_stb_o ),
.reg_wr (wbd_glbl_we_o ),
.reg_addr (wbd_glbl_adr_o ),
.reg_wdata (wbd_glbl_dat_o ),
.reg_be (wbd_glbl_sel_o ),
// Outputs
.reg_rdata (wbd_glbl_dat_i ),
.reg_ack (wbd_glbl_ack_i ),
// Risc configuration
.irq_lines (irq_lines ),
.soft_irq (soft_irq ),
.user_irq (user_irq ),
.usb_intr (usb_intr_o ),
.i2cm_intr (i2cm_intr_o ),
// Digital IO
.digital_io_out (io_out ),
.digital_io_oen (io_oeb ),
.digital_io_in (io_in ),
// SFLASH I/F
.sflash_sck (sflash_sck ),
.sflash_ss (spi_csn ),
.sflash_oen (sflash_oen ),
.sflash_do (sflash_do ),
.sflash_di (sflash_di ),
// USB I/F
.usb_dp_o (usb_dp_o ),
.usb_dn_o (usb_dn_o ),
.usb_oen (usb_oen ),
.usb_dp_i (usb_dp_i ),
.usb_dn_i (usb_dn_i ),
// UART I/F
.uart_txd (uart_txd ),
.uart_rxd (uart_rxd ),
// I2CM I/F
.i2cm_clk_o (i2cm_clk_o ),
.i2cm_clk_i (i2cm_clk_i ),
.i2cm_clk_oen (i2cm_clk_oen ),
.i2cm_data_oen (i2cm_data_oen ),
.i2cm_data_o (i2cm_data_o ),
.i2cm_data_i (i2cm_data_i ),
// SPI MASTER
.spim_sck (sspim_sck ),
.spim_ssn (sspim_ssn ),
.spim_miso (sspim_so ),
.spim_mosi (sspim_si ),
// SPI SLAVE
.spis_sck (sspis_sck ),
.spis_ssn (sspis_ssn ),
.spis_miso (sspis_so ),
.spis_mosi (sspis_si ),
// UART MASTER I/F
.uartm_rxd (uartm_rxd ),
.uartm_txd (uartm_txd ),
.pulse1m_mclk (pulse1m_mclk ),
.pinmux_debug (pinmux_debug ),
.cfg_pll_enb (cfg_pll_enb ),
.cfg_pll_fed_div (cfg_pll_fed_div ),
.cfg_dco_mode (cfg_dco_mode ),
.cfg_dc_trim (cfg_dc_trim ),
.pll_ref_clk (pll_ref_clk ),
.cfg_dac0_mux_sel (cfg_dac0_mux_sel ),
.cfg_dac1_mux_sel (cfg_dac1_mux_sel ),
.cfg_dac2_mux_sel (cfg_dac2_mux_sel ),
.cfg_dac3_mux_sel (cfg_dac3_mux_sel )
);
dac_top u_4x8bit_dac(
`ifdef USE_POWER_PINS
.vccd1 (vdda1 ),
.vssd1 (vssa1 ),
`endif
.Vref (analog_io[23]),
.DIn0 (cfg_dac0_mux_sel),
.DIn1 (cfg_dac1_mux_sel),
.DIn2 (cfg_dac2_mux_sel),
.DIn3 (cfg_dac3_mux_sel),
.Vout0(analog_io[15] ),
.Vout1(analog_io[16] ),
.Vout2(analog_io[17] ),
.Vout3(analog_io[18] )
);
endmodule : user_project_wrapper