Simulation clean up and wishbone interconnect added
diff --git a/verilog/rtl/digital_core/filelist_rtl.f b/verilog/rtl/digital_core/filelist_rtl.f
index 6b23b18..d22f12e 100755
--- a/verilog/rtl/digital_core/filelist_rtl.f
+++ b/verilog/rtl/digital_core/filelist_rtl.f
@@ -20,6 +20,9 @@
../sdram_ctrl/src/core/sdrc_xfr_ctl.v
../lib/wb_crossbar.v
+../lib/registers.v
+../lib/clk_ctl.v
+./src/glbl_cfg.sv
./src/digital_core.sv
diff --git a/verilog/rtl/digital_core/src/digital_core.sv b/verilog/rtl/digital_core/src/digital_core.sv
index bc5721a..44448ff 100644
--- a/verilog/rtl/digital_core/src/digital_core.sv
+++ b/verilog/rtl/digital_core/src/digital_core.sv
@@ -62,77 +62,44 @@
parameter SDR_BW = 1, // SDR Byte Width
parameter WB_WIDTH = 32 // WB ADDRESS/DARA WIDTH
) (
- input logic clk, // System clock
- input logic rtc_clk, // Real-time clock
- input logic pwrup_rst_n, // Power-Up Reset
- input logic cpu_rst_n, // CPU Reset (Core Reset)
- input logic rst_n, // Regular Reset signal
+`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 logic clk , // System clock
+ input logic rtc_clk , // Real-time clock
+ input logic rst_n , // Regular Reset signal
-`ifdef SCR1_DBG_EN
- output logic sys_rst_n_o, // External System Reset output
- // (for the processor cluster's components or
- // external SOC (could be useful in small
- // SCR-core-centric SOCs))
- output logic sys_rdc_qlfy_o, // System-to-External SOC Reset Domain Crossing Qualifier
-`endif // SCR1_DBG_EN
- // Fuses
- input logic [`SCR1_XLEN-1:0] fuse_mhartid, // Hart ID
+ input logic wbd_ext_cyc_i , // strobe/request
+ input logic wbd_ext_stb_i , // strobe/request
+ input logic [WB_WIDTH-1:0] wbd_ext_adr_i , // address
+ input logic wbd_ext_we_i , // write
+ input logic [WB_WIDTH-1:0] wbd_ext_dat_i , // data output
+ input logic [3:0] wbd_ext_sel_i , // byte enable
+ output logic [WB_WIDTH-1:0] wbd_ext_dat_o , // data input
+ output logic wbd_ext_ack_o , // acknowlegement
+ output logic wbd_ext_err_o , // error
-`ifdef SCR1_DBG_EN
- input logic [31:0] fuse_idcode, // TAPC IDCODE
-`endif // SCR1_DBG_EN
- // IRQ
-`ifdef SCR1_IPIC_EN
- input logic [SCR1_IRQ_LINES_NUM-1:0] irq_lines, // IRQ lines to IPIC
-`else // SCR1_IPIC_EN
- input logic ext_irq, // External IRQ input
-`endif // SCR1_IPIC_EN
- input logic soft_irq, // Software IRQ input
+
+ // Logic Analyzer Signals
+ input logic [127:0] la_data_in ,
+ output logic [127:0] la_data_out ,
+ input logic [127:0] la_oenb ,
+
-`ifdef SCR1_DBG_EN
- // -- JTAG I/F
- input logic trst_n,
- input logic tck,
- input logic tms,
- input logic tdi,
- output logic tdo,
- output logic tdo_en,
-`endif // SCR1_DBG_EN
- input logic wbd_ext_stb_i, // strobe/request
- input logic [WB_WIDTH-1:0] wbd_ext_adr_i, // address
- input logic wbd_ext_we_i, // write
- input logic [WB_WIDTH-1:0] wbd_ext_dat_i, // data output
- input logic [3:0] wbd_ext_sel_i, // byte enable
- output logic [WB_WIDTH-1:0] wbd_ext_dat_o, // data input
- output logic wbd_ext_ack_o, // acknowlegement
- output logic wbd_ext_err_o, // error
+ // IOs
+ input logic [37:0] io_in ,
+ output logic [37:0] io_out ,
+ output logic [37:0] io_oeb ,
- /* Interface to SDRAMs */
- output logic sdr_cke, // SDRAM CKE
- output logic sdr_cs_n, // SDRAM Chip Select
- output logic sdr_ras_n, // SDRAM ras
- output logic sdr_cas_n, // SDRAM cas
- output logic sdr_we_n, // SDRAM write enable
- output logic [SDR_BW-1:0] sdr_dqm, // SDRAM Data Mask
- output logic [1:0] sdr_ba, // SDRAM Bank Enable
- output logic [12:0] sdr_addr, // SDRAM Address
- input logic [SDR_DW-1:0] pad_sdr_din, // SDRA Data Input
- output logic [SDR_DW-1:0] sdr_dout, // SDRA Data output
- output logic [SDR_BW-1:0] sdr_den_n, // SDRAM Data Output enable
- input sdram_pad_clk,// Sdram clock loop back from pad
+ output logic [2:0] irq
- // SPI Master I/F
- output logic spim_clk,
- output logic spim_csn0,
- output logic spim_csn1,
- output logic spim_csn2,
- output logic spim_csn3,
- output logic [1:0] spim_mode,
- input logic [3:0] spim_sdi, // SPI Master out
- output logic [3:0] spim_sdo, // SPI Master out
- output logic spi_en_tx // SPI Pad directional control
-
- //inout tri [3:0] spim_sdio // SPI Master in/out
);
//---------------------------------------------------
@@ -181,7 +148,7 @@
// SPI Master Wishbone Interface
//---------------------------------------------------------------------
logic wbd_sdram_stb_o ;
-logic [WB_WIDTH-1:0] wbd_sdram_addr_o;
+logic [WB_WIDTH-1:0] wbd_sdram_adr_o ;
logic wbd_sdram_we_o ; // 1 - Write, 0 - Read
logic [WB_WIDTH-1:0] wbd_sdram_dat_o ;
logic [WB_WIDTH/8-1:0] wbd_sdram_sel_o ; // Byte enable
@@ -194,7 +161,7 @@
// Global Register Wishbone Interface
//---------------------------------------------------------------------
logic wbd_glbl_stb_o; // strobe/request
-logic [WB_WIDTH-1:0] wbd_glbl_addr_o; // address
+logic [WB_WIDTH-1:0] wbd_glbl_adr_o; // address
logic wbd_glbl_we_o; // write
logic [WB_WIDTH-1:0] wbd_glbl_dat_o; // data output
logic [3:0] wbd_glbl_sel_o; // byte enable
@@ -202,6 +169,19 @@
logic [WB_WIDTH-1:0] wbd_glbl_dat_i; // data input
logic wbd_glbl_ack_i; // acknowlegement
logic wbd_glbl_err_i; // error
+
+
+//----------------------------------------------------
+// CPU Configuration
+//----------------------------------------------------
+logic cpu_rst_n ;
+logic spi_rst_n ;
+logic sdram_rst_n ;
+
+logic [31:0] fuse_mhartid ;
+logic [15:0] irq_lines ;
+logic soft_irq ;
+
//------------------------------------------------
// Configuration Parameter
//------------------------------------------------
@@ -220,6 +200,50 @@
logic [`SDR_RFSH_TIMER_W-1 : 0] cfg_sdr_rfsh ;
logic [`SDR_RFSH_ROW_CNT_W -1 : 0] cfg_sdr_rfmax ;
+//----------------------------------------------------------------------
+// Interface to SDRAMs
+//--------------------------------------------------------------------------
+logic sdr_cke ; // SDRAM CKE
+logic sdr_cs_n ; // SDRAM Chip Select
+logic sdr_ras_n ; // SDRAM ras
+logic sdr_cas_n ; // SDRAM cas
+logic sdr_we_n ; // SDRAM write enable
+logic [SDR_BW-1:0] sdr_dqm ; // SDRAM Data Mask
+logic [1:0] sdr_ba ; // SDRAM Bank Enable
+logic [12:0] sdr_addr ; // SDRAM Address
+logic [SDR_DW-1:0] pad_sdr_din ; // SDRA Data Input
+logic [SDR_DW-1:0] sdr_dout ; // SDRA Data output
+logic [SDR_BW-1:0] sdr_den_n ; // SDRAM Data Output enable
+logic sdram_clk ; // Sdram clock loop back from pad
+logic pad_sdram_clk ; // Sdram clock loop back from pad
+
+
+assign pad_sdr_din[7:0] = io_in[7:0] ;
+assign io_out [7:0] = sdr_dout[7:0] ;
+assign io_out [20:8] = sdr_addr[12:0] ;
+assign io_out [22:21] = sdr_ba[1:0] ;
+assign io_out [23] = sdr_dqm[0] ;
+assign io_out [24] = sdr_we_n ;
+assign io_out [25] = sdr_cas_n ;
+assign io_out [26] = sdr_ras_n ;
+assign io_out [27] = sdr_cs_n ;
+assign io_out [28] = sdr_cke ;
+assign io_out [29] = sdram_clk ;
+assign pad_sdram_clk = io_in[29] ;
+
+assign io_oeb [7:0] = sdr_den_n ;
+assign io_oeb [20:8] = {(13) {1'b0}} ;
+assign io_oeb [22:21] = {(2) {1'b0}} ;
+assign io_oeb [23] = 1'b0 ;
+assign io_oeb [24] = 1'b0 ;
+assign io_oeb [25] = 1'b0 ;
+assign io_oeb [26] = 1'b0 ;
+assign io_oeb [27] = 1'b0 ;
+assign io_oeb [28] = 1'b0 ;
+assign io_oeb [29] = 1'b0 ;
+
+
+
//-----------------------------------------------------------
// SPI I/F
// ////////////////////////////////////////////////////
@@ -231,32 +255,42 @@
logic spim_sdi1 ; // SPI Master Data In[1]
logic spim_sdi2 ; // SPI Master Data In[2]
logic spim_sdi3 ; // SPI Master Data In[3]
+logic spim_clk ;
+logic spim_csn ;
+logic spi_en_tx ;
-//`ifdef VERILATOR // Verilator has limited support for bi-di pad
- assign spim_sdi0 = spim_sdi[0];
- assign spim_sdi1 = spim_sdi[1];
- assign spim_sdi2 = spim_sdi[2];
- assign spim_sdi3 = spim_sdi[3];
+assign spim_sdi0 = io_in[32];
+assign spim_sdi1 = io_in[33];
+assign spim_sdi2 = io_in[34];
+assign spim_sdi3 = io_in[35];
+
+assign io_out[30] = spim_clk;
+assign io_out[31] = spim_csn;
+assign io_out[32] = spim_sdo0;
+assign io_out[33] = spim_sdo1;
+assign io_out[34] = spim_sdo2;
+assign io_out[35] = spim_sdo3;
- assign spim_sdo = {spim_sdo3,spim_sdo2,spim_sdo1,spim_sdo0};
-//`else
-// assign spim_sdi0 = spim_sdio[0];
-// assign spim_sdi1 = spim_sdio[1];
-// assign spim_sdi2 = spim_sdio[2];
-// assign spim_sdi3 = spim_sdio[3];
-//
-// assign spim_sdio[0] = (spi_en_tx) ? spim_sdo0 : 1'bz;
-// assign spim_sdio[1] = (spi_en_tx) ? spim_sdo1 : 1'bz;
-// assign spim_sdio[2] = (spi_en_tx) ? spim_sdo2 : 1'bz;
-// assign spim_sdio[3] = (spi_en_tx) ? spim_sdo3 : 1'bz;
-//
-//`endif
+assign io_oeb[30] = 1'b0; // spi_clk
+assign io_oeb[31] = 1'b0; // spi_csn
+assign io_oeb[32] = !spi_en_tx; // spi_dio0
+assign io_oeb[33] = !spi_en_tx; // spi_dio1
+assign io_oeb[34] = !spi_en_tx; // spi_dio2
+assign io_oeb[35] = !spi_en_tx; // spi_dio3
+
+
+// for uart
+assign io_oeb[36] = 1'b1; // Unused
+assign io_oeb[37] = 1'b1; // Unused
+
+
+
//------------------------------------------------------------------------------
// RISC V Core instance
//------------------------------------------------------------------------------
scr1_top_wb u_riscv_top (
// Reset
- .pwrup_rst_n (pwrup_rst_n ),
+ .pwrup_rst_n (rst_n ),
.rst_n (rst_n ),
.cpu_rst_n (cpu_rst_n ),
`ifdef SCR1_DBG_EN
@@ -276,11 +310,11 @@
// IRQ
`ifdef SCR1_IPIC_EN
- .irq_lines ('0 ), // TODO - Interrupts
+ .irq_lines (irq_lines ),
`else // SCR1_IPIC_EN
- .ext_irq ('0 ), // TODO - Interrupts
+ .ext_irq (ext_irq ), // TODO - Interrupts
`endif // SCR1_IPIC_EN
- .soft_irq ('0 ), // TODO - Interrupts
+ .soft_irq (soft_irq ), // TODO - Interrupts
// DFT
.test_mode (1'b0 ),
@@ -332,7 +366,7 @@
) u_spi_master
(
.mclk (clk ),
- .rst_n (rst_n ),
+ .rst_n (spi_rst_n ),
.wbd_stb_i (wbd_spim_stb_o ),
.wbd_adr_i (wbd_spim_adr_o ),
@@ -346,11 +380,11 @@
.events_o ( ), // TODO - Need to connect to intr ?
.spi_clk (spim_clk ),
- .spi_csn0 (spim_csn0 ),
- .spi_csn1 (spim_csn1 ),
- .spi_csn2 (spim_csn2 ),
- .spi_csn3 (spim_csn3 ),
- .spi_mode (spim_mode ),
+ .spi_csn0 (spim_csn ),
+ .spi_csn1 ( ),
+ .spi_csn2 ( ),
+ .spi_csn3 ( ),
+ .spi_mode ( ),
.spi_sdo0 (spim_sdo0 ),
.spi_sdo1 (spim_sdo1 ),
.spi_sdo2 (spim_sdo2 ),
@@ -373,11 +407,11 @@
.cfg_colbits (cfg_colbits ),
// WB bus
- .wb_rst_i (rst_n ),
+ .wb_rst_i (!rst_n ),
.wb_clk_i (clk ),
.wb_stb_i (wbd_sdram_stb_o ),
- .wb_addr_i (wbd_sdram_addr_o ),
+ .wb_addr_i (wbd_sdram_adr_o ),
.wb_we_i (wbd_sdram_we_o ),
.wb_dat_i (wbd_sdram_dat_o ),
.wb_sel_i (wbd_sdram_sel_o ),
@@ -389,7 +423,7 @@
/* Interface to SDRAMs */
.sdram_clk (sdram_clk ),
- .sdram_resetn (sdram_resetn ),
+ .sdram_resetn (sdram_rst_n ),
.sdr_cs_n (sdr_cs_n ),
.sdr_cke (sdr_cke ),
.sdr_ras_n (sdr_ras_n ),
@@ -401,7 +435,7 @@
.pad_sdr_din (pad_sdr_din ),
.sdr_dout (sdr_dout ),
.sdr_den_n (sdr_den_n ),
- .sdram_pad_clk (sdram_pad_clk ),
+ .sdram_pad_clk (pad_sdram_clk ),
/* Parameters */
.sdr_init_done (sdr_init_done ),
@@ -427,94 +461,154 @@
// 0x3000_0000 to 0x3000_00FF - GLOBAL REGISTER
//-----------------------------
//
-wire [3:0] wbd_riscv_imem_tar_id = (wbd_riscv_imem_adr_i[31:28] == 4'b0000 ) ? 4'b0001 :
- (wbd_riscv_imem_adr_i[31:28] == 4'b0001 ) ? 4'b0001 :
- (wbd_riscv_imem_adr_i[31:28] == 4'b0010 ) ? 4'b0010 :
- (wbd_riscv_imem_adr_i[31:28] == 4'b0011 ) ? 4'b0011 : 4'b0001;
+wire [3:0] wbd_riscv_imem_tar_id = (wbd_riscv_imem_adr_i[31:16] == 16'h0000 ) ? 4'b0000 :
+ (wbd_riscv_imem_adr_i[31:16] == 16'h0041 ) ? 4'b0000 :
+ (wbd_riscv_imem_adr_i[31:16] == 16'h0048 ) ? 4'b0001 :// Todo: Temp fix for SDRAM
+ (wbd_riscv_imem_adr_i[31:16] == 16'h3000 ) ? 4'b0010 : 4'b0000;
-wire [3:0] wbd_riscv_dmem_tar_id = (wbd_riscv_dmem_adr_i[31:28] == 4'b0000 ) ? 4'b0001 :
- (wbd_riscv_dmem_adr_i[31:28] == 4'b0001 ) ? 4'b0001 :
- (wbd_riscv_dmem_adr_i[31:28] == 4'b0010 ) ? 4'b0010 :
- (wbd_riscv_dmem_adr_i[31:28] == 4'b0011 ) ? 4'b0011 : 4'b0001;
-
-wire [3:0] wbd_ext_tar_id = (wbd_ext_adr_i[31:28] == 4'b0000 ) ? 4'b0001 :
- (wbd_ext_adr_i[31:28] == 4'b0001 ) ? 4'b0001 :
- (wbd_ext_adr_i[31:28] == 4'b0010 ) ? 4'b0010 :
- (wbd_ext_adr_i[31:28] == 4'b0011 ) ? 4'b0011 : 4'b0001;
-wb_crossbar #(
- .WB_SLAVE(3),
- .WB_MASTER(3),
- .D_WD(32),
- .BE_WD(4),
- .ADR_WD(32),
- .TAR_WD(4)
- ) u_wb_crossbar(
-
- .rst_n (rst_n ),
- .clk (clk ),
+wire [3:0] wbd_riscv_dmem_tar_id = (wbd_riscv_dmem_adr_i[31:16] == 16'h0000 ) ? 4'b0000 :
+ (wbd_riscv_dmem_adr_i[31:16] == 16'h0041 ) ? 4'b0000 :
+ (wbd_riscv_dmem_adr_i[31:16] == 16'h0048 ) ? 4'b0001 : // todo: Temp fix for SDRAM
+ (wbd_riscv_dmem_adr_i[31:16] == 16'h3000 ) ? 4'b0010 : 4'b0000;
- // Master Interface Signal
- .wbd_taddr_master ({wbd_ext_tar_id,
- wbd_riscv_dmem_tar_id,
- wbd_riscv_imem_tar_id}),
- .wbd_din_master ({wbd_ext_dat_i,
- wbd_riscv_dmem_dat_i,
- wbd_riscv_imem_dat_i}),
- .wbd_dout_master ({wbd_ext_dat_o,
- wbd_riscv_dmem_dat_o,
- wbd_riscv_imem_dat_o}),
- .wbd_adr_master ({wbd_ext_adr_i,
- wbd_riscv_dmem_adr_i,
- wbd_riscv_imem_adr_i} ),
- .wbd_be_master ({wbd_ext_sel_i,
- wbd_riscv_dmem_sel_i,
- wbd_riscv_imem_sel_i}),
- .wbd_we_master ({wbd_ext_we_i,
- wbd_riscv_dmem_we_i,
- wbd_riscv_imem_we_i}),
- .wbd_ack_master ({wbd_ext_ack_o,
- wbd_riscv_dmem_ack_o,
- wbd_riscv_imem_ack_o}),
- .wbd_stb_master ({wbd_ext_stb_i,
- wbd_riscv_dmem_stb_i,
- wbd_riscv_imem_stb_i}),
- .wbd_cyc_master ({wbd_ext_stb_i,
- wbd_riscv_dmem_stb_i,
- wbd_riscv_imem_stb_i}),
- .wbd_err_master ({wbd_ext_err_o,
- wbd_riscv_dmem_err_o,
- wbd_riscv_imem_err_o}),
- .wbd_rty_master ( ),
-
- // Slave Interface Signal
- .wbd_din_slave ({wbd_glbl_dat_o,
- wbd_sdram_dat_o,
- wbd_spim_dat_o} ),
- .wbd_dout_slave ({wbd_glbl_dat_i,
- wbd_sdram_dat_i,
- wbd_spim_dat_i} ),
- .wbd_adr_slave ({wbd_glbl_addr_o,
- wbd_sdram_addr_o,
- wbd_spim_adr_o} ),
- .wbd_be_slave ({wbd_glbl_sel_o,
- wbd_sdram_sel_o,
- wbd_spim_sel_o} ),
- .wbd_we_slave ({wbd_glbl_we_o,
- wbd_sdram_we_o,
- wbd_spim_we_o} ),
- .wbd_ack_slave ({wbd_glbl_ack_i,
- wbd_sdram_ack_i,
- wbd_spim_ack_i} ),
- .wbd_stb_slave ({wbd_glbl_stb_o,
- wbd_sdram_stb_o,
- wbd_spim_stb_o} ),
- .wbd_cyc_slave ({wbd_glbl_cyc_o,
- wbd_sdram_cyc_o,
- wbd_spim_cyc_o} ),
- .wbd_err_slave (3'b0 ),
- .wbd_rty_slave (3'b0 )
- );
+//-------------------------------------------------------------------
+// EXTERNAL MEMORY MAP
+// 0x3000_0000 to 0x3000_00FF - GLOBAL REGISTER
+// 0x4000_0000 to 0x4FFF_FFFF - SPI FLASH MEMORY
+// 0x5000_0000 to 0x5000_00FF - SPI REGISTER
+// 0x6000_0000 to 0x6FFF_FFFF - SDRAM
+//
+wire [3:0] wbd_ext_tar_id = (wbd_ext_adr_i[31:28] == 4'b0100 ) ? 4'b0000 :
+ (wbd_ext_adr_i[31:28] == 4'b0101 ) ? 4'b0000 :
+ (wbd_ext_adr_i[31:28] == 4'b0110 ) ? 4'b0001 :
+ (wbd_ext_adr_i[31:28] == 4'b0011 ) ? 4'b0010 : 4'b0000;
+wb_interconnect u_intercon (
+ .clk_i (clk),
+ .rst_n (rst_n),
+
+ // Master 0 Interface
+ .m0_wbd_dat_i (wbd_riscv_imem_dat_i ),
+ .m0_wbd_adr_i (wbd_riscv_imem_adr_i ),
+ .m0_wbd_sel_i (wbd_riscv_imem_sel_i ),
+ .m0_wbd_we_i (wbd_riscv_imem_we_i ),
+ .m0_wbd_cyc_i (wbd_riscv_imem_stb_i ),
+ .m0_wbd_stb_i (wbd_riscv_imem_stb_i ),
+ .m0_wbd_tid_i (wbd_riscv_imem_tar_id ), // target id
+ .m0_wbd_dat_o (wbd_riscv_imem_dat_o ),
+ .m0_wbd_ack_o (wbd_riscv_imem_ack_o ),
+ .m0_wbd_err_o (wbd_riscv_imem_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_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_tid_i (wbd_riscv_dmem_tar_id ), // target id
+ .m1_wbd_dat_o (wbd_riscv_dmem_dat_o ),
+ .m1_wbd_ack_o (wbd_riscv_dmem_ack_o ),
+ .m1_wbd_err_o (wbd_riscv_dmem_err_o ),
+
+ // Master 2 Interface
+ .m2_wbd_dat_i (wbd_ext_dat_i ),
+ .m2_wbd_adr_i (wbd_ext_adr_i ),
+ .m2_wbd_sel_i (wbd_ext_sel_i ),
+ .m2_wbd_we_i (wbd_ext_we_i ),
+ .m2_wbd_cyc_i (wbd_ext_cyc_i ),
+ .m2_wbd_stb_i (wbd_ext_stb_i ),
+ .m2_wbd_tid_i (wbd_ext_tar_id ), // target id
+ .m2_wbd_dat_o (wbd_ext_dat_o ),
+ .m2_wbd_ack_o (wbd_ext_ack_o ),
+ .m2_wbd_err_o (wbd_ext_err_o ),
+
+
+ // Slave 0 Interface
+ .s0_wbd_err_i (1'b0 ),
+ .s0_wbd_dat_i (wbd_spim_dat_i ),
+ .s0_wbd_ack_i (wbd_spim_ack_i ),
+ .s0_wbd_dat_o (wbd_spim_dat_o ),
+ .s0_wbd_adr_o (wbd_spim_adr_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 ),
+ .s1_wbd_dat_i (wbd_sdram_dat_i ),
+ .s1_wbd_ack_i (wbd_sdram_ack_i ),
+ .s1_wbd_dat_o (wbd_sdram_dat_o ),
+ .s1_wbd_adr_o (wbd_sdram_adr_o ),
+ .s1_wbd_sel_o (wbd_sdram_sel_o ),
+ .s1_wbd_we_o (wbd_sdram_we_o ),
+ .s1_wbd_cyc_o (wbd_sdram_cyc_o ),
+ .s1_wbd_stb_o (wbd_sdram_stb_o ),
+
+ // Slave 2 Interface
+ .s2_wbd_err_i (1'b0 ),
+ .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 )
+ );
+
+glbl_cfg u_glbl_cfg (
+
+ .mclk (clk ),
+ .reset_n (rst_n ),
+ .device_idcode ( ),
+
+ // Reg Bus Interface Signal
+ .reg_cs (wbd_glbl_stb_o ),
+ .reg_wr (wbd_glbl_we_o ),
+ .reg_addr (wbd_glbl_adr_o[5:2] ),
+ .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 ),
+
+ // SDRAM Clock
+
+ .sdram_clk (sdram_clk ),
+
+ // reset
+ .cpu_rst_n (cpu_rst_n ),
+ .spi_rst_n (spi_rst_n ),
+ .sdram_rst_n (sdram_rst_n ),
+
+ // Risc configuration
+ .fuse_mhartid (fuse_mhartid ),
+ .irq_lines (irq_lines ),
+ .soft_irq (soft_irq ),
+
+ // SDRAM Config
+ .cfg_sdr_width (cfg_sdr_width ),
+ .cfg_colbits (cfg_colbits ),
+
+ /* Parameters */
+ .sdr_init_done (sdr_init_done ),
+ .cfg_req_depth (cfg_req_depth ), //how many req. buffer should hold
+ .cfg_sdr_en (cfg_sdr_en ),
+ .cfg_sdr_mode_reg (cfg_sdr_mode_reg ),
+ .cfg_sdr_tras_d (cfg_sdr_tras_d ),
+ .cfg_sdr_trp_d (cfg_sdr_trp_d ),
+ .cfg_sdr_trcd_d (cfg_sdr_trcd_d ),
+ .cfg_sdr_cas (cfg_sdr_cas ),
+ .cfg_sdr_trcar_d (cfg_sdr_trcar_d ),
+ .cfg_sdr_twr_d (cfg_sdr_twr_d ),
+ .cfg_sdr_rfsh (cfg_sdr_rfsh ),
+ .cfg_sdr_rfmax (cfg_sdr_rfmax )
+
+
+ );
diff --git a/verilog/rtl/lib/wb_crossbar.v b/verilog/rtl/lib/wb_crossbar.v
index ed7a5ae..76b9981 100644
--- a/verilog/rtl/lib/wb_crossbar.v
+++ b/verilog/rtl/lib/wb_crossbar.v
@@ -361,8 +361,9 @@
for(i = 0; i < WB_MASTER; i = i + 1) begin
if(master_busy[i] == 0) begin
if(wbd_stb_master[i] & slave_busy[wbd_taddr_master_t[i]] == 0) begin
- slave_busy[wbd_taddr_master_t[i]] <= 1;
- master_busy[i] <= 1;
+ $display("Locking Master Id: %d for tar_master: %d, Total Master: %x ", i, wbd_taddr_master_t[i], wbd_taddr_master);
+ slave_busy[wbd_taddr_master_t[i]] = 1;
+ master_busy[i] = 1;
end
end else if(wbd_cyc_master[i] == 0) begin
master_busy[i] <= 0;
@@ -380,13 +381,13 @@
master_mx_id[n] <= wbd_taddr_master_t[n];
slave_mx_id [wbd_taddr_master_t[n]] <= n;
// synopsys translate_off
- // $display("%m:%t: Locking Master : %d with Slave : %d",$time,i,wbd_taddr_master_t[n]);
+ $display("%m:%t: Locking Master : %d with Slave : %d",$time,i,wbd_taddr_master_t[n]);
// synopsys translate_on
end
end else if(wbd_cyc_master[n] == 0) begin
if(master_busy[n] == 1) begin
// synopsys translate_off
- // $display("%m:%t: Releasing Master : %d with Slave : %d",$time,i,wbd_taddr_master_t[n]);
+ $display("%m:%t: Releasing Master : %d with Slave : %d",$time,i,wbd_taddr_master_t[n]);
// synopsys translate_on
end
end
diff --git a/verilog/rtl/sdram_ctrl/src/core/sdrc_core.v b/verilog/rtl/sdram_ctrl/src/core/sdrc_core.v
index 82381d1..d4d9941 100755
--- a/verilog/rtl/sdram_ctrl/src/core/sdrc_core.v
+++ b/verilog/rtl/sdram_ctrl/src/core/sdrc_core.v
@@ -200,6 +200,30 @@
// Internal Nets
// SDR_REQ_GEN
+wire x2a_rdstart;
+wire x2a_wrstart;
+wire x2a_rdlast;
+wire x2a_wrlast;
+wire x2a_rdok;
+wire x2a_wrnext;
+wire x2b_ack;
+wire x2b_refresh;
+wire x2b_act_ok;
+wire x2b_rdok;
+wire x2b_wrok;
+wire b2x_idle;
+wire b2x_req;
+wire b2x_start;
+wire b2x_last;
+wire b2x_wrap;
+wire b2x_tras_ok;
+wire b2r_ack;
+wire b2r_arb_ok;
+wire r2b_req;
+wire r2b_start;
+wire r2b_last;
+wire r2b_wrap;
+wire r2b_write;
wire [`SDR_REQ_ID_W-1:0]r2b_req_id;
wire [1:0] r2b_ba;
wire [12:0] r2b_raddr;
@@ -236,6 +260,8 @@
wire [APP_BW-1:0] app_wr_en_n;
wire [SDR_BW-1:0] a2x_wren_n;
+wire r2x_idle;
+
//wire [31:0] app_rd_data;
wire [SDR_DW-1:0] x2a_rddt;
diff --git a/verilog/rtl/sdram_ctrl/src/core/sdrc_req_gen.v b/verilog/rtl/sdram_ctrl/src/core/sdrc_req_gen.v
index af7b506..3d9edf6 100755
--- a/verilog/rtl/sdram_ctrl/src/core/sdrc_req_gen.v
+++ b/verilog/rtl/sdram_ctrl/src/core/sdrc_req_gen.v
@@ -267,7 +267,7 @@
r2b_req = 1'b0;
next_req_st = `REQ_IDLE;
- case (req_st) // synopsys full_case parallel_case
+ case (req_st)
`REQ_IDLE : begin
r2x_idle = ~req;
diff --git a/verilog/rtl/sdram_ctrl/src/core/sdrc_xfr_ctl.v b/verilog/rtl/sdram_ctrl/src/core/sdrc_xfr_ctl.v
index cd87d26..ef01b9d 100755
--- a/verilog/rtl/sdram_ctrl/src/core/sdrc_xfr_ctl.v
+++ b/verilog/rtl/sdram_ctrl/src/core/sdrc_xfr_ctl.v
@@ -638,7 +638,7 @@
cntr1_tc or trcar_delay or rfsh_row_cnt or ref_req or sdr_init_done
or precharge_ok or sdram_mode_reg) begin
- case (mgmt_st) // synopsys full_case parallel_case
+ case (mgmt_st)
`MGM_POWERUP : begin
mgmt_idle = 1'b0;
diff --git a/verilog/rtl/spi_master/src/spim_clkgen.sv b/verilog/rtl/spi_master/src/spim_clkgen.sv
index 022b300..2c6b236 100644
--- a/verilog/rtl/spi_master/src/spim_clkgen.sv
+++ b/verilog/rtl/spi_master/src/spim_clkgen.sv
@@ -85,31 +85,46 @@
if(clk_cnt == sck_half_period)
begin
spi_clk <= 1'b0;
+ end // if (clk_cnt == sck_half_period)
+ else if(clk_cnt == cfg_sck_period) begin
+ spi_clk <= 1'b1;
+ end
+ end else begin
+ spi_clk <= 1'b1;
+ end // else: !if(en)
+ end // else: !if(!reset_n)
+ end // always @ (posedge clk or negedge reset_n)
+
+ // Generate Free runnng spi_fall and rise pulse
+ // after en is asserted
+ always @(posedge clk or negedge rstn) begin
+ if(!rstn) begin
+ clk_cnt <= 'h1;
+ spi_fall <= 1'b0;
+ spi_rise <= 1'b0;
+ end // if (!reset_n)
+ else
+ begin
+ if(clk_cnt == sck_half_period)
+ begin
+ spi_fall <= 1'b0;
+ spi_rise <= 1'b1;
+ clk_cnt <= clk_cnt + 1'b1;
+ end // if (clk_cnt == sck_half_period)
+ else begin
+ if(clk_cnt == cfg_sck_period)
+ begin
spi_fall <= 1'b1;
spi_rise <= 1'b0;
- clk_cnt <= clk_cnt + 1'b1;
- end // if (clk_cnt == sck_half_period)
- else begin
- if(clk_cnt == cfg_sck_period)
- begin
- spi_clk <= 1'b1;
- spi_fall <= 1'b0;
- spi_rise <= 1'b1;
- clk_cnt <= 'h1;
- end // if (clk_cnt == cfg_sck_period)
- else
- begin
- clk_cnt <= clk_cnt + 1'b1;
- spi_fall <= 1'b0;
- spi_rise <= 1'b0;
- end // else: !if(clk_cnt == cfg_sck_period)
- end // else: !if(clk_cnt == sck_half_period)
- end // if (en)
- else begin
- clk_cnt <= 'h1;
- spi_fall <= 1'b0;
- spi_rise <= 1'b0;
- end // else: !if(en)
+ clk_cnt <= 'h1;
+ end // if (clk_cnt == cfg_sck_period)
+ else
+ begin
+ clk_cnt <= clk_cnt + 1'b1;
+ spi_fall <= 1'b0;
+ spi_rise <= 1'b0;
+ end // else: !if(clk_cnt == cfg_sck_period)
+ end // else: !if(clk_cnt == sck_half_period)
end // else: !if(!reset_n)
end // always @ (posedge clk or negedge reset_n)
diff --git a/verilog/rtl/spi_master/src/spim_ctrl.sv b/verilog/rtl/spi_master/src/spim_ctrl.sv
index 20d2515..95e3dd7 100644
--- a/verilog/rtl/spi_master/src/spim_ctrl.sv
+++ b/verilog/rtl/spi_master/src/spim_ctrl.sv
@@ -51,7 +51,7 @@
input logic [7:0] spi_clk_div,
input logic spi_clk_div_valid,
- output logic [7:0] spi_status,
+ output logic [8:0] spi_status,
input logic spi_req,
@@ -133,7 +133,7 @@
enum logic [2:0] {DATA_NULL,DATA_EMPTY,DATA_CMD,DATA_ADDR,DATA_MODE,DATA_FIFO} ctrl_data_mux;
- enum logic [4:0] {IDLE,CMD,ADDR,MODE,DUMMY,DATA_TX,DATA_RX,WAIT_EDGE} state,state_next;
+ enum logic [4:0] {IDLE,CMD,ADDR,MODE,DUMMY_RX,DUMMY_TX,DATA_TX,DATA_RX,WAIT_EDGE} state,state_next;
assign en_quad = spi_qrd | spi_qwr | en_quad_int;
@@ -169,7 +169,6 @@
.data_ready ( ),
.clk_en_o ( tx_clk_en )
);
-
spim_rx u_rxreg
(
.clk ( clk ),
@@ -190,7 +189,6 @@
.clk_en_o ( rx_clk_en )
);
-
always_comb
begin
@@ -256,7 +254,7 @@
begin
spi_status[0] = 1'b1;
s_spi_mode = SPI_QUAD_RX;
- if (spi_req)
+ if (spi_req && spi_fall)
begin
spi_cs = 1'b0;
spi_clock_en = 1'b1;
@@ -299,17 +297,19 @@
s_spi_mode = (spi_qrd) ? SPI_QUAD_RX : SPI_STD;
if(spi_dummy_rd_len != 0)
begin
- counter_tx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
- counter_tx_valid = 1'b1;
- spi_en_tx = 1'b1;
+ counter_rx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
+ counter_rx_valid = 1'b1;
+ spi_en_rx = 1'b1;
ctrl_data_mux = DATA_EMPTY;
- state_next = DUMMY;
+ spi_clock_en = rx_clk_en;
+ state_next = DUMMY_RX;
end
else
begin
counter_rx = spi_data_len;
counter_rx_valid = 1'b1;
spi_en_rx = 1'b1;
+ spi_clock_en = rx_clk_en;
state_next = DATA_RX;
end
end
@@ -322,7 +322,8 @@
counter_tx_valid = 1'b1;
ctrl_data_mux = DATA_EMPTY;
spi_en_tx = 1'b1;
- state_next = DUMMY;
+ spi_clock_en = tx_clk_en;
+ state_next = DUMMY_TX;
end
else
begin
@@ -331,6 +332,7 @@
ctrl_data_mux = DATA_FIFO;
ctrl_data_valid = 1'b0;
spi_en_tx = 1'b1;
+ spi_clock_en = tx_clk_en;
state_next = DATA_TX;
end
end
@@ -350,7 +352,7 @@
spi_clock_en = 1'b1;
// s_spi_mode = (en_quad) ? SPI_QUAD_TX : SPI_STD;
s_spi_mode = SPI_STD; // Command is always Standard Mode ?
- if (tx_done)
+ if (tx_done && spi_fall)
begin
if (spi_addr_len != 0)
begin
@@ -379,17 +381,19 @@
s_spi_mode = (en_quad) ? SPI_QUAD_RX : SPI_STD;
if(spi_dummy_rd_len != 0)
begin
- counter_tx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
- counter_tx_valid = 1'b1;
- spi_en_tx = 1'b1;
+ counter_rx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
+ counter_rx_valid = 1'b1;
+ spi_en_rx = 1'b1;
ctrl_data_mux = DATA_EMPTY;
- state_next = DUMMY;
+ spi_clock_en = rx_clk_en;
+ state_next = DUMMY_RX;
end
else
begin
counter_rx = spi_data_len;
counter_rx_valid = 1'b1;
spi_en_rx = 1'b1;
+ spi_clock_en = rx_clk_en;
state_next = DATA_RX;
end
end
@@ -402,7 +406,8 @@
counter_tx_valid = 1'b1;
ctrl_data_mux = DATA_EMPTY;
spi_en_tx = 1'b1;
- state_next = DUMMY;
+ spi_clock_en = tx_clk_en;
+ state_next = DUMMY_TX;
end
else
begin
@@ -411,6 +416,7 @@
ctrl_data_mux = DATA_FIFO;
ctrl_data_valid = 1'b1;
spi_en_tx = 1'b1;
+ spi_clock_en = tx_clk_en;
state_next = DATA_TX;
end
end
@@ -436,7 +442,7 @@
spi_clock_en = 1'b1;
s_spi_mode = (en_quad) ? SPI_QUAD_TX : SPI_STD;
- if (tx_done)
+ if (tx_done && spi_fall)
begin
if (spi_mode_cmd_enb != 0)
begin
@@ -455,17 +461,19 @@
s_spi_mode = (en_quad) ? SPI_QUAD_RX : SPI_STD;
if(spi_dummy_rd_len != 0)
begin
- counter_tx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
- counter_tx_valid = 1'b1;
- spi_en_tx = 1'b1;
+ counter_rx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
+ counter_rx_valid = 1'b1;
+ spi_en_rx = 1'b1;
ctrl_data_mux = DATA_EMPTY;
- state_next = DUMMY;
+ spi_clock_en = rx_clk_en;
+ state_next = DUMMY_RX;
end
else
begin
counter_rx = spi_data_len;
counter_rx_valid = 1'b1;
spi_en_rx = 1'b1;
+ spi_clock_en = rx_clk_en;
state_next = DATA_RX;
end
end
@@ -478,12 +486,14 @@
counter_tx = en_quad ? {2'b00,spi_dummy_wr_len[13:0]} : spi_dummy_wr_len;
counter_tx_valid = 1'b1;
ctrl_data_mux = DATA_EMPTY;
- state_next = DUMMY;
+ spi_clock_en = tx_clk_en;
+ state_next = DUMMY_TX;
end else begin
counter_tx = spi_data_len;
counter_tx_valid = 1'b1;
ctrl_data_mux = DATA_FIFO;
ctrl_data_valid = 1'b1;
+ spi_clock_en = tx_clk_en;
state_next = DATA_TX;
end
end
@@ -502,7 +512,7 @@
spi_cs = 1'b0;
spi_clock_en = 1'b1;
s_spi_mode = (en_quad) ? SPI_QUAD_TX : SPI_STD;
- if (tx_done)
+ if (tx_done && spi_fall)
begin
if (spi_data_len != 0)
begin
@@ -511,17 +521,19 @@
s_spi_mode = (en_quad) ? SPI_QUAD_RX : SPI_STD;
if(spi_dummy_rd_len != 0)
begin
- counter_tx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
- counter_tx_valid = 1'b1;
- spi_en_tx = 1'b1;
+ counter_rx = en_quad ? {2'b00,spi_dummy_rd_len[13:0]} : spi_dummy_rd_len;
+ counter_rx_valid = 1'b1;
+ spi_en_rx = 1'b1;
ctrl_data_mux = DATA_EMPTY;
- state_next = DUMMY;
+ spi_clock_en = rx_clk_en;
+ state_next = DUMMY_RX;
end
else
begin
counter_rx = spi_data_len;
counter_rx_valid = 1'b1;
spi_en_rx = 1'b1;
+ spi_clock_en = rx_clk_en;
state_next = DATA_RX;
end
end
@@ -534,12 +546,14 @@
counter_tx = en_quad ? {2'b00,spi_dummy_wr_len[13:0]} : spi_dummy_wr_len;
counter_tx_valid = 1'b1;
ctrl_data_mux = DATA_EMPTY;
- state_next = DUMMY;
+ spi_clock_en = tx_clk_en;
+ state_next = DUMMY_TX;
end else begin
counter_tx = spi_data_len;
counter_tx_valid = 1'b1;
ctrl_data_mux = DATA_FIFO;
ctrl_data_valid = 1'b1;
+ spi_clock_en = tx_clk_en;
state_next = DATA_TX;
end
end
@@ -551,7 +565,7 @@
end
end
- DUMMY:
+ DUMMY_TX:
begin
spi_en_tx = 1'b1;
spi_status[4] = 1'b1;
@@ -559,12 +573,13 @@
spi_clock_en = 1'b1;
s_spi_mode = (en_quad) ? SPI_QUAD_RX : SPI_STD;
- if (tx_done) begin
+ if (tx_done && spi_fall) begin
if (spi_data_len != 0) begin
if (do_rx) begin
counter_rx = spi_data_len;
counter_rx_valid = 1'b1;
spi_en_rx = 1'b1;
+ spi_clock_en = rx_clk_en;
state_next = DATA_RX;
end else begin
counter_tx = spi_data_len;
@@ -586,21 +601,60 @@
begin
ctrl_data_mux = DATA_EMPTY;
spi_en_tx = 1'b1;
- state_next = DUMMY;
+ state_next = DUMMY_TX;
end
end
+ DUMMY_RX:
+ begin
+ spi_en_rx = 1'b1;
+ spi_status[5] = 1'b1;
+ spi_cs = 1'b0;
+ spi_clock_en = 1'b1;
+ s_spi_mode = (en_quad) ? SPI_QUAD_RX : SPI_STD;
+
+ if (rx_done && spi_rise) begin
+ if (spi_data_len != 0) begin
+ if (do_rx) begin
+ counter_rx = spi_data_len;
+ counter_rx_valid = 1'b1;
+ spi_en_rx = 1'b1;
+ spi_clock_en = rx_clk_en;
+ state_next = DATA_RX;
+ end else begin
+ counter_tx = spi_data_len;
+ counter_tx_valid = 1'b1;
+ s_spi_mode = (en_quad) ? SPI_QUAD_TX : SPI_STD;
+
+ spi_clock_en = tx_clk_en;
+ spi_en_tx = 1'b1;
+ state_next = DATA_TX;
+ end
+ end
+ else
+ begin
+ eot = 1'b1;
+ state_next = WAIT_EDGE;
+ end
+ end
+ else
+ begin
+ ctrl_data_mux = DATA_EMPTY;
+ spi_en_tx = 1'b1;
+ spi_clock_en = rx_clk_en;
+ state_next = DUMMY_RX;
+ end
+ end
DATA_TX:
begin
- spi_status[5] = 1'b1;
+ spi_status[6] = 1'b1;
spi_cs = 1'b0;
spi_clock_en = tx_clk_en;
ctrl_data_mux = DATA_FIFO;
- ctrl_data_valid = 1'b1;
spi_en_tx = 1'b1;
s_spi_mode = (en_quad) ? SPI_QUAD_TX : SPI_STD;
- if (tx_done) begin
+ if (tx_done && spi_fall) begin
eot = 1'b1;
state_next = WAIT_EDGE;
spi_clock_en = 1'b0;
@@ -611,12 +665,12 @@
DATA_RX:
begin
- spi_status[6] = 1'b1;
+ spi_status[7] = 1'b1;
spi_cs = 1'b0;
spi_clock_en = rx_clk_en;
s_spi_mode = (en_quad) ? SPI_QUAD_RX : SPI_STD;
- if (rx_done) begin
+ if (rx_done && spi_rise) begin
state_next = WAIT_EDGE;
end else begin
spi_en_rx = 1'b1;
@@ -625,7 +679,7 @@
end
WAIT_EDGE:
begin
- spi_status[7] = 1'b1;
+ spi_status[8] = 1'b1;
spi_cs = 1'b0;
spi_clock_en = 1'b0;
s_spi_mode = (en_quad) ? SPI_QUAD_RX : SPI_STD;
@@ -635,7 +689,7 @@
endcase
end
-assign spi_ack = ((spi_req ==1) && (state_next == WAIT_EDGE)) ? 1'b1 : 1'b0;
+assign spi_ack = ((spi_req ==1) && (state == WAIT_EDGE)) ? 1'b1 : 1'b0;
always_ff @(posedge clk, negedge rstn)
diff --git a/verilog/rtl/spi_master/src/spim_regs.sv b/verilog/rtl/spi_master/src/spim_regs.sv
index 7d06f3e..7e826b6 100644
--- a/verilog/rtl/spi_master/src/spim_regs.sv
+++ b/verilog/rtl/spi_master/src/spim_regs.sv
@@ -66,7 +66,7 @@
output logic [7:0] spi_clk_div,
output logic spi_clk_div_valid,
- input logic [7:0] spi_status,
+ input logic [8:0] spi_status,
// Towards SPI TX/RX FSM
@@ -107,10 +107,12 @@
parameter REG_STATUS = 4'b1000;
// Init FSM
-parameter SPI_INIT_IDLE = 3'b000;
-parameter SPI_INIT_CMD_WAIT = 3'b001;
-parameter SPI_INIT_WRR_CMD = 3'b010;
-parameter SPI_INIT_WRR_WAIT = 3'b011;
+parameter SPI_INIT_IDLE = 3'b000;
+parameter SPI_INIT_CMD_WAIT = 3'b001;
+parameter SPI_INIT_WREN_CMD = 3'b010;
+parameter SPI_INIT_WREN_WAIT = 3'b011;
+parameter SPI_INIT_WRR_CMD = 3'b100;
+parameter SPI_INIT_WRR_WAIT = 3'b101;
//---------------------------------------------------------
// Variable declartion
@@ -161,8 +163,8 @@
assign spi_mode_cmd = (spim_mem_req && !spim_wb_we) ? 8'h00 : reg2spi_mode;
assign spi_mode_cmd_enb = (spim_mem_req && !spim_wb_we) ? 1 : reg2spi_mode_enb;
assign spi_csreg = (spim_mem_req && !spim_wb_we) ? '1 : reg2spi_csreg;
- assign spi_data_len = (spim_mem_req && !spim_wb_we) ? 'h10 : reg2spi_data_len;
- assign spi_dummy_rd_len = (spim_mem_req && !spim_wb_we) ? 16 : reg2spi_dummy_rd_len;
+ assign spi_data_len = (spim_mem_req && !spim_wb_we) ? 'h20 : reg2spi_data_len;
+ assign spi_dummy_rd_len = (spim_mem_req && !spim_wb_we) ? 'h20 : reg2spi_dummy_rd_len;
assign spi_dummy_wr_len = (spim_mem_req && !spim_wb_we) ? 0 : reg2spi_dummy_wr_len;
assign spi_swrst = (spim_mem_req && !spim_wb_we) ? 0 : reg2spi_swrst;
assign spi_rd = (spim_mem_req && !spim_wb_we) ? 0 : reg2spi_rd;
@@ -200,27 +202,29 @@
spim_wb_we <= '0;
spim_wb_ack <= '0;
end else begin
- spim_wb_req <= wbd_stb_i;
- spim_wb_req_l <= spim_wb_req;
- spim_wb_wdata <= wbd_dat_i;
- spim_wb_addr <= wbd_adr_i;
- spim_wb_be <= wbd_sel_i;
- spim_wb_we <= wbd_we_i;
-
-
- // If there is Reg2Spi read Access, Register the Read Data
- if(reg2spi_req && (reg2spi_rd || reg2spi_qrd ) && spi_ack)
- spim_reg_rdata <= spi_rdata;
-
- if(!spim_wb_we && spim_wb_req && spi_ack)
- spim_wb_rdata <= spi_rdata;
- else
- spim_wb_rdata <= reg_rdata;
-
+ if(spi_init_done) begin // Wait for internal SPI Init Done
+ spim_wb_req <= wbd_stb_i && (spi_ack == 0) && (spim_wb_ack==0);
+ spim_wb_req_l <= spim_wb_req;
+ spim_wb_wdata <= wbd_dat_i;
+ spim_wb_addr <= wbd_adr_i;
+ spim_wb_be <= wbd_sel_i;
+ spim_wb_we <= wbd_we_i;
+
+
+ // If there is Reg2Spi read Access, Register the Read Data
+ if(reg2spi_req && (reg2spi_rd || reg2spi_qrd ) && spi_ack)
+ spim_reg_rdata <= spi_rdata;
+
+ if(!spim_wb_we && spim_wb_req && spi_ack)
+ spim_wb_rdata <= spi_rdata;
+ else if (spim_reg_req)
+ spim_wb_rdata <= reg_rdata;
+
// For safer design, we have generated ack after 2 cycle latter to
- // cross-check current request is towards SPI or not
- spim_wb_ack <= (spi_req) ? spi_ack :
- ((spim_wb_ack==0) && spim_wb_req && spim_wb_req_l) ;
+ // cross-check current request is towards SPI or not
+ spim_wb_ack <= (spi_req && spim_wb_req) ? spi_ack :
+ ((spim_wb_ack==0) && spim_wb_req && spim_wb_req_l) ;
+ end
end
end
@@ -259,7 +263,7 @@
reg2spi_qwr <= 'h0;
reg2spi_swrst <= 'h0;
reg2spi_csreg <= 'h1;
- reg2spi_cmd[7:0] <= 'h6; // WREN command
+ reg2spi_cmd[7:0] <= 'hAB; // POWER UP command
reg2spi_mode[7:0] <= 'h0;
reg2spi_cmd_len <= 'h8;
reg2spi_addr_len <= 'h0;
@@ -272,6 +276,30 @@
begin
if(spi_ack) begin
reg2spi_req <= 1'b0;
+ spi_init_state <= SPI_INIT_WREN_CMD;
+ end
+ end
+ SPI_INIT_WREN_CMD:
+ begin
+ reg2spi_rd <= 'h0;
+ reg2spi_wr <= 'h1; // SPI Write Req
+ reg2spi_qrd <= 'h0;
+ reg2spi_qwr <= 'h0;
+ reg2spi_swrst <= 'h0;
+ reg2spi_csreg <= 'h1;
+ reg2spi_cmd[7:0] <= 'h6; // WREN command
+ reg2spi_mode[7:0] <= 'h0;
+ reg2spi_cmd_len <= 'h8;
+ reg2spi_addr_len <= 'h0;
+ reg2spi_data_len <= 'h0;
+ reg2spi_wdata <= 'h0;
+ reg2spi_req <= 'h1;
+ spi_init_state <= SPI_INIT_WREN_WAIT;
+ end
+ SPI_INIT_WREN_WAIT:
+ begin
+ if(spi_ack) begin
+ reg2spi_req <= 1'b0;
spi_init_state <= SPI_INIT_WRR_CMD;
end
end
@@ -372,38 +400,43 @@
end
+
+ wire [3:0] reg_addr = spim_wb_addr[7:4];
+
// implement slave model register read mux
always_comb
begin
reg_rdata = '0;
- case(spim_wb_addr[7:4])
- REG_CTRL:
- reg_rdata[31:0] = { 20'h0,
- reg2spi_csreg,
- 3'b0,
- reg2spi_swrst,
- reg2spi_qwr,
- reg2spi_qrd,
- reg2spi_wr,
- reg2spi_rd};
+ if(spim_reg_req) begin
+ case(reg_addr)
+ REG_CTRL:
+ reg_rdata[31:0] = { 20'h0,
+ reg2spi_csreg,
+ 3'b0,
+ reg2spi_swrst,
+ reg2spi_qwr,
+ reg2spi_qrd,
+ reg2spi_wr,
+ reg2spi_rd};
- REG_CLKDIV:
- reg_rdata[31:0] = {24'h0,spi_clk_div};
- REG_SPICMD:
- reg_rdata[31:0] = {16'h0,reg2spi_mode,reg2spi_cmd};
- REG_SPIADR:
- reg_rdata[31:0] = reg2spi_addr;
- REG_SPILEN:
- reg_rdata[31:0] = {reg2spi_data_len,2'b00,reg2spi_addr_len,1'b0,reg2spi_mode_enb,reg2spi_cmd_len};
- REG_SPIDUM:
- reg_rdata[31:0] = {reg2spi_dummy_wr_len,reg2spi_dummy_rd_len};
- REG_SPIWDATA:
- reg_rdata[31:0] = reg2spi_wdata;
- REG_SPIRDATA:
- reg_rdata[31:0] = spim_reg_rdata;
- REG_STATUS:
- reg_rdata[31:0] = {24'h0,spi_status};
- endcase
+ REG_CLKDIV:
+ reg_rdata[31:0] = {24'h0,spi_clk_div};
+ REG_SPICMD:
+ reg_rdata[31:0] = {16'h0,reg2spi_mode,reg2spi_cmd};
+ REG_SPIADR:
+ reg_rdata[31:0] = reg2spi_addr;
+ REG_SPILEN:
+ reg_rdata[31:0] = {reg2spi_data_len,2'b00,reg2spi_addr_len,1'b0,reg2spi_mode_enb,reg2spi_cmd_len};
+ REG_SPIDUM:
+ reg_rdata[31:0] = {reg2spi_dummy_wr_len,reg2spi_dummy_rd_len};
+ REG_SPIWDATA:
+ reg_rdata[31:0] = reg2spi_wdata;
+ REG_SPIRDATA:
+ reg_rdata[31:0] = spim_reg_rdata;
+ REG_STATUS:
+ reg_rdata[31:0] = {23'h0,spi_status};
+ endcase
+ end
end
diff --git a/verilog/rtl/spi_master/src/spim_rx.sv b/verilog/rtl/spi_master/src/spim_rx.sv
index f11c16b..ea0d8a9 100644
--- a/verilog/rtl/spi_master/src/spim_rx.sv
+++ b/verilog/rtl/spi_master/src/spim_rx.sv
@@ -72,7 +72,6 @@
logic [15:0] counter;
logic [15:0] counter_trgt;
logic [15:0] counter_next;
- logic [15:0] counter_trgt_next;
logic reg_done;
enum logic [1:0] { IDLE, RECEIVE, WAIT_FIFO, WAIT_FIFO_DONE } rx_CS, rx_NS;
@@ -81,27 +80,17 @@
// RISV is little endian, so data is converted to little endian format
assign data = (ENDIEAN) ? data_int_next : {data_int_next[7:0],data_int_next[15:8],data_int_next[23:16],data_int_next[31:24]};
- assign rx_done = (counter == (counter_trgt-1)) & rx_edge;
- always_comb
- begin
- if (counter_in_upd)
- counter_trgt_next = (en_quad_in) ? {2'b00,counter_in[15:2]} : counter_in;
- else
- counter_trgt_next = counter_trgt;
- end
always_comb
begin
rx_NS = rx_CS;
- clk_en_o = 1'b0;
data_int_next = data_int;
data_valid = 1'b0;
counter_next = counter;
case (rx_CS)
IDLE: begin
- clk_en_o = 1'b0;
// check first if there is available space instead of later
if (en) begin
@@ -110,7 +99,6 @@
end
RECEIVE: begin
- clk_en_o = 1'b1;
if (rx_edge) begin
counter_next = counter + 1;
@@ -132,7 +120,6 @@
if (~data_ready) begin
// no space in the FIFO, wait for free space
- clk_en_o = 1'b0;
rx_NS = WAIT_FIFO;
end
end
@@ -161,14 +148,22 @@
counter <= 0;
counter_trgt <= 'h8;
data_int <= '0;
+ rx_done <= '0;
+ clk_en_o <= '0;
rx_CS <= IDLE;
end
else
begin
- counter <= counter_next;
- counter_trgt <= counter_trgt_next;
- data_int <= data_int_next;
- rx_CS <= rx_NS;
+ if (rx_edge) begin
+ counter <= counter_next;
+ data_int <= data_int_next;
+ rx_CS <= rx_NS;
+ rx_done <= (counter_next == (counter_trgt-1)) && (rx_NS == RECEIVE);
+ clk_en_o <= (rx_NS == RECEIVE);
+ end
+ if (en && counter_in_upd) begin
+ counter_trgt <= (en_quad_in) ? {2'b00,counter_in[15:2]} : counter_in;
+ end
end
end
diff --git a/verilog/rtl/spi_master/src/spim_top.sv b/verilog/rtl/spi_master/src/spim_top.sv
index 079c7e9..67d09de 100644
--- a/verilog/rtl/spi_master/src/spim_top.sv
+++ b/verilog/rtl/spi_master/src/spim_top.sv
@@ -85,7 +85,8 @@
logic [7:0] spi_clk_div;
logic spi_clk_div_valid;
- logic [7:0] spi_status;
+ logic spi_req;
+ logic spi_ack;
logic [31:0] spi_addr;
logic [5:0] spi_addr_len;
logic [7:0] spi_cmd;
@@ -109,7 +110,7 @@
logic [31:0] spi_data_rx;
logic spi_data_rx_valid;
logic spi_data_rx_ready;
- logic [7:0] spi_ctrl_status;
+ logic [8:0] spi_ctrl_status;
logic [31:0] spi_ctrl_data_tx;
logic spi_ctrl_data_tx_valid;
logic spi_ctrl_data_tx_ready;
@@ -144,7 +145,7 @@
.spi_clk_div (spi_clk_div ),
.spi_clk_div_valid (spi_clk_div_valid ),
- .spi_status (spi_status ),
+ .spi_status (spi_ctrl_status ),
.spi_req (spi_req ),
diff --git a/verilog/rtl/spi_master/src/spim_tx.sv b/verilog/rtl/spi_master/src/spim_tx.sv
index d3fd332..db6516e 100644
--- a/verilog/rtl/spi_master/src/spim_tx.sv
+++ b/verilog/rtl/spi_master/src/spim_tx.sv
@@ -80,15 +80,6 @@
enum logic [0:0] { IDLE, TRANSMIT } tx_CS, tx_NS;
- // Counter Exit condition, quad mode div-4 , else actual counter
- always_comb
- begin
- counter_trgt = (en_quad_in) ? {2'b00,counter_in[15:2]} : counter_in;
- end
-
- //Indicate end of transmission of all the bytes
- assign tx_done = (counter == counter_trgt) && tx_edge;
-
// Indicate 32 bit data done, usefull for readining next 32b from txfifo
assign tx32b_done = (!en_quad && (counter[4:0] == 5'b11111)) || (en_quad && (counter[2:0] == 3'b111)) && tx_edge;
@@ -98,15 +89,14 @@
always_comb
begin
tx_NS = tx_CS;
- clk_en_o = 1'b0;
data_int_next = data_int;
data_ready = 1'b0;
counter_next = counter;
case (tx_CS)
IDLE: begin
- clk_en_o = 1'b0;
data_int_next = txdata;
+ counter_next = '0;
if (en && data_valid) begin
data_ready = 1'b1;
@@ -115,27 +105,24 @@
end
TRANSMIT: begin
- clk_en_o = 1'b1;
- counter_next = counter + 1;
- data_int_next = (en_quad) ? {data_int[27:0],4'b0000} : {data_int[30:0],1'b0};
+ counter_next = counter + 1;
+ data_int_next = (en_quad) ? {data_int[27:0],4'b0000} : {data_int[30:0],1'b0};
- if (tx_done) begin
+ if (tx_done) begin
counter_next = 0;
- // Check if there is next data
+ // Check if there is next data
if (en && data_valid) begin
data_int_next = txdata;
data_ready = 1'b1;
tx_NS = TRANSMIT;
end else begin
- clk_en_o = 1'b0;
tx_NS = IDLE;
end
- end else if (tx32b_done) begin
+ end else if (tx32b_done) begin
if (data_valid) begin
data_int_next = txdata;
data_ready = 1'b1;
end else begin
- clk_en_o = 1'b0;
tx_NS = IDLE;
end
end
@@ -151,6 +138,13 @@
data_int <= 'h0;
tx_CS <= IDLE;
en_quad <= 0;
+ tx_done <= '0;
+ clk_en_o <= '0;
+ sdo0 <= '0;
+ sdo1 <= '0;
+ sdo2 <= '0;
+ sdo3 <= '0;
+ counter_trgt <= '0;
end
else
begin
@@ -158,12 +152,18 @@
counter <= counter_next;
data_int <= data_int_next;
sdo0 <= (en_quad_in) ? data_int_next[28] : data_int_next[31];
- sdo1 <= (en_quad_in) ? data_int_next[29] : 1'b1;
- sdo2 <= (en_quad_in) ? data_int_next[30] : 1'b1;
- sdo3 <= (en_quad_in) ? data_int_next[31] : 1'b1;
+ sdo1 <= (en_quad_in) ? data_int_next[29] : 1'b0;
+ sdo2 <= (en_quad_in) ? data_int_next[30] : 1'b0;
+ sdo3 <= (en_quad_in) ? data_int_next[31] : 1'b0;
tx_CS <= tx_NS;
en_quad <= en_quad_in;
+ tx_done <= (counter_next == (counter_trgt -1)) && (tx_NS == TRANSMIT);
+ clk_en_o <= (tx_NS == TRANSMIT);
end
- end
+ // Counter Exit condition, quad mode div-4 , else actual counter
+ if (en && data_valid) begin
+ counter_trgt <= (en_quad_in) ? {2'b00,counter_in[15:2]} : counter_in;
+ end
+ end
end
endmodule
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_exu.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_exu.sv
index b587fa0..9c76c7d 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_exu.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_exu.sv
@@ -104,7 +104,7 @@
// EXU <-> DMEM interface
output logic exu2dmem_req_o, // Data memory request
output logic exu2dmem_cmd_o, // Data memory command - cp.7
- output type_scr1_mem_width_e exu2dmem_width_o, // Data memory width
+ output logic [1:0] exu2dmem_width_o, // Data memory width
output logic [`SCR1_DMEM_AWIDTH-1:0] exu2dmem_addr_o, // Data memory address
output logic [`SCR1_DMEM_DWIDTH-1:0] exu2dmem_wdata_o, // Data memory write data
input logic dmem2exu_req_ack_i, // Data memory request acknowledge
@@ -167,10 +167,10 @@
// Local types declaration
//------------------------------------------------------------------------------
-typedef enum logic {
- SCR1_CSR_INIT,
- SCR1_CSR_RDY
-} scr1_csr_access_e;
+//typedef enum logic {
+parameter SCR1_CSR_INIT = 1'b0;
+parameter SCR1_CSR_RDY = 1'b1;
+//} scr1_csr_access_e;
//------------------------------------------------------------------------------
// Local signals declaration
@@ -280,8 +280,8 @@
// CSR signals
//------------------------------------------------------------------------------
// CSR access register
-scr1_csr_access_e csr_access_ff;
-scr1_csr_access_e csr_access_next;
+logic csr_access_ff;
+logic csr_access_next;
logic csr_access_init;
//------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ialu.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ialu.sv
index 393541d..0cc18e6 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ialu.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ialu.sv
@@ -80,17 +80,17 @@
} type_scr1_ialu_flags_s;
`ifdef SCR1_RVM_EXT
-typedef enum logic [1:0] {
- SCR1_IALU_MDU_FSM_IDLE,
- SCR1_IALU_MDU_FSM_ITER,
- SCR1_IALU_MDU_FSM_CORR
-} type_scr1_ialu_fsm_state;
+//typedef enum logic [1:0] {
+parameter SCR1_IALU_MDU_FSM_IDLE = 2'b00;
+parameter SCR1_IALU_MDU_FSM_ITER = 2'b01;
+parameter SCR1_IALU_MDU_FSM_CORR = 2'b10;
+//} type_scr1_ialu_fsm_state;
-typedef enum logic [1:0] {
- SCR1_IALU_MDU_NONE,
- SCR1_IALU_MDU_MUL,
- SCR1_IALU_MDU_DIV
-} type_scr1_ialu_mdu_cmd;
+//typedef enum logic [1:0] {
+parameter SCR1_IALU_MDU_NONE = 2'b00;
+parameter SCR1_IALU_MDU_MUL = 2'b01;
+parameter SCR1_IALU_MDU_DIV = 2'b10;
+//} type_scr1_ialu_mdu_cmd;
`endif // SCR1_RVM_EXT
//-------------------------------------------------------------------------------
@@ -123,8 +123,8 @@
logic rem_corr_req; // Correction request for REM(U) operations
// MUL/DIV FSM signals
-type_scr1_ialu_fsm_state mdu_fsm_ff; // Current FSM state
-type_scr1_ialu_fsm_state mdu_fsm_next; // Next FSM state
+logic [1:0] mdu_fsm_ff; // Current FSM state
+logic [1:0] mdu_fsm_next; // Next FSM state
logic mdu_fsm_idle; // MDU FSM is in IDLE state
`ifdef SCR1_TRGT_SIMULATION
logic mdu_fsm_iter; // MDU FSM is in ITER state
@@ -132,7 +132,7 @@
logic mdu_fsm_corr; // MDU FSM is in CORR state
// MDU command signals
-type_scr1_ialu_mdu_cmd mdu_cmd; // MDU command: 00 - NONE, 01 - MUL, 10 - DIV
+logic [1:0] mdu_cmd; // MDU command: 00 - NONE, 01 - MUL, 10 - DIV
logic mdu_cmd_mul; // MDU command is MUL(HSU)
logic mdu_cmd_div; // MDU command is DIV(U)/REM(U)
logic [1:0] mul_cmd; // MUL command: 00 - MUL, 01 - MULH, 10 - MULHSU, 11 - MULHU
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_idu.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_idu.sv
index 86b4d41..8b4ae76 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_idu.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_idu.sv
@@ -57,8 +57,8 @@
//-------------------------------------------------------------------------------
logic [`SCR1_IMEM_DWIDTH-1:0] instr;
-type_scr1_instr_type_e instr_type;
-type_scr1_rvi_opcode_e rvi_opcode;
+logic [1:0] instr_type;
+logic [6:2] rvi_opcode;
logic rvi_illegal;
logic [2:0] funct3;
logic [6:0] funct7;
@@ -80,19 +80,10 @@
assign instr = ifu2idu_instr_i;
// RVI / RVC
-`ifdef YOSYS
-assign instr_type = 2'(instr[1:0]);
-`else
-
-assign instr_type = type_scr1_instr_type_e'(instr[1:0]);
-`endif
+assign instr_type = instr[1:0];
// RVI / RVC fields
-`ifdef YOSYS
-assign rvi_opcode = 5'(instr[6:2]); // RVI
-`else
-assign rvi_opcode = type_scr1_rvi_opcode_e'(instr[6:2]); // RVI
-`endif
+assign rvi_opcode = instr[6:2]; // RVI
assign funct3 = (instr_type == SCR1_INSTR_RVI) ? instr[14:12] : instr[15:13]; // RVI / RVC
assign funct7 = instr[31:25]; // RVI
assign funct12 = instr[31:20]; // RVI (SYSTEM)
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ifu.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ifu.sv
index c8f562b..98b5496 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ifu.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_ifu.sv
@@ -40,10 +40,10 @@
// IFU <-> IMEM interface
input logic imem2ifu_req_ack_i, // Instruction memory request acknowledgement
output logic ifu2imem_req_o, // Instruction memory request
- output type_scr1_mem_cmd_e ifu2imem_cmd_o, // Instruction memory command (READ/WRITE)
+ output logic ifu2imem_cmd_o, // Instruction memory command (READ/WRITE)
output logic [`SCR1_IMEM_AWIDTH-1:0] ifu2imem_addr_o, // Instruction memory address
input logic [`SCR1_IMEM_DWIDTH-1:0] imem2ifu_rdata_i, // Instruction memory read data
- input type_scr1_mem_resp_e imem2ifu_resp_i, // Instruction memory response
+ input logic [1:0] imem2ifu_resp_i, // Instruction memory response
// IFU <-> EXU New PC interface
input logic exu2ifu_pc_new_req_i, // New PC request (jumps, branches, traps etc)
@@ -88,22 +88,22 @@
// Local types declaration
//------------------------------------------------------------------------------
-typedef enum logic {
- SCR1_IFU_FSM_IDLE,
- SCR1_IFU_FSM_FETCH
-} type_scr1_ifu_fsm_e;
+//typedef enum logic {
+parameter SCR1_IFU_FSM_IDLE = 1'b0;
+parameter SCR1_IFU_FSM_FETCH = 1'b1;
+//} type_scr1_ifu_fsm_e;
-typedef enum logic[1:0] {
- SCR1_IFU_QUEUE_WR_NONE, // No write to queue
- SCR1_IFU_QUEUE_WR_FULL, // Write 32 rdata bits to queue
- SCR1_IFU_QUEUE_WR_HI // Write 16 upper rdata bits to queue
-} type_scr1_ifu_queue_wr_e;
+//typedef enum logic[1:0] {
+parameter SCR1_IFU_QUEUE_WR_NONE = 2'b00; // No write to queue
+parameter SCR1_IFU_QUEUE_WR_FULL = 2'b01; // Write 32 rdata bits to queue
+parameter SCR1_IFU_QUEUE_WR_HI = 2'b10; // Write 16 upper rdata bits to queue
+//} type_scr1_ifu_queue_wr_e;
-typedef enum logic[1:0] {
- SCR1_IFU_QUEUE_RD_NONE, // No queue read
- SCR1_IFU_QUEUE_RD_HWORD, // Read halfword
- SCR1_IFU_QUEUE_RD_WORD // Read word
-} type_scr1_ifu_queue_rd_e;
+//typedef enum logic[1:0] {
+parameter SCR1_IFU_QUEUE_RD_NONE = 2'b00; // No queue read
+parameter SCR1_IFU_QUEUE_RD_HWORD = 2'b01; // Read halfword
+parameter SCR1_IFU_QUEUE_RD_WORD = 2'b10; // Read word
+//} type_scr1_ifu_queue_rd_e;
`ifdef SCR1_NO_DEC_STAGE
typedef enum logic[1:0] {
@@ -114,17 +114,17 @@
} type_scr1_bypass_e;
`endif // SCR1_NO_DEC_STAGE
-typedef enum logic [2:0] {
+//typedef enum logic [2:0] {
// SCR1_IFU_INSTR_<UPPER_16_BITS>_<LOWER_16_BITS>
- SCR1_IFU_INSTR_NONE, // No valid instruction
- SCR1_IFU_INSTR_RVI_HI_RVI_LO, // Full RV32I instruction
- SCR1_IFU_INSTR_RVC_RVC,
- SCR1_IFU_INSTR_RVI_LO_RVC,
- SCR1_IFU_INSTR_RVC_RVI_HI,
- SCR1_IFU_INSTR_RVI_LO_RVI_HI,
- SCR1_IFU_INSTR_RVC_NV, // Instruction after unaligned new_pc
- SCR1_IFU_INSTR_RVI_LO_NV // Instruction after unaligned new_pc
-} type_scr1_ifu_instr_e;
+parameter SCR1_IFU_INSTR_NONE = 3'b000 ; // No valid instruction
+parameter SCR1_IFU_INSTR_RVI_HI_RVI_LO = 3'b001 ; // Full RV32I instruction
+parameter SCR1_IFU_INSTR_RVC_RVC = 3'b010 ;
+parameter SCR1_IFU_INSTR_RVI_LO_RVC = 3'b011 ;
+parameter SCR1_IFU_INSTR_RVC_RVI_HI = 3'b100 ;
+parameter SCR1_IFU_INSTR_RVI_LO_RVI_HI = 3'b101 ;
+parameter SCR1_IFU_INSTR_RVC_NV = 3'b110 ; // Instruction after unaligned new_pc
+parameter SCR1_IFU_INSTR_RVI_LO_NV = 3'b111 ; // Instruction after unaligned new_pc
+//} type_scr1_ifu_instr_e;
//------------------------------------------------------------------------------
// Local signals declaration
@@ -141,7 +141,7 @@
// IMEM instruction type decoder
logic instr_hi_is_rvi;
logic instr_lo_is_rvi;
-type_scr1_ifu_instr_e instr_type;
+logic [2:0] instr_type;
// Register to store if the previous IMEM instruction had low part of RVI instruction
// in its high part
@@ -149,11 +149,11 @@
logic instr_hi_rvi_lo_next;
// Queue read/write size decoders
-type_scr1_ifu_queue_rd_e q_rd_size;
+logic [1:0] q_rd_size;
logic q_rd_vd;
logic q_rd_none;
logic q_rd_hword;
-type_scr1_ifu_queue_wr_e q_wr_size;
+logic [1:0] q_wr_size;
logic q_wr_none;
logic q_wr_full;
@@ -196,8 +196,8 @@
logic ifu_fetch_req;
logic ifu_stop_req;
-type_scr1_ifu_fsm_e ifu_fsm_curr;
-type_scr1_ifu_fsm_e ifu_fsm_next;
+logic ifu_fsm_curr;
+logic ifu_fsm_next;
logic ifu_fsm_fetch;
// IMEM signals
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_lsu.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_lsu.sv
index cb87993..3d75570 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_lsu.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_lsu.sv
@@ -51,31 +51,31 @@
// LSU <-> DMEM interface
output logic lsu2dmem_req_o, // Data memory request
- output type_scr1_mem_cmd_e lsu2dmem_cmd_o, // Data memory command (READ/WRITE)
- output type_scr1_mem_width_e lsu2dmem_width_o, // Data memory data width
+ output logic lsu2dmem_cmd_o, // Data memory command (READ/WRITE)
+ output logic [1:0] lsu2dmem_width_o, // Data memory data width
output logic [`SCR1_DMEM_AWIDTH-1:0] lsu2dmem_addr_o, // Data memory address
output logic [`SCR1_DMEM_DWIDTH-1:0] lsu2dmem_wdata_o, // Data memory write data
input logic dmem2lsu_req_ack_i, // Data memory request acknowledge
input logic [`SCR1_DMEM_DWIDTH-1:0] dmem2lsu_rdata_i, // Data memory read data
- input type_scr1_mem_resp_e dmem2lsu_resp_i // Data memory response
+ input logic [1:0] dmem2lsu_resp_i // Data memory response
);
//------------------------------------------------------------------------------
// Local types declaration
//------------------------------------------------------------------------------
-typedef enum logic {
- SCR1_LSU_FSM_IDLE,
- SCR1_LSU_FSM_BUSY
-} type_scr1_lsu_fsm_e;
+//typedef enum logic {
+parameter SCR1_LSU_FSM_IDLE = 1'b0;
+parameter SCR1_LSU_FSM_BUSY = 1'b1;
+//} type_scr1_lsu_fsm_e;
//------------------------------------------------------------------------------
// Local signals declaration
//------------------------------------------------------------------------------
// LSU FSM signals
-type_scr1_lsu_fsm_e lsu_fsm_curr; // LSU FSM current state
-type_scr1_lsu_fsm_e lsu_fsm_next; // LSU FSM next state
+logic lsu_fsm_curr; // LSU FSM current state
+logic lsu_fsm_next; // LSU FSM next state
logic lsu_fsm_idle; // LSU FSM is in IDLE state
// LSU Command register signals
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_mprf.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_mprf.sv
index 6cb2a34..89c0b3e 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_mprf.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_mprf.sv
@@ -60,7 +60,7 @@
logic [`SCR1_XLEN-1:0] mprf_int2 [1:`SCR1_MPRF_SIZE-1];
`endif
`else // distributed logic implementation
-type_scr1_mprf_v [1:`SCR1_MPRF_SIZE-1] mprf_int;
+logic [`SCR1_XLEN-1:0] mprf_int [1:`SCR1_MPRF_SIZE-1];
`endif
//------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_top.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_top.sv
index 69ea0d1..4678a9a 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_top.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_pipe_top.sv
@@ -3,6 +3,14 @@
/// @brief SCR1 pipeline top
///
+//----------------------------------------------------------------------------------
+// project : YiFive
+// Rev: June 10, 2021, Dinesh A
+// Bugfix- reset correction for scr1_pipe_tdu when debug is not enabled
+// Note: previously reset rst_n is floating at simulation is failing
+// when SCR1_DBG_EN is disabled
+//---------------------------------------------------------------------------------
+
`include "scr1_arch_description.svh"
`include "scr1_memif.svh"
`include "scr1_riscv_isa_decoding.svh"
@@ -31,21 +39,21 @@
// Instruction Memory Interface
output logic pipe2imem_req_o, // IMEM request
- output type_scr1_mem_cmd_e pipe2imem_cmd_o, // IMEM command
+ output logic pipe2imem_cmd_o, // IMEM command
output logic [`SCR1_IMEM_AWIDTH-1:0] pipe2imem_addr_o, // IMEM address
input logic imem2pipe_req_ack_i, // IMEM request acknowledge
input logic [`SCR1_IMEM_DWIDTH-1:0] imem2pipe_rdata_i, // IMEM read data
- input type_scr1_mem_resp_e imem2pipe_resp_i, // IMEM response
+ input logic [1:0] imem2pipe_resp_i, // IMEM response
// Data Memory Interface
output logic pipe2dmem_req_o, // DMEM request
- output type_scr1_mem_cmd_e pipe2dmem_cmd_o, // DMEM command
- output type_scr1_mem_width_e pipe2dmem_width_o, // DMEM data width
+ output logic pipe2dmem_cmd_o, // DMEM command
+ output logic [1:0] pipe2dmem_width_o, // DMEM data width
output logic [`SCR1_DMEM_AWIDTH-1:0] pipe2dmem_addr_o, // DMEM address
output logic [`SCR1_DMEM_DWIDTH-1:0] pipe2dmem_wdata_o, // DMEM write data
input logic dmem2pipe_req_ack_i, // DMEM request acknowledge
input logic [`SCR1_DMEM_DWIDTH-1:0] dmem2pipe_rdata_i, // DMEM read data
- input type_scr1_mem_resp_e dmem2pipe_resp_i, // DMEM response
+ input logic [1:0] dmem2pipe_resp_i, // DMEM response
`ifdef SCR1_DBG_EN
// Debug interface:
@@ -167,7 +175,7 @@
logic exu2csr_take_exc; // Take exception trap
logic exu2csr_mret_update; // MRET update CSR
logic exu2csr_mret_instr; // MRET instruction
-type_scr1_exc_code_e exu2csr_exc_code; // Exception code (see scr1_arch_types.svh)
+logic [SCR1_EXC_CODE_WIDTH_E-1:0] exu2csr_exc_code; // Exception code (see scr1_arch_types.svh)
logic [`SCR1_XLEN-1:0] exu2csr_trap_val; // Trap value
logic [`SCR1_XLEN-1:0] csr2exu_new_pc; // Exception/IRQ/MRET new PC
logic csr2exu_irq; // IRQ request
@@ -589,7 +597,7 @@
`ifdef SCR1_DBG_EN
.rst_n (dbg_rst_n ),
`else
- .rst_n (rst_n ),
+ .rst_n (pipe_rst_n ), // dinesh-a: Bugfix- reset correction when debug is not enabled
`endif // SCR1_DBG_EN
.clk (clk ),
.clk_en (1'b1 ),
diff --git a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_tracelog.sv b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_tracelog.sv
index 1d86001..5682cee 100644
--- a/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_tracelog.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/pipeline/scr1_tracelog.sv
@@ -18,7 +18,7 @@
`ifdef SCR1_MPRF_RAM
input logic [`SCR1_XLEN-1:0] mprf2trace_int_i [1:`SCR1_MPRF_SIZE-1], // MPRF registers content
`else // SCR1_MPRF_RAM
- input type_scr1_mprf_v [1:`SCR1_MPRF_SIZE-1] mprf2trace_int_i, // MPRF registers content
+ logic [`SCR1_XLEN-1:0] mprf2trace_int_i[1:`SCR1_MPRF_SIZE-1], // MPRF registers content
`endif // SCR1_MPRF_RAM
input logic mprf2trace_wr_en_i, // MPRF write enable
input logic [`SCR1_MPRF_AWIDTH-1:0] mprf2trace_wr_addr_i, // MPRF write address
@@ -48,7 +48,7 @@
input logic [`SCR1_XLEN-1:2] csr2trace_mepc_i, // CSR MEPC register
`endif // SCR1_RVC_EXT
input logic csr2trace_mcause_irq_i, // CSR MCAUSE.interrupt bit
- input type_scr1_exc_code_e csr2trace_mcause_ec_i, // CSR MCAUSE.exception_code bit
+ input [SCR1_EXC_CODE_WIDTH_E-1:0] csr2trace_mcause_ec_i, // CSR MCAUSE.exception_code bit
input logic [`SCR1_XLEN-1:0] csr2trace_mtval_i, // CSR MTVAL register
input logic csr2trace_mstatus_mie_up_i, // CSR MSTATUS.mie update flag
@@ -430,7 +430,7 @@
`else // SCR1_RVC_EXT
{csr2trace_mepc_i, 2'b00};
`endif // SCR1_RVC_EXT
- csr_trace1.mcause = {csr2trace_mcause_irq_i, type_scr1_csr_mcause_ec_v'(csr2trace_mcause_ec_i)};
+ csr_trace1.mcause = {csr2trace_mcause_irq_i, csr2trace_mcause_ec_i};
csr_trace1.mtval = csr2trace_mtval_i;
csr_trace1.mstatus = '0;
diff --git a/verilog/rtl/syntacore/scr1/src/core/scr1_core_top.sv b/verilog/rtl/syntacore/scr1/src/core/scr1_core_top.sv
index 582e4bb..ba156f3 100644
--- a/verilog/rtl/syntacore/scr1/src/core/scr1_core_top.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/scr1_core_top.sv
@@ -63,20 +63,20 @@
// Instruction Memory Interface
input logic imem2core_req_ack_i, // IMEM request acknowledge
output logic core2imem_req_o, // IMEM request
- output type_scr1_mem_cmd_e core2imem_cmd_o, // IMEM command
+ output logic core2imem_cmd_o, // IMEM command
output logic [`SCR1_IMEM_AWIDTH-1:0] core2imem_addr_o, // IMEM address
input logic [`SCR1_IMEM_DWIDTH-1:0] imem2core_rdata_i, // IMEM read data
- input type_scr1_mem_resp_e imem2core_resp_i, // IMEM response
+ input logic [1:0] imem2core_resp_i, // IMEM response
// Data Memory Interface
input logic dmem2core_req_ack_i, // DMEM request acknowledge
output logic core2dmem_req_o, // DMEM request
- output type_scr1_mem_cmd_e core2dmem_cmd_o, // DMEM command
- output type_scr1_mem_width_e core2dmem_width_o, // DMEM data width
+ output logic core2dmem_cmd_o, // DMEM command
+ output logic[1:0] core2dmem_width_o, // DMEM data width
output logic [`SCR1_DMEM_AWIDTH-1:0] core2dmem_addr_o, // DMEM address
output logic [`SCR1_DMEM_DWIDTH-1:0] core2dmem_wdata_o, // DMEM write data
input logic [`SCR1_DMEM_DWIDTH-1:0] dmem2core_rdata_i, // DMEM read data
- input type_scr1_mem_resp_e dmem2core_resp_i // DMEM response
+ input logic [1:0] dmem2core_resp_i // DMEM response
);
//-------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/core/scr1_dm.sv b/verilog/rtl/syntacore/scr1/src/core/scr1_dm.sv
index 642dd53..724d98d 100644
--- a/verilog/rtl/syntacore/scr1/src/core/scr1_dm.sv
+++ b/verilog/rtl/syntacore/scr1/src/core/scr1_dm.sv
@@ -113,13 +113,13 @@
DHI_STATE_RESUME_RUN
} type_scr1_dhi_fsm_e;
-typedef enum logic [SCR1_DBG_ABSTRACTCS_CMDERR_WDTH:0] {
- ABS_ERR_NONE = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d0),
- ABS_ERR_BUSY = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d1),
- ABS_ERR_CMD = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d2),
- ABS_ERR_EXCEPTION = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d3),
- ABS_ERR_NOHALT = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d4)
-} type_scr1_abs_err_e;
+//typedef enum logic [SCR1_DBG_ABSTRACTCS_CMDERR_WDTH:0] {
+parameter ABS_ERR_NONE = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d0);
+parameter ABS_ERR_BUSY = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d1);
+parameter ABS_ERR_CMD = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d2);
+parameter ABS_ERR_EXCEPTION = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d3);
+parameter ABS_ERR_NOHALT = (SCR1_DBG_ABSTRACTCS_CMDERR_WDTH+1)'('d4);
+//} type_scr1_abs_err_e;
//------------------------------------------------------------------------------
@@ -362,8 +362,8 @@
logic abs_err_acc_busy_ff;
logic abs_err_acc_busy_next;
-type_scr1_abs_err_e abstractcs_cmderr_ff;
-type_scr1_abs_err_e abstractcs_cmderr_next;
+logic [SCR1_DBG_ABSTRACTCS_CMDERR_WDTH:0] abstractcs_cmderr_ff;
+logic [SCR1_DBG_ABSTRACTCS_CMDERR_WDTH:0] abstractcs_cmderr_next;
// Abstract instruction signals
//------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/includes/scr1_arch_types.svh b/verilog/rtl/syntacore/scr1/src/includes/scr1_arch_types.svh
index 62f1037..6f76889 100644
--- a/verilog/rtl/syntacore/scr1/src/includes/scr1_arch_types.svh
+++ b/verilog/rtl/syntacore/scr1/src/includes/scr1_arch_types.svh
@@ -20,8 +20,9 @@
`define SCR1_MPRF_SIZE 32
`endif // SCR1_RVE_EXT
-typedef logic [`SCR1_XLEN-1:0] type_scr1_mprf_v;
-typedef logic [`SCR1_XLEN-1:0] type_scr1_pc_v;
+// Masked due to iverilog issue
+//typedef logic [`SCR1_XLEN-1:0] type_scr1_mprf_v;
+//typedef logic [`SCR1_XLEN-1:0] type_scr1_pc_v;
parameter int unsigned SCR1_CSR_ADDR_WIDTH = 12;
parameter int unsigned SCR1_CSR_MTVEC_BASE_ZERO_BITS = 6;
diff --git a/verilog/rtl/syntacore/scr1/src/includes/scr1_memif.svh b/verilog/rtl/syntacore/scr1/src/includes/scr1_memif.svh
index 7235d1d..395403e 100644
--- a/verilog/rtl/syntacore/scr1/src/includes/scr1_memif.svh
+++ b/verilog/rtl/syntacore/scr1/src/includes/scr1_memif.svh
@@ -11,39 +11,39 @@
//-------------------------------------------------------------------------------
// Memory command enum
//-------------------------------------------------------------------------------
-typedef enum logic {
- SCR1_MEM_CMD_RD = 1'b0,
- SCR1_MEM_CMD_WR = 1'b1
-`ifdef SCR1_XPROP_EN
- ,
- SCR1_MEM_CMD_ERROR = 'x
-`endif // SCR1_XPROP_EN
-} type_scr1_mem_cmd_e;
+//typedef enum logic {
+parameter SCR1_MEM_CMD_RD = 1'b0;
+parameter SCR1_MEM_CMD_WR = 1'b1;
+//`ifdef SCR1_XPROP_EN
+// ,
+parameter SCR1_MEM_CMD_ERROR = 'x;
+//`endif // SCR1_XPROP_EN
+//} type_scr1_mem_cmd_e;
//-------------------------------------------------------------------------------
// Memory data width enum
//-------------------------------------------------------------------------------
-typedef enum logic[1:0] {
- SCR1_MEM_WIDTH_BYTE = 2'b00,
- SCR1_MEM_WIDTH_HWORD = 2'b01,
- SCR1_MEM_WIDTH_WORD = 2'b10
-`ifdef SCR1_XPROP_EN
- ,
- SCR1_MEM_WIDTH_ERROR = 'x
-`endif // SCR1_XPROP_EN
-} type_scr1_mem_width_e;
+//typedef enum logic[1:0] {
+parameter SCR1_MEM_WIDTH_BYTE = 2'b00;
+parameter SCR1_MEM_WIDTH_HWORD = 2'b01;
+parameter SCR1_MEM_WIDTH_WORD = 2'b10;
+//`ifdef SCR1_XPROP_EN
+// ,
+parameter SCR1_MEM_WIDTH_ERROR = 'x;
+//`endif // SCR1_XPROP_EN
+//} type_scr1_mem_width_e;
//-------------------------------------------------------------------------------
// Memory response enum
//-------------------------------------------------------------------------------
-typedef enum logic[1:0] {
- SCR1_MEM_RESP_NOTRDY = 2'b00,
- SCR1_MEM_RESP_RDY_OK = 2'b01,
- SCR1_MEM_RESP_RDY_ER = 2'b10
-`ifdef SCR1_XPROP_EN
- ,
- SCR1_MEM_RESP_ERROR = 'x
-`endif // SCR1_XPROP_EN
-} type_scr1_mem_resp_e;
+//typedef enum logic[1:0] {
+parameter SCR1_MEM_RESP_NOTRDY = 2'b00;
+parameter SCR1_MEM_RESP_RDY_OK = 2'b01;
+parameter SCR1_MEM_RESP_RDY_ER = 2'b10;
+//`ifdef SCR1_XPROP_EN
+// ,
+parameter SCR1_MEM_RESP_ERROR = 'x;
+//`endif // SCR1_XPROP_EN
+//} type_scr1_mem_resp_e;
`endif // SCR1_MEMIF_SVH
diff --git a/verilog/rtl/syntacore/scr1/src/includes/scr1_riscv_isa_decoding.svh b/verilog/rtl/syntacore/scr1/src/includes/scr1_riscv_isa_decoding.svh
index e143d89..890807a 100644
--- a/verilog/rtl/syntacore/scr1/src/includes/scr1_riscv_isa_decoding.svh
+++ b/verilog/rtl/syntacore/scr1/src/includes/scr1_riscv_isa_decoding.svh
@@ -12,29 +12,29 @@
//-------------------------------------------------------------------------------
// Instruction types
//-------------------------------------------------------------------------------
-typedef enum logic [1:0] {
- SCR1_INSTR_RVC0 = 2'b00,
- SCR1_INSTR_RVC1 = 2'b01,
- SCR1_INSTR_RVC2 = 2'b10,
- SCR1_INSTR_RVI = 2'b11
-} type_scr1_instr_type_e;
+//typedef enum logic [1:0] {
+parameter SCR1_INSTR_RVC0 = 2'b00;
+parameter SCR1_INSTR_RVC1 = 2'b01;
+parameter SCR1_INSTR_RVC2 = 2'b10;
+parameter SCR1_INSTR_RVI = 2'b11;
+//} type_scr1_instr_type_e;
//-------------------------------------------------------------------------------
// RV32I opcodes (bits 6:2)
//-------------------------------------------------------------------------------
-typedef enum logic [6:2] {
- SCR1_OPCODE_LOAD = 5'b00000,
- SCR1_OPCODE_MISC_MEM = 5'b00011,
- SCR1_OPCODE_OP_IMM = 5'b00100,
- SCR1_OPCODE_AUIPC = 5'b00101,
- SCR1_OPCODE_STORE = 5'b01000,
- SCR1_OPCODE_OP = 5'b01100,
- SCR1_OPCODE_LUI = 5'b01101,
- SCR1_OPCODE_BRANCH = 5'b11000,
- SCR1_OPCODE_JALR = 5'b11001,
- SCR1_OPCODE_JAL = 5'b11011,
- SCR1_OPCODE_SYSTEM = 5'b11100
-} type_scr1_rvi_opcode_e;
+//typedef enum logic [6:2] {
+parameter SCR1_OPCODE_LOAD = 5'b00000;
+parameter SCR1_OPCODE_MISC_MEM = 5'b00011;
+parameter SCR1_OPCODE_OP_IMM = 5'b00100;
+parameter SCR1_OPCODE_AUIPC = 5'b00101;
+parameter SCR1_OPCODE_STORE = 5'b01000;
+parameter SCR1_OPCODE_OP = 5'b01100;
+parameter SCR1_OPCODE_LUI = 5'b01101;
+parameter SCR1_OPCODE_BRANCH = 5'b11000;
+parameter SCR1_OPCODE_JALR = 5'b11001;
+parameter SCR1_OPCODE_JAL = 5'b11011;
+parameter SCR1_OPCODE_SYSTEM = 5'b11100;
+//} type_scr1_rvi_opcode_e;
//-------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/includes/scr1_scu.svh b/verilog/rtl/syntacore/scr1/src/includes/scr1_scu.svh
index ab19386..35659d5 100644
--- a/verilog/rtl/syntacore/scr1/src/includes/scr1_scu.svh
+++ b/verilog/rtl/syntacore/scr1/src/includes/scr1_scu.svh
@@ -16,6 +16,7 @@
localparam int unsigned SCR1_SCU_DR_SYSCTRL_OP_WIDTH = 2;
localparam int unsigned SCR1_SCU_DR_SYSCTRL_ADDR_WIDTH = 2;
localparam int unsigned SCR1_SCU_DR_SYSCTRL_DATA_WIDTH = 4;
+localparam int unsigned SCR1_SCU_DR_SYSCTRL_WIDTH = SCR1_SCU_DR_SYSCTRL_OP_WIDTH+SCR1_SCU_DR_SYSCTRL_ADDR_WIDTH+SCR1_SCU_DR_SYSCTRL_DATA_WIDTH; // cp.3
//==============================================================================
// Types
@@ -73,6 +74,7 @@
logic dm_rst_bhv;
} type_scr1_scu_sysctrl_mode_reg_s;
+localparam bit [31:0] SCR1_SCU_SYSCTRL_STATUS_REG_WIDTH = 4; // cp.3
typedef struct packed {
logic hdu_reset;
logic dm_reset;
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_ahb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_ahb.sv
index 5b06660..f1a8f00 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_ahb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_ahb.sv
@@ -14,12 +14,12 @@
// Core Interface
output logic dmem_req_ack,
input logic dmem_req,
- input type_scr1_mem_cmd_e dmem_cmd,
- input type_scr1_mem_width_e dmem_width,
+ input logic dmem_cmd,
+ input logic [1:0] dmem_width,
input logic [SCR1_AHB_WIDTH-1:0] dmem_addr,
input logic [SCR1_AHB_WIDTH-1:0] dmem_wdata,
output logic [SCR1_AHB_WIDTH-1:0] dmem_rdata,
- output type_scr1_mem_resp_e dmem_resp,
+ output logic [1:0] dmem_resp,
// AHB Interface
output logic [3:0] hprot,
@@ -78,7 +78,7 @@
// Local functions
//-------------------------------------------------------------------------------
function automatic logic [2:0] scr1_conv_mem2ahb_width (
- input type_scr1_mem_width_e dmem_width
+ input logic [1:0] dmem_width
);
logic [2:0] tmp;
begin
@@ -102,7 +102,7 @@
function automatic logic[SCR1_AHB_WIDTH-1:0] scr1_conv_mem2ahb_wdata (
input logic [1:0] dmem_addr,
- input type_scr1_mem_width_e dmem_width,
+ input logic [1:0] dmem_width,
input logic [SCR1_AHB_WIDTH-1:0] dmem_wdata
);
logic [SCR1_AHB_WIDTH-1:0] tmp;
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_router.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_router.sv
index afef729..badd8cd 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_router.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_router.sv
@@ -20,42 +20,42 @@
// Core interface
output logic dmem_req_ack,
input logic dmem_req,
- input type_scr1_mem_cmd_e dmem_cmd,
- input type_scr1_mem_width_e dmem_width,
+ input logic dmem_cmd,
+ input logic [1:0] dmem_width,
input logic [`SCR1_DMEM_AWIDTH-1:0] dmem_addr,
input logic [`SCR1_DMEM_DWIDTH-1:0] dmem_wdata,
output logic [`SCR1_DMEM_DWIDTH-1:0] dmem_rdata,
- output type_scr1_mem_resp_e dmem_resp,
+ output logic [1:0] dmem_resp,
// PORT0 interface
input logic port0_req_ack,
output logic port0_req,
- output type_scr1_mem_cmd_e port0_cmd,
- output type_scr1_mem_width_e port0_width,
+ output logic port0_cmd,
+ output logic [1:0] port0_width,
output logic [`SCR1_DMEM_AWIDTH-1:0] port0_addr,
output logic [`SCR1_DMEM_DWIDTH-1:0] port0_wdata,
input logic [`SCR1_DMEM_DWIDTH-1:0] port0_rdata,
- input type_scr1_mem_resp_e port0_resp,
+ input logic [1:0] port0_resp,
// PORT1 interface
input logic port1_req_ack,
output logic port1_req,
- output type_scr1_mem_cmd_e port1_cmd,
- output type_scr1_mem_width_e port1_width,
+ output logic port1_cmd,
+ output logic [1:0] port1_width,
output logic [`SCR1_DMEM_AWIDTH-1:0] port1_addr,
output logic [`SCR1_DMEM_DWIDTH-1:0] port1_wdata,
input logic [`SCR1_DMEM_DWIDTH-1:0] port1_rdata,
- input type_scr1_mem_resp_e port1_resp,
+ input logic [1:0] port1_resp,
// PORT2 interface
input logic port2_req_ack,
output logic port2_req,
- output type_scr1_mem_cmd_e port2_cmd,
- output type_scr1_mem_width_e port2_width,
+ output logic port2_cmd,
+ output logic [1:0] port2_width,
output logic [`SCR1_DMEM_AWIDTH-1:0] port2_addr,
output logic [`SCR1_DMEM_DWIDTH-1:0] port2_wdata,
input logic [`SCR1_DMEM_DWIDTH-1:0] port2_rdata,
- input type_scr1_mem_resp_e port2_resp
+ input logic [1:0] port2_resp
);
//-------------------------------------------------------------------------------
@@ -79,7 +79,7 @@
type_scr1_sel_e port_sel;
type_scr1_sel_e port_sel_r;
logic [`SCR1_DMEM_DWIDTH-1:0] sel_rdata;
-type_scr1_mem_resp_e sel_resp;
+logic [1:0] sel_resp;
logic sel_req_ack;
//-------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv
index 24691d4..85a0c5c 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_dmem_wb.sv
@@ -17,6 +17,10 @@
//// Revision : ////
//// v0: June 7, 2021, Dinesh A ////
//// wishbone integration ////
+//// v1: June 9, 2021, Dinesh A ////
+//// On power up, wishbone output are unkown as it ////
+//// driven from fifo output. To avoid unknown ////
+//// propgation, we are driving 'h0 when fifo empty ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
@@ -62,12 +66,12 @@
// Core Interface
output logic dmem_req_ack,
input logic dmem_req,
- input type_scr1_mem_cmd_e dmem_cmd,
- input type_scr1_mem_width_e dmem_width,
+ input logic dmem_cmd,
+ input logic [1:0] dmem_width,
input logic [SCR1_WB_WIDTH-1:0] dmem_addr,
input logic [SCR1_WB_WIDTH-1:0] dmem_wdata,
output logic [SCR1_WB_WIDTH-1:0] dmem_rdata,
- output type_scr1_mem_resp_e dmem_resp,
+ output logic [1:0] dmem_resp,
// WB Interface
output logic wbd_stb_o, // strobe/request
@@ -106,7 +110,6 @@
} type_scr1_req_fifo_s;
typedef struct packed {
- logic hwrite;
logic [2:0] hwidth;
logic [1:0] haddr;
} type_scr1_data_fifo_s;
@@ -122,7 +125,7 @@
// Local functions
//-------------------------------------------------------------------------------
function automatic logic [2:0] scr1_conv_mem2wb_width (
- input type_scr1_mem_width_e dmem_width
+ input logic [1:0] dmem_width
);
logic [2:0] tmp;
begin
@@ -146,7 +149,7 @@
function automatic logic[SCR1_WB_WIDTH-1:0] scr1_conv_mem2wb_wdata (
input logic [1:0] dmem_addr,
- input type_scr1_mem_width_e dmem_width,
+ input logic [1:0] dmem_width,
input logic [SCR1_WB_WIDTH-1:0] dmem_wdata
);
logic [SCR1_WB_WIDTH-1:0] tmp;
@@ -259,7 +262,7 @@
assign dmem_req_ack = ~req_fifo_full;
assign req_fifo_wr = ~req_fifo_full & dmem_req;
-assign dmem_rdata = scr1_conv_wb2mem_rdata(resp_fifo.hwidth, resp_fifo.haddr, resp_fifo.hrdata);
+assign dmem_rdata = (resp_fifo_hready) ? scr1_conv_wb2mem_rdata(resp_fifo.hwidth, resp_fifo.haddr, resp_fifo.hrdata) : 'h0;
assign dmem_resp = (resp_fifo_hready)
? (resp_fifo.hresp == 1'b1)
@@ -429,18 +432,20 @@
always_ff @(posedge clk) begin
if (wbd_ack_i) begin
resp_fifo.hresp <= (wbd_err_i) ? 1'b0 : 1'b1;
- resp_fifo.hwidth <= data_fifo.hwidth;
- resp_fifo.haddr <= data_fifo.haddr;
- resp_fifo.hrdata <= wbd_dat_i;
+ resp_fifo.hwidth <= hwidth_out;
+ resp_fifo.haddr <= haddr_out[1:0];
+ resp_fifo.hrdata <= (wbd_we_o) ? 'h0: wbd_dat_i;
end
end
assign wbd_stb_o = ~req_fifo_empty;
-assign wbd_adr_o = haddr_out;
-assign wbd_we_o = hwrite_out;
-assign wbd_dat_o = hwdata_out;
-assign wbd_sel_o = hbel_out;
+
+// To avoid unknown progating the design, driven zero when fifo is empty
+assign wbd_adr_o = (req_fifo_empty) ? 'h0 : haddr_out;
+assign wbd_we_o = (req_fifo_empty) ? 'h0 : hwrite_out;
+assign wbd_dat_o = (req_fifo_empty) ? 'h0 : hwdata_out;
+assign wbd_sel_o = (req_fifo_empty) ? 'h0 : hbel_out;
`endif // SCR1_DMEM_WB_IN_BP
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_ahb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_ahb.sv
index e749f9d..47ad399 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_ahb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_ahb.sv
@@ -16,7 +16,7 @@
input logic imem_req,
input logic [SCR1_AHB_WIDTH-1:0] imem_addr,
output logic [SCR1_AHB_WIDTH-1:0] imem_rdata,
- output type_scr1_mem_resp_e imem_resp,
+ output logic [1:0] imem_resp,
// AHB Interface
output logic [3:0] hprot,
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_router.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_router.sv
index dd76f25..7652201 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_router.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_router.sv
@@ -18,26 +18,26 @@
// Core interface
output logic imem_req_ack,
input logic imem_req,
- input type_scr1_mem_cmd_e imem_cmd,
+ input logic imem_cmd,
input logic [`SCR1_IMEM_AWIDTH-1:0] imem_addr,
output logic [`SCR1_IMEM_DWIDTH-1:0] imem_rdata,
- output type_scr1_mem_resp_e imem_resp,
+ output logic [1:0] imem_resp,
// PORT0 interface
input logic port0_req_ack,
output logic port0_req,
- output type_scr1_mem_cmd_e port0_cmd,
+ output logic port0_cmd,
output logic [`SCR1_IMEM_AWIDTH-1:0] port0_addr,
input logic [`SCR1_IMEM_DWIDTH-1:0] port0_rdata,
- input type_scr1_mem_resp_e port0_resp,
+ input logic [1:0] port0_resp,
// PORT1 interface
input logic port1_req_ack,
output logic port1_req,
- output type_scr1_mem_cmd_e port1_cmd,
+ output logic port1_cmd,
output logic [`SCR1_IMEM_AWIDTH-1:0] port1_addr,
input logic [`SCR1_IMEM_DWIDTH-1:0] port1_rdata,
- input type_scr1_mem_resp_e port1_resp
+ input logic [1:0] port1_resp
);
//-------------------------------------------------------------------------------
@@ -55,7 +55,7 @@
logic port_sel;
logic port_sel_r;
logic [`SCR1_IMEM_DWIDTH-1:0] sel_rdata;
-type_scr1_mem_resp_e sel_resp;
+logic [1:0] sel_resp;
logic sel_req_ack;
//-------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv
index c2a5349..d91c9e3 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_imem_wb.sv
@@ -17,6 +17,10 @@
//// Revision : ////
//// v0: June 7, 2021, Dinesh A ////
//// wishbone integration ////
+//// v1: June 9, 2021, Dinesh A ////
+//// On power up, wishbone output are unkown as it ////
+//// driven from fifo output. To avoid unknown ////
+//// propgation, we are driving 'h0 when fifo empty ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
@@ -64,7 +68,7 @@
input logic imem_req,
input logic [SCR1_WB_WIDTH-1:0] imem_addr,
output logic [SCR1_WB_WIDTH-1:0] imem_rdata,
- output type_scr1_mem_resp_e imem_resp,
+ output logic [1:0] imem_resp,
// WB Interface
output logic wbd_stb_o, // strobe/request
@@ -227,7 +231,8 @@
end
assign wbd_stb_o = ~req_fifo_empty;
-assign wbd_adr_o = req_fifo_dout;
+// On Power, to avoid unknow propgating the value
+assign wbd_adr_o = (req_fifo_empty) ? 'h0 : req_fifo_dout;
assign wbd_we_o = 0; // Only Read supported
assign wbd_dat_o = 32'h0; // No Write
assign wbd_sel_o = 4'b1111; // Only Read allowed in imem i/f
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_mem_axi.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_mem_axi.sv
index f6bb7ea..1b9155d 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_mem_axi.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_mem_axi.sv
@@ -23,12 +23,12 @@
output logic core_idle,
output logic core_req_ack,
input logic core_req,
- input type_scr1_mem_cmd_e core_cmd,
- input type_scr1_mem_width_e core_width,
+ input logic core_cmd,
+ input logic [1:0] core_width,
input logic [SCR1_ADDR_WIDTH-1:0] core_addr,
input logic [31:0] core_wdata,
output logic [31:0] core_rdata,
- output type_scr1_mem_resp_e core_resp,
+ output logic [1:0] core_resp,
// AXI
output logic [SCR1_AXI_IDWIDTH-1:0] awid,
@@ -80,7 +80,7 @@
// Local functions
function automatic logic [2:0] width2axsize (
- input type_scr1_mem_width_e width );
+ input logic [1:0] width );
logic [2:0] axsize;
begin
case (width)
@@ -95,7 +95,7 @@
endfunction
typedef struct packed {
- type_scr1_mem_width_e axi_width;
+ logic [1:0] axi_width;
logic [SCR1_ADDR_WIDTH-1:0] axi_addr;
logic [31:0] axi_wdata;
} type_scr1_request_s;
@@ -129,7 +129,7 @@
logic [$clog2(SCR1_REQ_BUF_SIZE)-1:0] req_done_ptr;
logic rresp_err;
logic [31:0] rcvd_rdata;
-type_scr1_mem_resp_e rcvd_resp;
+logic [1:0] rcvd_resp;
logic force_read;
logic force_write;
@@ -308,6 +308,8 @@
assign wdata = (force_write)? core_wdata << (8* core_addr[1:0]) :
req_fifo_axi_wdata[req_proc_ptr] << (8* bShift1);
+wire [SCR1_ADDR_WIDTH-1:0] CurAddr2 = req_fifo_axi_addr[req_done_ptr];
+wire [1:0] bShift2 = CurAddr2[1:0];
// Read data adaptation
always_comb begin
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_tcm.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_tcm.sv
index 97376cf..82a8b06 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_tcm.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_tcm.sv
@@ -21,17 +21,17 @@
input logic imem_req,
input logic [`SCR1_IMEM_AWIDTH-1:0] imem_addr,
output logic [`SCR1_IMEM_DWIDTH-1:0] imem_rdata,
- output type_scr1_mem_resp_e imem_resp,
+ output logic [1:0] imem_resp,
// Core data interface
output logic dmem_req_ack,
input logic dmem_req,
- input type_scr1_mem_cmd_e dmem_cmd,
- input type_scr1_mem_width_e dmem_width,
+ input logic dmem_cmd,
+ input logic [1:0] dmem_width,
input logic [`SCR1_DMEM_AWIDTH-1:0] dmem_addr,
input logic [`SCR1_DMEM_DWIDTH-1:0] dmem_wdata,
output logic [`SCR1_DMEM_DWIDTH-1:0] dmem_rdata,
- output type_scr1_mem_resp_e dmem_resp
+ output logic [1:0] dmem_resp
);
//-------------------------------------------------------------------------------
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_timer.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_timer.sv
index 343a93a..6787754 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_timer.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_timer.sv
@@ -14,13 +14,13 @@
// Memory interface
input logic dmem_req,
- input type_scr1_mem_cmd_e dmem_cmd,
- input type_scr1_mem_width_e dmem_width,
+ input logic dmem_cmd,
+ input logic [1:0] dmem_width,
input logic [`SCR1_DMEM_AWIDTH-1:0] dmem_addr,
input logic [`SCR1_DMEM_DWIDTH-1:0] dmem_wdata,
output logic dmem_req_ack,
output logic [`SCR1_DMEM_DWIDTH-1:0] dmem_rdata,
- output type_scr1_mem_resp_e dmem_resp,
+ output logic [1:0] dmem_resp,
// Timer interface
output logic [63:0] timer_val,
@@ -268,4 +268,4 @@
//-------------------------------------------------------------------------------
assign timer_val = mtime_reg;
-endmodule : scr1_timer
\ No newline at end of file
+endmodule : scr1_timer
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_top_ahb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_top_ahb.sv
index 2268a7d..288d15e 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_top_ahb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_top_ahb.sv
@@ -100,68 +100,68 @@
// Instruction memory interface from core to router
logic core_imem_req_ack;
logic core_imem_req;
-type_scr1_mem_cmd_e core_imem_cmd;
+logic core_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] core_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] core_imem_rdata;
-type_scr1_mem_resp_e core_imem_resp;
+logic [1:0] core_imem_resp;
// Data memory interface from core to router
logic core_dmem_req_ack;
logic core_dmem_req;
-type_scr1_mem_cmd_e core_dmem_cmd;
-type_scr1_mem_width_e core_dmem_width;
+logic core_dmem_cmd;
+logic [1:0] core_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] core_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] core_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] core_dmem_rdata;
-type_scr1_mem_resp_e core_dmem_resp;
+logic [1:0] core_dmem_resp;
// Instruction memory interface from router to AHB bridge
logic ahb_imem_req_ack;
logic ahb_imem_req;
-type_scr1_mem_cmd_e ahb_imem_cmd;
+logic ahb_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] ahb_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] ahb_imem_rdata;
-type_scr1_mem_resp_e ahb_imem_resp;
+logic [1:0] ahb_imem_resp;
// Data memory interface from router to AHB bridge
logic ahb_dmem_req_ack;
logic ahb_dmem_req;
-type_scr1_mem_cmd_e ahb_dmem_cmd;
-type_scr1_mem_width_e ahb_dmem_width;
+logic ahb_dmem_cmd;
+logic [1:0] ahb_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] ahb_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] ahb_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] ahb_dmem_rdata;
-type_scr1_mem_resp_e ahb_dmem_resp;
+logic [1:0] ahb_dmem_resp;
`ifdef SCR1_TCM_EN
// Instruction memory interface from router to TCM
logic tcm_imem_req_ack;
logic tcm_imem_req;
-type_scr1_mem_cmd_e tcm_imem_cmd;
+logic tcm_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] tcm_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] tcm_imem_rdata;
-type_scr1_mem_resp_e tcm_imem_resp;
+logic [1:0] tcm_imem_resp;
// Data memory interface from router to TCM
logic tcm_dmem_req_ack;
logic tcm_dmem_req;
-type_scr1_mem_cmd_e tcm_dmem_cmd;
-type_scr1_mem_width_e tcm_dmem_width;
+logic tcm_dmem_cmd;
+logic [1:0] tcm_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] tcm_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] tcm_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] tcm_dmem_rdata;
-type_scr1_mem_resp_e tcm_dmem_resp;
+logic [1:0] tcm_dmem_resp;
`endif // SCR1_TCM_EN
// Data memory interface from router to memory-mapped timer
logic timer_dmem_req_ack;
logic timer_dmem_req;
-type_scr1_mem_cmd_e timer_dmem_cmd;
-type_scr1_mem_width_e timer_dmem_width;
+logic timer_dmem_cmd;
+logic [1:0] timer_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] timer_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] timer_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] timer_dmem_rdata;
-type_scr1_mem_resp_e timer_dmem_resp;
+logic [1:0] timer_dmem_resp;
logic timer_irq;
logic [63:0] timer_val;
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_top_axi.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_top_axi.sv
index 735b902..bbcc30d 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_top_axi.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_top_axi.sv
@@ -168,68 +168,68 @@
// Instruction memory interface from core to router
logic core_imem_req_ack;
logic core_imem_req;
-type_scr1_mem_cmd_e core_imem_cmd;
+logic core_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] core_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] core_imem_rdata;
-type_scr1_mem_resp_e core_imem_resp;
+logic [1:0] core_imem_resp;
// Data memory interface from core to router
logic core_dmem_req_ack;
logic core_dmem_req;
-type_scr1_mem_cmd_e core_dmem_cmd;
-type_scr1_mem_width_e core_dmem_width;
+logic core_dmem_cmd;
+logic [1:0] core_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] core_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] core_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] core_dmem_rdata;
-type_scr1_mem_resp_e core_dmem_resp;
+logic [1:0] core_dmem_resp;
// Instruction memory interface from router to AXI bridge
logic axi_imem_req_ack;
logic axi_imem_req;
-type_scr1_mem_cmd_e axi_imem_cmd;
+logic axi_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] axi_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] axi_imem_rdata;
-type_scr1_mem_resp_e axi_imem_resp;
+logic [1:0] axi_imem_resp;
// Data memory interface from router to AXI bridge
logic axi_dmem_req_ack;
logic axi_dmem_req;
-type_scr1_mem_cmd_e axi_dmem_cmd;
-type_scr1_mem_width_e axi_dmem_width;
+logic axi_dmem_cmd;
+logic [1:0] axi_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] axi_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] axi_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] axi_dmem_rdata;
-type_scr1_mem_resp_e axi_dmem_resp;
+logic [1:0] axi_dmem_resp;
`ifdef SCR1_TCM_EN
// Instruction memory interface from router to TCM
logic tcm_imem_req_ack;
logic tcm_imem_req;
-type_scr1_mem_cmd_e tcm_imem_cmd;
+logic tcm_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] tcm_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] tcm_imem_rdata;
-type_scr1_mem_resp_e tcm_imem_resp;
+logic [1:0] tcm_imem_resp;
// Data memory interface from router to TCM
logic tcm_dmem_req_ack;
logic tcm_dmem_req;
-type_scr1_mem_cmd_e tcm_dmem_cmd;
-type_scr1_mem_width_e tcm_dmem_width;
+logic tcm_dmem_cmd;
+logic [1:0] tcm_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] tcm_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] tcm_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] tcm_dmem_rdata;
-type_scr1_mem_resp_e tcm_dmem_resp;
+logic [1:0] tcm_dmem_resp;
`endif // SCR1_TCM_EN
// Data memory interface from router to memory-mapped timer
logic timer_dmem_req_ack;
logic timer_dmem_req;
-type_scr1_mem_cmd_e timer_dmem_cmd;
-type_scr1_mem_width_e timer_dmem_width;
+logic timer_dmem_cmd;
+logic [1:0] timer_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] timer_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] timer_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] timer_dmem_rdata;
-type_scr1_mem_resp_e timer_dmem_resp;
+logic [1:0] timer_dmem_resp;
// Misc
logic timer_irq;
diff --git a/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv b/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv
index 87e6607..97f565c 100644
--- a/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv
+++ b/verilog/rtl/syntacore/scr1/src/top/scr1_top_wb.sv
@@ -144,68 +144,68 @@
// Instruction memory interface from core to router
logic core_imem_req_ack;
logic core_imem_req;
-type_scr1_mem_cmd_e core_imem_cmd;
+logic core_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] core_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] core_imem_rdata;
-type_scr1_mem_resp_e core_imem_resp;
+logic [1:0] core_imem_resp;
// Data memory interface from core to router
logic core_dmem_req_ack;
logic core_dmem_req;
-type_scr1_mem_cmd_e core_dmem_cmd;
-type_scr1_mem_width_e core_dmem_width;
+logic core_dmem_cmd;
+logic [1:0] core_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] core_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] core_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] core_dmem_rdata;
-type_scr1_mem_resp_e core_dmem_resp;
+logic [1:0] core_dmem_resp;
// Instruction memory interface from router to WB bridge
logic wb_imem_req_ack;
logic wb_imem_req;
-type_scr1_mem_cmd_e wb_imem_cmd;
+logic wb_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] wb_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] wb_imem_rdata;
-type_scr1_mem_resp_e wb_imem_resp;
+logic [1:0] wb_imem_resp;
// Data memory interface from router to WB bridge
logic wb_dmem_req_ack;
logic wb_dmem_req;
-type_scr1_mem_cmd_e wb_dmem_cmd;
-type_scr1_mem_width_e wb_dmem_width;
+logic wb_dmem_cmd;
+logic [1:0] wb_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] wb_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] wb_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] wb_dmem_rdata;
-type_scr1_mem_resp_e wb_dmem_resp;
+logic [1:0] wb_dmem_resp;
`ifdef SCR1_TCM_EN
// Instruction memory interface from router to TCM
logic tcm_imem_req_ack;
logic tcm_imem_req;
-type_scr1_mem_cmd_e tcm_imem_cmd;
+logic tcm_imem_cmd;
logic [`SCR1_IMEM_AWIDTH-1:0] tcm_imem_addr;
logic [`SCR1_IMEM_DWIDTH-1:0] tcm_imem_rdata;
-type_scr1_mem_resp_e tcm_imem_resp;
+logic [1:0] tcm_imem_resp;
// Data memory interface from router to TCM
logic tcm_dmem_req_ack;
logic tcm_dmem_req;
-type_scr1_mem_cmd_e tcm_dmem_cmd;
-type_scr1_mem_width_e tcm_dmem_width;
+logic tcm_dmem_cmd;
+logic [1:0] tcm_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] tcm_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] tcm_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] tcm_dmem_rdata;
-type_scr1_mem_resp_e tcm_dmem_resp;
+logic [1:0] tcm_dmem_resp;
`endif // SCR1_TCM_EN
// Data memory interface from router to memory-mapped timer
logic timer_dmem_req_ack;
logic timer_dmem_req;
-type_scr1_mem_cmd_e timer_dmem_cmd;
-type_scr1_mem_width_e timer_dmem_width;
+logic timer_dmem_cmd;
+logic [1:0] timer_dmem_width;
logic [`SCR1_DMEM_AWIDTH-1:0] timer_dmem_addr;
logic [`SCR1_DMEM_DWIDTH-1:0] timer_dmem_wdata;
logic [`SCR1_DMEM_DWIDTH-1:0] timer_dmem_rdata;
-type_scr1_mem_resp_e timer_dmem_resp;
+logic [1:0] timer_dmem_resp;
logic timer_irq;
logic [63:0] timer_val;
@@ -474,7 +474,7 @@
.port1_width ( ),
.port1_addr ( ),
.port1_wdata ( ),
- .port1_rdata ('0 ),
+ .port1_rdata (32'h0 ),
.port1_resp (SCR1_MEM_RESP_RDY_ER),
`endif // SCR1_TCM_EN
// Interface to memory-mapped timer
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
index 3537de8..b97154e 100644
--- a/verilog/rtl/uprj_netlists.v
+++ b/verilog/rtl/uprj_netlists.v
@@ -24,5 +24,59 @@
`include "gl/user_proj_example.v"
`else
`include "user_project_wrapper.v"
- `include "user_proj_example.v"
-`endif
\ No newline at end of file
+ `include "spi_master/src/spim_top.sv"
+ `include "spi_master/src/spim_regs.sv"
+ `include "spi_master/src/spim_clkgen.sv"
+ `include "spi_master/src/spim_ctrl.sv"
+ `include "spi_master/src/spim_rx.sv"
+ `include "spi_master/src/spim_tx.sv"
+
+ `include "sdram_ctrl/src/top/sdrc_top.v"
+ `include "sdram_ctrl/src/wb2sdrc/wb2sdrc.v"
+ `include "lib/async_fifo.sv"
+ `include "sdram_ctrl/src/core/sdrc_core.v"
+ `include "sdram_ctrl/src/core/sdrc_bank_ctl.v"
+ `include "sdram_ctrl/src/core/sdrc_bank_fsm.v"
+ `include "sdram_ctrl/src/core/sdrc_bs_convert.v"
+ `include "sdram_ctrl/src/core/sdrc_req_gen.v"
+ `include "sdram_ctrl/src/core/sdrc_xfr_ctl.v"
+
+ `include "lib/registers.v"
+ `include "lib/clk_ctl.v"
+ `include "digital_core/src/glbl_cfg.sv"
+ `include "digital_core/src/digital_core.sv"
+
+ `include "wb_interconnect/src/wb_arb.sv"
+ `include "wb_interconnect/src/wb_interconnect.sv"
+
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_hdu.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_tdu.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_ipic.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_csr.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_exu.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_ialu.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_idu.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_ifu.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_lsu.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_mprf.sv"
+ `include "syntacore/scr1/src/core/pipeline/scr1_pipe_top.sv"
+ `include "syntacore/scr1/src/core/primitives/scr1_reset_cells.sv"
+ `include "syntacore/scr1/src/core/primitives/scr1_cg.sv"
+ `include "syntacore/scr1/src/core/scr1_clk_ctrl.sv"
+ `include "syntacore/scr1/src/core/scr1_tapc_shift_reg.sv"
+ `include "syntacore/scr1/src/core/scr1_tapc.sv"
+ `include "syntacore/scr1/src/core/scr1_tapc_synchronizer.sv"
+ `include "syntacore/scr1/src/core/scr1_core_top.sv"
+ `include "syntacore/scr1/src/core/scr1_dm.sv"
+ `include "syntacore/scr1/src/core/scr1_dmi.sv"
+ `include "syntacore/scr1/src/core/scr1_scu.sv"
+
+ `include "syntacore/scr1/src/top/scr1_dmem_router.sv"
+ `include "syntacore/scr1/src/top/scr1_dp_memory.sv"
+ `include "syntacore/scr1/src/top/scr1_tcm.sv"
+ `include "syntacore/scr1/src/top/scr1_timer.sv"
+ `include "syntacore/scr1/src/top/scr1_dmem_wb.sv"
+ `include "syntacore/scr1/src/top/scr1_imem_wb.sv"
+ `include "syntacore/scr1/src/top/scr1_top_wb.sv"
+ `include "lib/sync_fifo.sv"
+`endif
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index 2a3462b..0ff3294 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -28,7 +28,7 @@
*
*-------------------------------------------------------------
*/
-
+`default_nettype wire
module user_project_wrapper #(
parameter BITS = 32
) (
@@ -78,11 +78,12 @@
output [2:0] user_irq
);
+
/*--------------------------------------*/
/* User project is instantiated here */
/*--------------------------------------*/
-user_proj_example mprj (
+digital_core u_core (
`ifdef USE_POWER_PINS
.vdda1(vdda1), // User area 1 3.3V power
.vdda2(vdda2), // User area 2 3.3V power
@@ -94,19 +95,21 @@
.vssd2(vssd2), // User area 2 digital ground
`endif
- .wb_clk_i(wb_clk_i),
- .wb_rst_i(wb_rst_i),
+ .clk(wb_clk_i),
+ .rst_n(!wb_rst_i),
+ .rtc_clk(user_clock2),
// MGMT SoC Wishbone Slave
- .wbs_cyc_i(wbs_cyc_i),
- .wbs_stb_i(wbs_stb_i),
- .wbs_we_i(wbs_we_i),
- .wbs_sel_i(wbs_sel_i),
- .wbs_adr_i(wbs_adr_i),
- .wbs_dat_i(wbs_dat_i),
- .wbs_ack_o(wbs_ack_o),
- .wbs_dat_o(wbs_dat_o),
+ .wbd_ext_cyc_i(wbs_cyc_i),
+ .wbd_ext_stb_i(wbs_stb_i),
+ .wbd_ext_we_i(wbs_we_i),
+ .wbd_ext_sel_i(wbs_sel_i),
+ .wbd_ext_adr_i(wbs_adr_i),
+ .wbd_ext_dat_i(wbs_dat_i),
+ .wbd_ext_ack_o(wbs_ack_o),
+ .wbd_ext_dat_o(wbs_dat_o),
+ .wbd_ext_err_o(),
// Logic Analyzer
diff --git a/verilog/rtl/wb_interconnect/src/wb_arb.sv b/verilog/rtl/wb_interconnect/src/wb_arb.sv
new file mode 100644
index 0000000..b127d5c
--- /dev/null
+++ b/verilog/rtl/wb_interconnect/src/wb_arb.sv
@@ -0,0 +1,117 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone Arbitor ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// This block implement simple round robine request ////
+// arbitor for wishbone interface. ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 12th June 2021, Dinesh A ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// 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 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+module wb_arb(clk, rstn, req, gnt);
+
+input clk;
+input rstn;
+input [2:0] req; // Req input
+output [1:0] gnt; // Grant output
+
+///////////////////////////////////////////////////////////////////////
+//
+// Parameters
+//
+
+
+parameter [1:0]
+ grant0 = 3'h0,
+ grant1 = 3'h1,
+ grant2 = 3'h2;
+
+///////////////////////////////////////////////////////////////////////
+// Local Registers and Wires
+//////////////////////////////////////////////////////////////////////
+
+reg [1:0] state, next_state;
+
+///////////////////////////////////////////////////////////////////////
+// Misc Logic
+//////////////////////////////////////////////////////////////////////
+
+assign gnt = state;
+
+always@(posedge clk or negedge rstn)
+ if(!rstn) state <= grant0;
+ else state <= next_state;
+
+///////////////////////////////////////////////////////////////////////
+//
+// Next State Logic
+// - implements round robin arbitration algorithm
+// - switches grant if current req is dropped or next is asserted
+// - parks at last grant
+//////////////////////////////////////////////////////////////////////
+
+always@(state or req )
+ begin
+ next_state = state; // Default Keep State
+ case(state)
+ grant0:
+ // if this req is dropped or next is asserted, check for other req's
+ if(!req[0] ) begin
+ if(req[1]) next_state = grant1;
+ else if(req[2]) next_state = grant2;
+ end
+ grant1:
+ // if this req is dropped or next is asserted, check for other req's
+ if(!req[1] ) begin
+ if(req[2]) next_state = grant2;
+ else if(req[0]) next_state = grant0;
+ end
+ grant2:
+ // if this req is dropped or next is asserted, check for other req's
+ if(!req[2] ) begin
+ if(req[0]) next_state = grant0;
+ else if(req[1]) next_state = grant1;
+ end
+ endcase
+ end
+
+endmodule
+
diff --git a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
new file mode 100644
index 0000000..d626b95
--- /dev/null
+++ b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
@@ -0,0 +1,303 @@
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Wishbone Interconnect ////
+//// ////
+//// This file is part of the YIFive cores project ////
+//// http://www.opencores.org/cores/yifive/ ////
+//// ////
+//// Description ////
+//// 1. 3 masters and 3 slaves share bus Wishbone connection ////
+//// 2. This block implement simple round robine request ////
+//// ////
+//// To Do: ////
+//// nothing ////
+//// ////
+//// Author(s): ////
+//// - Dinesh Annayya, dinesha@opencores.org ////
+//// ////
+//// Revision : ////
+//// 0.1 - 12th June 2021, Dinesh A ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// 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 ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+
+module wb_interconnect(
+ input logic clk_i,
+ input logic rst_n,
+
+ // Master 0 Interface
+ input logic [31:0] m0_wbd_dat_i,
+ input logic [31:0] m0_wbd_adr_i,
+ input logic [3:0] m0_wbd_sel_i,
+ input logic m0_wbd_we_i,
+ input logic m0_wbd_cyc_i,
+ input logic m0_wbd_stb_i,
+ input logic [3:0] m0_wbd_tid_i, // target id
+ output logic [31:0] m0_wbd_dat_o,
+ output logic m0_wbd_ack_o,
+ output logic m0_wbd_err_o,
+
+ // Master 1 Interface
+ input logic [31:0] m1_wbd_dat_i,
+ input logic [31:0] m1_wbd_adr_i,
+ input logic [3:0] m1_wbd_sel_i,
+ input logic m1_wbd_we_i,
+ input logic m1_wbd_cyc_i,
+ input logic m1_wbd_stb_i,
+ input logic [3:0] m1_wbd_tid_i, // target id
+ output logic [31:0] m1_wbd_dat_o,
+ output logic m1_wbd_ack_o,
+ output logic m1_wbd_err_o,
+
+ // Master 2 Interface
+ input logic [31:0] m2_wbd_dat_i,
+ input logic [31:0] m2_wbd_adr_i,
+ input logic [3:0] m2_wbd_sel_i,
+ input logic m2_wbd_we_i,
+ input logic m2_wbd_cyc_i,
+ input logic m2_wbd_stb_i,
+ input logic [3:0] m2_wbd_tid_i, // target id
+ output logic [31:0] m2_wbd_dat_o,
+ output logic m2_wbd_ack_o,
+ output logic m2_wbd_err_o,
+
+
+ // Slave 0 Interface
+ input logic [31:0] s0_wbd_dat_i,
+ input logic s0_wbd_ack_i,
+ input logic s0_wbd_err_i,
+ output logic [31:0] s0_wbd_dat_o,
+ output logic [31:0] s0_wbd_adr_o,
+ output logic [3:0] s0_wbd_sel_o,
+ output logic s0_wbd_we_o,
+ output logic s0_wbd_cyc_o,
+ output logic s0_wbd_stb_o,
+
+ // Slave 1 Interface
+ input logic [31:0] s1_wbd_dat_i,
+ input logic s1_wbd_ack_i,
+ input logic s1_wbd_err_i,
+ output logic [31:0] s1_wbd_dat_o,
+ output logic [31:0] s1_wbd_adr_o,
+ output logic [3:0] s1_wbd_sel_o,
+ output logic s1_wbd_we_o,
+ output logic s1_wbd_cyc_o,
+ output logic s1_wbd_stb_o,
+
+ // Slave 2 Interface
+ input logic [31:0] s2_wbd_dat_i,
+ input logic s2_wbd_ack_i,
+ input logic s2_wbd_err_i,
+ output logic [31:0] s2_wbd_dat_o,
+ output logic [31:0] s2_wbd_adr_o,
+ output logic [3:0] s2_wbd_sel_o,
+ output logic s2_wbd_we_o,
+ output logic s2_wbd_cyc_o,
+ output logic s2_wbd_stb_o
+ );
+
+////////////////////////////////////////////////////////////////////
+//
+// Type define
+//
+
+
+// WishBone Wr Interface
+typedef struct packed {
+ logic [31:0] wbd_dat;
+ logic [31:0] wbd_adr;
+ logic [3:0] wbd_sel;
+ logic wbd_we;
+ logic wbd_cyc;
+ logic wbd_stb;
+ logic [3:0] wbd_tid; // target id
+} type_wb_wr_intf;
+
+// WishBone Rd Interface
+typedef struct packed {
+ logic [31:0] wbd_dat;
+ logic wbd_ack;
+ logic wbd_err;
+} type_wb_rd_intf;
+
+
+// Master Write Interface
+type_wb_wr_intf m0_wb_wr;
+type_wb_wr_intf m1_wb_wr;
+type_wb_wr_intf m2_wb_wr;
+
+// Master Read Interface
+type_wb_rd_intf m0_wb_rd;
+type_wb_rd_intf m1_wb_rd;
+type_wb_rd_intf m2_wb_rd;
+
+// Slave Write Interface
+type_wb_wr_intf s0_wb_wr;
+type_wb_wr_intf s1_wb_wr;
+type_wb_wr_intf s2_wb_wr;
+
+// Slave Read Interface
+type_wb_rd_intf s0_wb_rd;
+type_wb_rd_intf s1_wb_rd;
+type_wb_rd_intf s2_wb_rd;
+
+
+type_wb_wr_intf i_bus_m; // Multiplexed Master I/F
+type_wb_rd_intf i_bus_s; // Multiplexed Slave I/F
+
+
+//----------------------------------------
+// Master Mapping
+// -------------------------------------
+assign m0_wb_wr.wbd_dat = m0_wbd_dat_i;
+assign m0_wb_wr.wbd_adr = m0_wbd_adr_i;
+assign m0_wb_wr.wbd_sel = m0_wbd_sel_i;
+assign m0_wb_wr.wbd_we = m0_wbd_we_i;
+assign m0_wb_wr.wbd_cyc = m0_wbd_cyc_i;
+assign m0_wb_wr.wbd_stb = m0_wbd_stb_i;
+assign m0_wb_wr.wbd_tid = m0_wbd_tid_i;
+
+assign m1_wb_wr.wbd_dat = m1_wbd_dat_i;
+assign m1_wb_wr.wbd_adr = m1_wbd_adr_i;
+assign m1_wb_wr.wbd_sel = m1_wbd_sel_i;
+assign m1_wb_wr.wbd_we = m1_wbd_we_i;
+assign m1_wb_wr.wbd_cyc = m1_wbd_cyc_i;
+assign m1_wb_wr.wbd_stb = m1_wbd_stb_i;
+assign m1_wb_wr.wbd_tid = m1_wbd_tid_i;
+
+assign m2_wb_wr.wbd_dat = m2_wbd_dat_i;
+assign m2_wb_wr.wbd_adr = m2_wbd_adr_i;
+assign m2_wb_wr.wbd_sel = m2_wbd_sel_i;
+assign m2_wb_wr.wbd_we = m2_wbd_we_i;
+assign m2_wb_wr.wbd_cyc = m2_wbd_cyc_i;
+assign m2_wb_wr.wbd_stb = m2_wbd_stb_i;
+assign m2_wb_wr.wbd_tid = m2_wbd_tid_i;
+
+assign m0_wbd_dat_o = m0_wb_rd.wbd_dat;
+assign m0_wbd_ack_o = m0_wb_rd.wbd_ack;
+assign m0_wbd_err_o = m0_wb_rd.wbd_err;
+
+assign m1_wbd_dat_o = m1_wb_rd.wbd_dat;
+assign m1_wbd_ack_o = m1_wb_rd.wbd_ack;
+assign m1_wbd_err_o = m1_wb_rd.wbd_err;
+
+assign m2_wbd_dat_o = m2_wb_rd.wbd_dat;
+assign m2_wbd_ack_o = m2_wb_rd.wbd_ack;
+assign m2_wbd_err_o = m2_wb_rd.wbd_err;
+
+assign s0_wb_rd.wbd_dat = s0_wbd_dat_i ;
+assign s0_wb_rd.wbd_ack = s0_wbd_ack_i ;
+assign s0_wb_rd.wbd_err = s0_wbd_err_i ;
+
+assign s1_wb_rd.wbd_dat = s1_wbd_dat_i ;
+assign s1_wb_rd.wbd_ack = s1_wbd_ack_i ;
+assign s1_wb_rd.wbd_err = s1_wbd_err_i ;
+
+assign s2_wb_rd.wbd_dat = s2_wbd_dat_i ;
+assign s2_wb_rd.wbd_ack = s2_wbd_ack_i ;
+assign s2_wb_rd.wbd_err = s2_wbd_err_i ;
+
+
+//----------------------------------------
+// Slave Mapping
+// -------------------------------------
+
+assign s0_wbd_dat_o = s0_wb_wr.wbd_dat ;
+assign s0_wbd_adr_o = s0_wb_wr.wbd_adr ;
+assign s0_wbd_sel_o = s0_wb_wr.wbd_sel ;
+assign s0_wbd_we_o = s0_wb_wr.wbd_we ;
+assign s0_wbd_cyc_o = s0_wb_wr.wbd_cyc ;
+assign s0_wbd_stb_o = s0_wb_wr.wbd_stb ;
+
+assign s1_wbd_dat_o = s1_wb_wr.wbd_dat ;
+assign s1_wbd_adr_o = s1_wb_wr.wbd_adr ;
+assign s1_wbd_sel_o = s1_wb_wr.wbd_sel ;
+assign s1_wbd_we_o = s1_wb_wr.wbd_we ;
+assign s1_wbd_cyc_o = s1_wb_wr.wbd_cyc ;
+assign s1_wbd_stb_o = s1_wb_wr.wbd_stb ;
+
+assign s2_wbd_dat_o = s2_wb_wr.wbd_dat ;
+assign s2_wbd_adr_o = s2_wb_wr.wbd_adr ;
+assign s2_wbd_sel_o = s2_wb_wr.wbd_sel ;
+assign s2_wbd_we_o = s2_wb_wr.wbd_we ;
+assign s2_wbd_cyc_o = s2_wb_wr.wbd_cyc ;
+assign s2_wbd_stb_o = s2_wb_wr.wbd_stb ;
+
+//
+// arbitor
+//
+logic [1:0] gnt;
+
+wb_arb u_wb_arb(
+ .clk(clk_i),
+ .rstn(rst_n),
+ .req({ m2_wbd_cyc_i,
+ m1_wbd_cyc_i,
+ m0_wbd_cyc_i}),
+ .gnt(gnt)
+);
+
+
+// Generate Multiplexed Master Interface based on grant
+always_comb begin
+ case(gnt)
+ 3'h0: i_bus_m = m0_wb_wr;
+ 3'h1: i_bus_m = m1_wb_wr;
+ 3'h2: i_bus_m = m2_wb_wr;
+ default: i_bus_m = m0_wb_wr;
+ endcase
+end
+
+
+// Generate Multiplexed Slave Interface based on target Id
+wire [3:0] wbd_tid = i_bus_m.wbd_tid; // to fix iverilog warning
+always_comb begin
+ case(wbd_tid)
+ 3'h0: i_bus_s = s0_wb_rd;
+ 3'h1: i_bus_s = s1_wb_rd;
+ 3'h2: i_bus_s = s2_wb_rd;
+ default: i_bus_s = s0_wb_rd;
+ endcase
+end
+
+
+// Connect Master => Slave
+assign s0_wb_wr = (i_bus_m.wbd_tid == 2'b00) ? i_bus_m : 'h0;
+assign s1_wb_wr = (i_bus_m.wbd_tid == 2'b01) ? i_bus_m : 'h0;
+assign s2_wb_wr = (i_bus_m.wbd_tid == 2'b10) ? i_bus_m : 'h0;
+
+// Connect Slave to Master
+assign m0_wb_rd = (gnt == 2'b00) ? i_bus_s : 'h0;
+assign m1_wb_rd = (gnt == 2'b01) ? i_bus_s : 'h0;
+assign m2_wb_rd = (gnt == 2'b10) ? i_bus_s : 'h0;
+
+
+
+endmodule
+