blob: 92b9f70ae98a067e7b537ed5dfb89fe3af9770c2 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: 2022, Jure Vreca //
// //
// Licenseunder the Apache License, Version 2.0(the "License"); //
// you maynot 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: Jure Vreca <jurevreca12@gmail.com> //
////////////////////////////////////////////////////////////////////////////////
`include "inc/rvj1_defines.v"
`default_nettype none
module rvj1_caravel_soc #(
parameter JEDRO_1_BOOT_ADDR = `JEDRO_1_BOOT_ADDR,
parameter IRAM_BASE_ADDR = `IRAM_BASE_ADDR,
parameter IRAM_ADDR_WIDTH_WORDS = `IRAM_ADDR_WIDTH_WORDS,
parameter IRAM_ADDR_WIDTH_WORDS_PER_MACRO = `IRAM_ADDR_WIDTH_WORDS_PER_MACRO,
parameter DRAM_BASE_ADDR = `DRAM_BASE_ADDR,
parameter DRAM_ADDR_WIDTH_WORDS = `DRAM_ADDR_WIDTH_WORDS,
parameter RVJ1_GPIO_BASE_ADDR = `RVJ1_GPIO_BASE_ADDR,
parameter RVJ1_TIMER_BASE_ADDR = `RVJ1_TIMER_BASE_ADDR
)(
`ifdef USE_POWER_PINS
inout vccd1, // User area 1 1.8V supply
inout vssd1, // User area 1 digital ground
`endif
//crarvel------------------------------------------------------------
// Logic analyzer signals
input [127:0] la_data_in,
output [127:0] la_data_out,
input [127:0] la_oenb,
//input hehe_rstn,
//input sel_wb,
input [24-1:0] gpio_in,
output [24-1:0] gpio_out,
output [38-1:0] gpio_oeb,
output [2:0] user_irq,
// Wishbone Slave ports (WB MI A)
input wb_clk_i,
input wb_rst_i,
input wbs_stb_i,
input wbs_cyc_i,
input wbs_we_i,
input [3:0] wbs_sel_i,
input [31:0] wbs_dat_i,
input [31:0] wbs_adr_i,
output wbs_ack_o,
output [31:0] wbs_dat_o,
//crarvel------------------------------------------------------------
//i sram
output iram_clk0,
output iram_csb0_A,
output iram_csb0_B,
output iram_web0,
output [3:0] iram_wmask0,
output [IRAM_ADDR_WIDTH_WORDS_PER_MACRO-1:0] iram_addr0,
output [31:0] iram_din0,
input [31:0] iram_dout0_A,
input [31:0] iram_dout0_B,
//d sram
output dram_clk0,
output dram_csb0,
output dram_web0,
output [3:0] dram_wmask0,
output [DRAM_ADDR_WIDTH_WORDS-1:0] dram_addr0,
output [31:0] dram_din0,
input [31:0] dram_dout0,
//arb //bug here
input cpu2dmux_we,
input cpu2dmux_stb,
output cpu2dmux_ack,
input [31:0] cpu2dmux_addr,
input [31:0] cpu2dmux_wdata,
output [31:0] cpu2dmux_rdata,
input [3:0] cpu2dmux_sel,
input [9:0] cpu2dmux_bl,
input cpu2dmux_bry,
input cpu2dmux_cyc,
//I$
output [31:0] cpu2imux_rdata,
input [31:0] cpu2imux_addr,
output cpu2imux_ack,
input [9:0] cpu2imux_bl,
input cpu2imux_bry,
input cpu2imux_we,
input cpu2imux_cyc,
input cpu2imux_stb
);
wire cpu2dmux_err;
///////////////////////////////////////////
// LOCAL PARAMS
///////////////////////////////////////////
localparam IRAM_ADDR_WIDTH_BYTES = IRAM_ADDR_WIDTH_WORDS + 2;
localparam DRAM_ADDR_WIDTH_BYTES = DRAM_ADDR_WIDTH_WORDS + 2;
///////////////////////////////////////////
// SIGNAL DEFINITIONS
///////////////////////////////////////////
// wire hehe_rstn;
wire sel_wb;
wire [31:0] iram_dout0;
wire iram_csb0;
wire [IRAM_ADDR_WIDTH_WORDS-1:0] iram_addr0_internal;
wire wbs0_stb;
wire wbs0_cyc;
wire wbs0_we;
wire [3:0] wbs0_sel;
wire [31:0] wbs0_dat_toram;
wire [31:0] wbs0_adr;
wire wbs0_ack;
wire [31:0] wbs0_dat_fromram;
wire wbs1_stb;
wire wbs1_cyc;
wire wbs1_we;
wire [3:0] wbs1_sel;
wire [31:0] wbs1_dat_toram;
wire [31:0] wbs1_adr;
wire wbs1_ack;
wire [31:0] wbs1_dat_fromram;
wire wbs2_stb;
wire wbs2_cyc;
wire wbs2_we;
wire [3:0] wbs2_sel;
wire [31:0] wbs2_dat_towb;
wire [31:0] wbs2_adr;
wire wbs2_ack;
wire [31:0] wbs2_dat_fromwb;
wire wb_rvj1_tomux_clk;
wire wb_rvj1_tomux_rst;
wire wb_rvj1_tomux_stb;
wire wb_rvj1_tomux_cyc;
wire wb_rvj1_tomux_we;
wire [3:0] wb_rvj1_tomux_sel;
wire [31:0] wb_rvj1_tomux_dat_fromcpu;
wire [31:0] wb_rvj1_tomux_adr;
wire wb_rvj1_tomux_ack;
wire [31:0] wb_rvj1_tomux_dat_tocpu;
wire wb_rvj1_gpio_stb;
wire wb_rvj1_gpio_cyc;
wire wb_rvj1_gpio_we;
wire [3:0] wb_rvj1_gpio_sel;
wire [31:0] wb_rvj1_gpio_dat_fromcpu;
wire [31:0] wb_rvj1_gpio_adr;
wire wb_rvj1_gpio_ack;
wire [31:0] wb_rvj1_gpio_dat_tocpu;
wire wb_rvj1_timer_stb;
wire wb_rvj1_timer_cyc;
wire wb_rvj1_timer_we;
wire [3:0] wb_rvj1_timer_sel;
wire [31:0] wb_rvj1_timer_dat_fromcpu;
wire [31:0] wb_rvj1_timer_adr;
wire wb_rvj1_timer_ack;
wire [31:0] wb_rvj1_timer_dat_tocpu;
wire [31:0] time_debug;
assign sel_wb = la_data_in[0];
assign la_data_out = {5'b0, gpio_out, cpu2imux_rdata, cpu2imux_addr, time_debug, 2'b0};
assign user_irq = 3'b000;
wishbone_mux #(.BASE_ADDR_0(IRAM_BASE_ADDR),
.ADDR_WIDTH_0(IRAM_ADDR_WIDTH_BYTES),
.BASE_ADDR_1(DRAM_BASE_ADDR),
.ADDR_WIDTH_1(DRAM_ADDR_WIDTH_BYTES)) wishbone_mux_inst (
`ifdef USE_POWER_PINS
.vccd1(vccd1), // User area 1 1.8V power
.vssd1(vssd1), // User area 1 digital ground
`endif
.wbs_stb_i (wbs_stb_i),
.wbs_cyc_i (wbs_cyc_i),
.wbs_we_i (wbs_we_i),
.wbs_sel_i (wbs_sel_i),
.wbs_dat_i (wbs_dat_i),
.wbs_adr_i (wbs_adr_i),
.wbs_ack_o (wbs_ack_o),
.wbs_dat_o (wbs_dat_o),
.wbs0_stb_o (wbs0_stb),
.wbs0_cyc_o (wbs0_cyc),
.wbs0_we_o (wbs0_we),
.wbs0_sel_o (wbs0_sel),
.wbs0_dat_o (wbs0_dat_toram),
.wbs0_adr_o (wbs0_adr),
.wbs0_ack_i (wbs0_ack),
.wbs0_dat_i (wbs0_dat_fromram),
.wbs1_stb_o (wbs1_stb),
.wbs1_cyc_o (wbs1_cyc),
.wbs1_we_o (wbs1_we),
.wbs1_sel_o (wbs1_sel),
.wbs1_dat_o (wbs1_dat_toram),
.wbs1_adr_o (wbs1_adr),
.wbs1_ack_i (wbs1_ack),
.wbs1_dat_i (wbs1_dat_fromram),
.wbs2_stb_o (),
.wbs2_cyc_o (),
.wbs2_we_o (),
.wbs2_sel_o (),
.wbs2_dat_o (),
.wbs2_adr_o (),
.wbs2_ack_i (1'b0),
.wbs2_dat_i (0));
instr_ram_mux #(.RAM_ADDR_WIDTH_BYTES(IRAM_ADDR_WIDTH_BYTES),
.BASE_ADDR(IRAM_BASE_ADDR)) iram_mux_inst (
`ifdef USE_POWER_PINS
.vccd1(vccd1), // User area 1 1.8V power
.vssd1(vssd1), // User area 1 digital ground
`endif
.sel_wb (sel_wb),
.rdata (cpu2imux_rdata),
.addr (cpu2imux_addr),
.we (cpu2imux_we),
.cyc (cpu2imux_cyc),
.stb (cpu2imux_stb),
.ack (cpu2imux_ack),
.wb_clk_i (wb_clk_i),
.wb_rst_i (wb_rst_i),
.wbs_stb_i (wbs0_stb),
.wbs_cyc_i (wbs0_cyc),
.wbs_we_i (wbs0_we),
.wbs_sel_i (wbs0_sel),
.wbs_dat_i (wbs0_dat_toram),
.wbs_adr_i (wbs0_adr),
.wbs_ack_o (wbs0_ack),
.wbs_dat_o (wbs0_dat_fromram),
.ram_clk0 (iram_clk0),
.ram_csb0 (iram_csb0),
.ram_web0 (iram_web0),
.ram_wmask0 (iram_wmask0),
.ram_addr0 (iram_addr0_internal),
.ram_din0 (iram_din0),
.ram_dout0 (iram_dout0));
assign iram_csb0_A = !(!iram_csb0 & (!iram_addr0_internal[IRAM_ADDR_WIDTH_WORDS-1]));
assign iram_csb0_B = !(!iram_csb0 & iram_addr0_internal[IRAM_ADDR_WIDTH_WORDS-1]);
assign iram_dout0 = iram_addr0_internal[IRAM_ADDR_WIDTH_WORDS-1] ? iram_dout0_B : iram_dout0_A;
assign iram_addr0 = iram_addr0_internal[IRAM_ADDR_WIDTH_WORDS_PER_MACRO-1:0];
data_ram_mux #(.RAM_ADDR_WIDTH_WORDS(DRAM_ADDR_WIDTH_WORDS),
.BASE_ADDR_RAM(DRAM_BASE_ADDR)) dram_mux_inst(
`ifdef USE_POWER_PINS
.vccd1(vccd1), // User area 1 1.8V power
.vssd1(vssd1), // User area 1 digital ground
`endif
.sel_wb(sel_wb),
.rdata (cpu2dmux_rdata),
.ack (cpu2dmux_ack),
.err (cpu2dmux_err),
.we (cpu2dmux_we),
.stb (cpu2dmux_stb),
.addr (cpu2dmux_addr),
.wdata (cpu2dmux_wdata),
.sel (cpu2dmux_sel),
.wb_clk_i (wb_clk_i),
.wb_rst_i (wb_rst_i),
.wbs_stb_i (wbs1_stb),
.wbs_cyc_i (wbs1_cyc),
.wbs_we_i (wbs1_we),
.wbs_sel_i (wbs1_sel),
.wbs_dat_i (wbs1_dat_toram),
.wbs_adr_i (wbs1_adr),
.wbs_ack_o (wbs1_ack),
.wbs_dat_o (wbs1_dat_fromram),
.ram_clk0 (dram_clk0),
.ram_csb0 (dram_csb0),
.ram_web0 (dram_web0),
.ram_wmask0 (dram_wmask0),
.ram_addr0 (dram_addr0),
.ram_din0 (dram_din0),
.ram_dout0 (dram_dout0),
.wbm_clk_o (wb_rvj1_tomux_clk),
.wbm_rst_o (wb_rvj1_tomux_rst),
.wbm_stb_o (wb_rvj1_tomux_stb),
.wbm_cyc_o (wb_rvj1_tomux_cyc),
.wbm_we_o (wb_rvj1_tomux_we),
.wbm_sel_o (wb_rvj1_tomux_sel),
.wbm_dat_o (wb_rvj1_tomux_dat_fromcpu),
.wbm_adr_o (wb_rvj1_tomux_adr),
.wbm_ack_i (wb_rvj1_tomux_ack),
.wbm_dat_i (wb_rvj1_tomux_dat_tocpu));
wishbone_mux #(.BASE_ADDR_0(RVJ1_GPIO_BASE_ADDR),
.ADDR_WIDTH_0(2),
.BASE_ADDR_1(RVJ1_TIMER_BASE_ADDR),
.ADDR_WIDTH_1(2)) wb_mux_rvj1_internal (
`ifdef USE_POWER_PINS
.vccd1(vccd1), // User area 1 1.8V power
.vssd1(vssd1), // User area 1 digital ground
`endif
.wbs_stb_i (wb_rvj1_tomux_stb),
.wbs_cyc_i (wb_rvj1_tomux_cyc),
.wbs_we_i (wb_rvj1_tomux_we),
.wbs_sel_i (wb_rvj1_tomux_sel),
.wbs_dat_i (wb_rvj1_tomux_dat_fromcpu),
.wbs_adr_i (wb_rvj1_tomux_adr),
.wbs_ack_o (wb_rvj1_tomux_ack),
.wbs_dat_o (wb_rvj1_tomux_dat_tocpu),
.wbs0_stb_o (wb_rvj1_gpio_stb),
.wbs0_cyc_o (wb_rvj1_gpio_cyc),
.wbs0_we_o (wb_rvj1_gpio_we),
.wbs0_sel_o (wb_rvj1_gpio_sel),
.wbs0_dat_o (wb_rvj1_gpio_dat_fromcpu),
.wbs0_adr_o (wb_rvj1_gpio_adr),
.wbs0_ack_i (wb_rvj1_gpio_ack),
.wbs0_dat_i (wb_rvj1_gpio_dat_tocpu),
.wbs1_stb_o (wb_rvj1_timer_stb),
.wbs1_cyc_o (wb_rvj1_timer_cyc),
.wbs1_we_o (wb_rvj1_timer_we),
.wbs1_sel_o (wb_rvj1_timer_sel),
.wbs1_dat_o (wb_rvj1_timer_dat_fromcpu),
.wbs1_adr_o (wb_rvj1_timer_adr),
.wbs1_ack_i (wb_rvj1_timer_ack),
.wbs1_dat_i (wb_rvj1_timer_dat_tocpu),
.wbs2_stb_o (),
.wbs2_cyc_o (),
.wbs2_we_o (),
.wbs2_sel_o (),
.wbs2_dat_o (),
.wbs2_adr_o (),
.wbs2_ack_i (1'b0),
.wbs2_dat_i (0));
gpio gpio_inst (
`ifdef USE_POWER_PINS
.vccd1(vccd1), // User area 1 1.8V power
.vssd1(vssd1), // User area 1 digital ground
`endif
.clk_i (wb_clk_i),
.rst_i (wb_rst_i),
.wbs_cyc_i (wb_rvj1_gpio_cyc),
.wbs_stb_i (wb_rvj1_gpio_stb),
.wbs_we_i (wb_rvj1_gpio_we),
.wbs_adr_i (wb_rvj1_gpio_adr),
.wbs_dat_i (wb_rvj1_gpio_dat_fromcpu),
.wbs_sel_i (wb_rvj1_gpio_sel),
.wbs_ack_o (wb_rvj1_gpio_ack),
.wbs_dat_o (wb_rvj1_gpio_dat_tocpu),
.gpio_in (gpio_in),
.gpio_out (gpio_out),
.gpio_oeb (gpio_oeb));
timer timer_inst (
`ifdef USE_POWER_PINS
.vccd1(vccd1), // User area 1 1.8V power
.vssd1(vssd1), // User area 1 digital ground
`endif
.clk_i (wb_clk_i),
.rst_i (wb_rst_i),
.wbs_cyc_i (wb_rvj1_timer_cyc),
.wbs_stb_i (wb_rvj1_timer_stb),
.wbs_we_i (wb_rvj1_timer_we),
.wbs_adr_i (wb_rvj1_timer_adr),
.wbs_dat_i (wb_rvj1_timer_dat_fromcpu),
.wbs_sel_i (wb_rvj1_timer_sel),
.wbs_ack_o (wb_rvj1_timer_ack),
.wbs_dat_o (wb_rvj1_timer_dat_tocpu),
.time_debug_o (time_debug));
endmodule
`default_nettype wire