OpenCores
URL https://opencores.org/ocsvn/yifive/yifive/trunk

Subversion Repositories yifive

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /yifive
    from Rev 9 to Rev 10
    Reverse comparison

Rev 9 → Rev 10

/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_ipic.sv
100,7 → 100,6
function automatic type_scr1_search_one_16_s scr1_search_one_16(
input logic [15:0] din
);
begin
logic [7:0] stage1_vd;
logic [3:0] stage2_vd;
logic [1:0] stage3_vd;
109,7 → 108,9
logic [1:0] stage2_idx [3:0];
logic [2:0] stage3_idx [1:0];
type_scr1_search_one_16_s result;
type_scr1_search_one_2_s tmp;
integer i; // cp.17
begin
// Stage 1
for (i=0; i<8; i=i+1) begin
tmp = scr1_search_one_2(din[(i+1)*2-1-:2]);
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_csr.sv
78,7 → 78,7
input logic exu2csr_take_exc_i, // Take exception trap
input logic exu2csr_mret_update_i, // MRET update CSR
input logic exu2csr_mret_instr_i, // MRET instruction
input type_scr1_exc_code_e exu2csr_exc_code_i, // Exception code (see scr1_arch_types.svh)
input logic [SCR1_EXC_CODE_WIDTH_E-1:0] exu2csr_exc_code_i, // Exception code (see scr1_arch_types.svh) - cp.7
input logic [`SCR1_XLEN-1:0] exu2csr_trap_val_i, // Trap value
output logic csr2exu_irq_o, // IRQ request
output logic csr2exu_ip_ie_o, // Some IRQ pending and locally enabled
181,9 → 181,9
logic csr_mcause_upd; // MCAUSE update enable
logic csr_mcause_i_ff; // MCAUSE: Interrupt
logic csr_mcause_i_next; // MCAUSE: Interrupt next value
type_scr1_exc_code_e csr_mcause_ec_ff; // MCAUSE: Exception code
type_scr1_exc_code_e csr_mcause_ec_next; // MCAUSE: Exception code next value
type_scr1_exc_code_e csr_mcause_ec_new; // MCAUSE: Exception code new value (IRQs)
logic [SCR1_EXC_CODE_WIDTH_E-1:0] csr_mcause_ec_ff; // MCAUSE: Exception code - cp.7
logic [SCR1_EXC_CODE_WIDTH_E-1:0] csr_mcause_ec_next; // MCAUSE: Exception code next value - cp.7
logic [SCR1_EXC_CODE_WIDTH_E-1:0] csr_mcause_ec_new; // MCAUSE: Exception code new value (IRQs) - cp.7
 
// MTVAL register
logic csr_mtval_upd; // MTVAL update enable
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_exu.sv
94,7 → 94,7
output logic exu2csr_take_exc_o, // Take exception trap
output logic exu2csr_mret_update_o, // MRET update CSR
output logic exu2csr_mret_instr_o, // MRET instruction
output type_scr1_exc_code_e exu2csr_exc_code_o, // Exception code (see scr1_arch_types.svh)
output logic [SCR1_EXC_CODE_WIDTH_E-1:0] exu2csr_exc_code_o, // Exception code (see scr1_arch_types.svh) - cp.7
output logic [`SCR1_XLEN-1:0] exu2csr_trap_val_o, // Trap value
input logic [`SCR1_XLEN-1:0] csr2exu_new_pc_i, // Exception/IRQ/MRET new PC
input logic csr2exu_irq_i, // IRQ request
103,13 → 103,13
 
// EXU <-> DMEM interface
output logic exu2dmem_req_o, // Data memory request
output type_scr1_mem_cmd_e exu2dmem_cmd_o, // Data memory command
output logic exu2dmem_cmd_o, // Data memory command - cp.7
output type_scr1_mem_width_e 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
input logic [`SCR1_DMEM_DWIDTH-1:0] dmem2exu_rdata_i, // Data memory read data
input type_scr1_mem_resp_e dmem2exu_resp_i, // Data memory response
input logic [1:0] dmem2exu_resp_i, // Data memory response - cp.7
 
// EXU control
output logic exu2pipe_exc_req_o, // Exception on last instruction
219,7 → 219,7
logic exu_exc_req_ff;
logic exu_exc_req_next;
`endif // SCR1_DBG_EN
type_scr1_exc_code_e exc_code;
logic [SCR1_EXC_CODE_WIDTH_E-1:0] exc_code; // cp.7
logic [`SCR1_XLEN-1:0] exc_trap_val;
logic instr_fault_rvi_hi;
 
263,7 → 263,7
logic lsu_rdy;
logic [`SCR1_XLEN-1:0] lsu_l_data;
logic lsu_exc_req;
type_scr1_exc_code_e lsu_exc_code;
logic [SCR1_EXC_CODE_WIDTH_E-1:0] lsu_exc_code; // cp.7
 
// EXU status signals
//------------------------------------------------------------------------------
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/core/pipeline/scr1_pipe_idu.sv
80,10 → 80,19
assign instr = ifu2idu_instr_i;
 
// RVI / RVC
assign instr_type = instr[1:0];
`ifdef YOSYS
assign instr_type = 2'(instr[1:0]);
`else
 
assign instr_type = type_scr1_instr_type_e'(instr[1:0]);
`endif
 
// RVI / RVC fields
assign rvi_opcode = instr[6:2]; // RVI
`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 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)
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/includes/scr1_wb.svh
0,0 → 1,66
//////////////////////////////////////////////////////////////////////
//// ////
//// yifive Wishbone define for syntacore ////
//// ////
//// This file is part of the yifive cores project ////
//// http://www.opencores.org/cores/yifive/ ////
//// ////
//// Description: ////
//// integrated wishbone i/f to Syntacore,scr1 core ////
//// ////
//// To Do: ////
//// nothing ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// ////
//// Revision : ////
//// v0: June 7, 2021, Dinesh A ////
//// wishbone define added ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// 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 ////
//// ////
//////////////////////////////////////////////////////////////////////
// Orginal owner Details ////
//////////////////////////////////////////////////////////////////////
 
/// @file <scr1_ahb.svh> ///
/// @brief WB header file ///
/////////////////////////////////////////////////////////////////////
 
`ifndef SCR1_WB_SVH
`define SCR1_WB_SVH
 
`include "scr1_arch_description.svh"
 
parameter SCR1_WB_WIDTH = 32;
 
// Encoding for DATA SIZE
parameter logic [2:0] SCR1_DSIZE_8B = 3'b000;
parameter logic [2:0] SCR1_DSIZE_16B = 3'b001;
parameter logic [2:0] SCR1_DSIZE_32B = 3'b010;
 
`endif // SCR1_WB_SVH
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/top/scr1_dmem_wb.sv
0,0 → 1,448
//////////////////////////////////////////////////////////////////////
//// ////
//// yifive Wishbone interface for Data memory ////
//// ////
//// This file is part of the yifive cores project ////
//// http://www.opencores.org/cores/yifive/ ////
//// ////
//// Description: ////
//// integrated wishbone i/f to data memory ////
//// ////
//// To Do: ////
//// nothing ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// ////
//// Revision : ////
//// v0: June 7, 2021, Dinesh A ////
//// wishbone integration ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// 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 ////
//// ////
//////////////////////////////////////////////////////////////////////
// Orginal owner Details ////
//////////////////////////////////////////////////////////////////////
/// Copyright by Syntacore LLC © 2016-2021. See LICENSE for details///
/// @file <scr1_dmem_wb.sv> ///
/// @brief Data memory WB bridge ///
/////////////////////////////////////////////////////////////////////
 
`include "scr1_wb.svh"
`include "scr1_memif.svh"
 
module scr1_dmem_wb (
// Control Signals
input logic rst_n,
input logic clk,
 
// 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 [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,
 
// WB Interface
output logic wbd_stb_o, // strobe/request
output logic [SCR1_WB_WIDTH-1:0] wbd_adr_o, // address
output logic wbd_we_o, // write
output logic [SCR1_WB_WIDTH-1:0] wbd_dat_o, // data output
output logic [3:0] wbd_sel_o, // byte enable
input logic [SCR1_WB_WIDTH-1:0] wbd_dat_i, // data input
input logic wbd_ack_i, // acknowlegement
input logic wbd_err_i // error
 
);
 
//-------------------------------------------------------------------------------
// Local Parameters
//-------------------------------------------------------------------------------
`ifndef SCR1_DMEM_WB_OUT_BP
localparam SCR1_FIFO_WIDTH = 2;
localparam SCR1_FIFO_CNT_WIDTH = 2;
`endif // SCR1_DMEM_WB_OUT_BP
 
//-------------------------------------------------------------------------------
// Local type declaration
//-------------------------------------------------------------------------------
typedef enum logic {
SCR1_FSM_ADDR = 1'b0,
SCR1_FSM_DATA = 1'b1,
SCR1_FSM_ERR = 1'bx
} type_scr1_fsm_e;
 
typedef struct packed {
logic hwrite;
logic [2:0] hwidth;
logic [SCR1_WB_WIDTH-1:0] haddr;
logic [SCR1_WB_WIDTH-1:0] hwdata;
} type_scr1_req_fifo_s;
 
typedef struct packed {
logic hwrite;
logic [2:0] hwidth;
logic [1:0] haddr;
} type_scr1_data_fifo_s;
 
typedef struct packed {
logic hresp;
logic [2:0] hwidth;
logic [1:0] haddr;
logic [SCR1_WB_WIDTH-1:0] hrdata;
} type_scr1_resp_fifo_s;
 
//-------------------------------------------------------------------------------
// Local functions
//-------------------------------------------------------------------------------
function automatic logic [2:0] scr1_conv_mem2wb_width (
input type_scr1_mem_width_e dmem_width
);
logic [2:0] tmp;
begin
case (dmem_width)
SCR1_MEM_WIDTH_BYTE : begin
tmp = SCR1_DSIZE_8B;
end
SCR1_MEM_WIDTH_HWORD : begin
tmp = SCR1_DSIZE_16B;
end
SCR1_MEM_WIDTH_WORD : begin
tmp = SCR1_DSIZE_32B;
end
default : begin
tmp = SCR1_DSIZE_32B;
end
endcase
scr1_conv_mem2wb_width = tmp; // cp.11
end
endfunction
 
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 [SCR1_WB_WIDTH-1:0] dmem_wdata
);
logic [SCR1_WB_WIDTH-1:0] tmp;
begin
tmp = 'x;
case (dmem_width)
SCR1_MEM_WIDTH_BYTE : begin
case (dmem_addr)
2'b00 : begin
tmp[7:0] = dmem_wdata[7:0];
end
2'b01 : begin
tmp[15:8] = dmem_wdata[7:0];
end
2'b10 : begin
tmp[23:16] = dmem_wdata[7:0];
end
2'b11 : begin
tmp[31:24] = dmem_wdata[7:0];
end
default : begin
end
endcase
end
SCR1_MEM_WIDTH_HWORD : begin
case (dmem_addr[1])
1'b0 : begin
tmp[15:0] = dmem_wdata[15:0];
end
1'b1 : begin
tmp[31:16] = dmem_wdata[15:0];
end
default : begin
end
endcase
end
SCR1_MEM_WIDTH_WORD : begin
tmp = dmem_wdata;
end
default : begin
end
endcase
scr1_conv_mem2wb_wdata = tmp;
end
endfunction
 
function automatic logic[SCR1_WB_WIDTH-1:0] scr1_conv_wb2mem_rdata (
input logic [2:0] hwidth,
input logic [1:0] haddr,
input logic [SCR1_WB_WIDTH-1:0] hrdata
);
logic [SCR1_WB_WIDTH-1:0] tmp;
begin
tmp = 'x;
case (hwidth)
SCR1_DSIZE_8B : begin
case (haddr)
2'b00 : tmp[7:0] = hrdata[7:0];
2'b01 : tmp[7:0] = hrdata[15:8];
2'b10 : tmp[7:0] = hrdata[23:16];
2'b11 : tmp[7:0] = hrdata[31:24];
default : begin
end
endcase
end
SCR1_DSIZE_16B : begin
case (haddr[1])
1'b0 : tmp[15:0] = hrdata[15:0];
1'b1 : tmp[15:0] = hrdata[31:16];
default : begin
end
endcase
end
SCR1_DSIZE_32B : begin
tmp = hrdata;
end
default : begin
end
endcase
scr1_conv_wb2mem_rdata = tmp;
end
endfunction
 
//-------------------------------------------------------------------------------
// Local signal declaration
//-------------------------------------------------------------------------------
logic req_fifo_rd;
logic req_fifo_wr;
logic req_fifo_up;
`ifdef SCR1_DMEM_WB_OUT_BP
type_scr1_req_fifo_s req_fifo_new;
type_scr1_req_fifo_s req_fifo_r;
type_scr1_req_fifo_s [0:0] req_fifo;
`else // SCR1_DMEM_WB_OUT_BP
type_scr1_req_fifo_s [0:SCR1_FIFO_WIDTH-1] req_fifo;
type_scr1_req_fifo_s [0:SCR1_FIFO_WIDTH-1] req_fifo_new;
logic [SCR1_FIFO_CNT_WIDTH-1:0] req_fifo_cnt;
logic [SCR1_FIFO_CNT_WIDTH-1:0] req_fifo_cnt_new;
`endif // SCR1_DMEM_WB_OUT_BP
logic req_fifo_empty;
logic req_fifo_full;
 
type_scr1_data_fifo_s data_fifo;
type_scr1_resp_fifo_s resp_fifo;
logic resp_fifo_hready;
 
//-------------------------------------------------------------------------------
// Interface to Core
//-------------------------------------------------------------------------------
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_resp = (resp_fifo_hready)
? (resp_fifo.hresp == 1'b1)
? SCR1_MEM_RESP_RDY_OK
: SCR1_MEM_RESP_RDY_ER
: SCR1_MEM_RESP_NOTRDY ;
 
//-------------------------------------------------------------------------------
// REQ_FIFO
//-------------------------------------------------------------------------------
`ifdef SCR1_DMEM_WB_OUT_BP
always_ff @(negedge rst_n, posedge clk) begin
if (~rst_n) begin
req_fifo_full <= 1'b0;
end else begin
if (~req_fifo_full) begin
req_fifo_full <= dmem_req & ~req_fifo_rd;
end else begin
req_fifo_full <= ~req_fifo_rd;
end
end
end
assign req_fifo_empty = ~(req_fifo_full | dmem_req);
 
assign req_fifo_up = ~req_fifo_rd & req_fifo_wr;
always_ff @(posedge clk) begin
if (req_fifo_up) begin
req_fifo_r <= req_fifo_new;
end
end
 
assign req_fifo_new.hwrite = dmem_req ? (dmem_cmd == SCR1_MEM_CMD_WR) : 1'b0;
assign req_fifo_new.hwidth = dmem_req ? scr1_conv_mem2wb_width(dmem_width) : '0;
assign req_fifo_new.haddr = dmem_req ? dmem_addr : '0;
assign req_fifo_new.hwdata = (dmem_req & (dmem_cmd == SCR1_MEM_CMD_WR))
? scr1_conv_mem2wb_wdata(dmem_addr[1:0], dmem_width, dmem_wdata)
: '0;
assign req_fifo[0] = (req_fifo_full) ? req_fifo_r: req_fifo_new;
 
//-------------------------------------------------------------------------------
// Register Data from response path - Used by Read path logic
//-------------------------------------------------------------------------------
always_ff @(posedge clk) begin
if (wbd_ack_i) begin
if (~req_fifo_empty) begin
data_fifo.hwidth <= req_fifo[0].hwidth;
data_fifo.haddr <= req_fifo[0].haddr[1:0];
end
end
end
 
`else // SCR1_DMEM_WB_OUT_BP
 
 
wire hwrite_in = (dmem_cmd == SCR1_MEM_CMD_WR);
wire [2:0] hwidth_in = scr1_conv_mem2wb_width(dmem_width);
wire [SCR1_WB_WIDTH-1:0] haddr_in = dmem_addr;
wire [SCR1_WB_WIDTH-1:0] hwdata_in = scr1_conv_mem2wb_wdata(dmem_addr[1:0], dmem_width, dmem_wdata);
 
reg [3:0] hbel_in; // byte select
always_comb begin
hbel_in = 0;
case (hwidth_in)
SCR1_DSIZE_8B : begin
hbel_in = 4'b0001 << haddr_in[1:0];
end
SCR1_DSIZE_16B : begin
hbel_in = 4'b0011 << haddr_in[1:0];
end
SCR1_DSIZE_32B : begin
hbel_in = 4'b1111;
end
endcase
end
 
 
wire [SCR1_WB_WIDTH+SCR1_WB_WIDTH+3+4:0] req_fifo_din = {hbel_in,hwrite_in,hwidth_in,haddr_in,hwdata_in};
 
sync_fifo #(
.DATA_WIDTH(SCR1_WB_WIDTH+SCR1_WB_WIDTH+3+1+4), // Data Width
.ADDR_WIDTH(1), // Address Width
.FIFO_DEPTH(2) // FIFO DEPTH
) u_req_fifo(
 
.dout (req_fifo_dout ),
 
.rstn (rst_n ),
.clk (clk ),
.wr_en (req_fifo_wr ), // Write
.rd_en (req_fifo_rd ), // Read
.din (req_fifo_din ),
.full (req_fifo_full ),
.empty (req_fifo_empty )
);
 
//-------------------------------------------------------------------------------
// Register Data from response path - Used by Read path logic
//-------------------------------------------------------------------------------
wire hwrite_out;
wire [2:0] hwidth_out;
wire [SCR1_WB_WIDTH-1:0] haddr_out;
wire [SCR1_WB_WIDTH-1:0] hwdata_out;
wire [3:0] hbel_out;
 
assign {hbel_out,hwrite_out,hwidth_out,haddr_out,hwdata_out} = req_fifo_dout;
 
always_ff @(posedge clk) begin
if (wbd_ack_i) begin
if (~req_fifo_empty) begin
data_fifo.hwidth <= hwidth_out;
data_fifo.haddr <= haddr_out[1:0];
end
end
end
 
`endif // SCR1_DMEM_WB_OUT_BP
 
 
always_comb begin
req_fifo_rd = 1'b0;
if (wbd_ack_i) begin
req_fifo_rd = ~req_fifo_empty;
end
end
 
 
//-------------------------------------------------------------------------------
// FIFO response
//-------------------------------------------------------------------------------
`ifdef SCR1_DMEM_WB_IN_BP
 
assign resp_fifo_hready = wbd_ack_i;
assign resp_fifo.hresp = (wbd_err_i) ? 1'b0 : 1'b1;
assign resp_fifo.hwidth = data_fifo.hwidth;
assign resp_fifo.haddr = data_fifo.haddr;
assign resp_fifo.hrdata = wbd_dat_i;
 
assign wbd_stb_o = ~req_fifo_empty;
assign wbd_adr_o = req_fifo[0].haddr;
assign wbd_we_o = req_fifo[0].hwrite;
assign wbd_dat_o = req_fifo[0].hwdata;
 
always_comb begin
wbd_sel_o = 0;
case (req_fifo[0].hwidth)
SCR1_DSIZE_8B : begin
wbd_sel_o = 4'b0001 << req_fifo[0].haddr[1:0];
end
SCR1_DSIZE_16B : begin
wbd_sel_o = 4'b0011 << req_fifo[0].haddr[1:0];
end
SCR1_DSIZE_32B : begin
wbd_sel_o = 4'b1111;
end
endcase
end
`else // SCR1_DMEM_WB_IN_BP
always_ff @(negedge rst_n, posedge clk) begin
if (~rst_n) begin
resp_fifo_hready <= 1'b0;
end else begin
resp_fifo_hready <= wbd_ack_i ;
end
end
 
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;
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;
 
`endif // SCR1_DMEM_WB_IN_BP
 
 
 
endmodule : scr1_dmem_wb
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/top/scr1_imem_wb.sv
0,0 → 1,273
//////////////////////////////////////////////////////////////////////
//// ////
//// yifive Wishbone interface for Instruction memory ////
//// ////
//// This file is part of the yifive cores project ////
//// http://www.opencores.org/cores/yifive/ ////
//// ////
//// Description: ////
//// integrated wishbone i/f to instruction memory ////
//// ////
//// To Do: ////
//// nothing ////
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// ////
//// Revision : ////
//// v0: June 7, 2021, Dinesh A ////
//// wishbone integration ////
//// ////
//////////////////////////////////////////////////////////////////////
//// ////
//// 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 ////
//// ////
//////////////////////////////////////////////////////////////////////
// Orginal owner Details ////
//////////////////////////////////////////////////////////////////////
 
/// @file <scr1_imem_wb.sv> ///
/// @brief Instruction memory AHB bridge ///
//////////////////////////////////////////////////////////////////////
 
`include "scr1_wb.svh"
`include "scr1_memif.svh"
 
module scr1_imem_wb (
// Control Signals
input logic rst_n,
input logic clk,
 
// Core Interface
output logic imem_req_ack,
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,
 
// WB Interface
output logic wbd_stb_o, // strobe/request
output logic [SCR1_WB_WIDTH-1:0] wbd_adr_o, // address
output logic wbd_we_o, // write
output logic [SCR1_WB_WIDTH-1:0] wbd_dat_o, // data output
output logic [3:0] wbd_sel_o, // byte enable
input logic [SCR1_WB_WIDTH-1:0] wbd_dat_i, // data input
input logic wbd_ack_i, // acknowlegement
input logic wbd_err_i // error
 
);
 
//-------------------------------------------------------------------------------
// Local parameters declaration
//-------------------------------------------------------------------------------
`ifndef SCR1_IMEM_WB_OUT_BP
localparam SCR1_FIFO_WIDTH = 2;
localparam SCR1_FIFO_CNT_WIDTH = $clog2(SCR1_FIFO_WIDTH+1);
`endif // SCR1_IMEM_WB_OUT_BP
 
//-------------------------------------------------------------------------------
// Local types declaration
//-------------------------------------------------------------------------------
typedef enum logic {
SCR1_FSM_ADDR = 1'b0,
SCR1_FSM_DATA = 1'b1,
SCR1_FSM_ERR = 1'bx
} type_scr1_fsm_e;
 
typedef struct packed {
logic [SCR1_WB_WIDTH-1:0] haddr;
} type_scr1_req_fifo_s;
 
typedef struct packed {
logic hresp;
logic [SCR1_WB_WIDTH-1:0] hrdata;
} type_scr1_resp_fifo_s;
 
//-------------------------------------------------------------------------------
// Local signal declaration
//-------------------------------------------------------------------------------
type_scr1_fsm_e fsm;
logic req_fifo_rd;
logic req_fifo_wr;
logic req_fifo_up;
`ifdef SCR1_IMEM_WB_OUT_BP
type_scr1_req_fifo_s req_fifo_r;
type_scr1_req_fifo_s [0:0] req_fifo;
`else // SCR1_IMEM_WB_OUT_BP
logic [SCR1_WB_WIDTH-1:0] req_fifo_dout;
`endif // SCR1_IMEM_WB_OUT_BP
 
logic req_fifo_empty;
logic req_fifo_full;
 
type_scr1_resp_fifo_s resp_fifo;
logic resp_fifo_hready;
 
//-------------------------------------------------------------------------------
// Interface to Core
//-------------------------------------------------------------------------------
assign imem_req_ack = ~req_fifo_full;
assign req_fifo_wr = ~req_fifo_full & imem_req;
 
assign imem_rdata = resp_fifo.hrdata;
 
assign imem_resp = (resp_fifo_hready)
? (resp_fifo.hresp == 1'b1)
? SCR1_MEM_RESP_RDY_OK
: SCR1_MEM_RESP_RDY_ER
: SCR1_MEM_RESP_NOTRDY;
 
//-------------------------------------------------------------------------------
// REQ_FIFO
//-------------------------------------------------------------------------------
`ifdef SCR1_IMEM_WB_OUT_BP
always_ff @(negedge rst_n, posedge clk) begin
if (~rst_n) begin
req_fifo_full <= 1'b0;
end else begin
if (~req_fifo_full) begin
req_fifo_full <= imem_req & ~req_fifo_rd;
end else begin
req_fifo_full <= ~req_fifo_rd;
end
end
end
assign req_fifo_empty = ~(req_fifo_full | imem_req);
 
assign req_fifo_up = ~req_fifo_rd & req_fifo_wr;
always_ff @(posedge clk) begin
if (req_fifo_up) begin
req_fifo_r.haddr <= imem_addr;
end
end
 
assign req_fifo[0] = (req_fifo_full) ? req_fifo_r : imem_addr;
 
`else // SCR1_IMEM_WB_OUT_BP
 
 
sync_fifo #(
.DATA_WIDTH(SCR1_WB_WIDTH), // Data Width
.ADDR_WIDTH(1), // Address Width
.FIFO_DEPTH(2) // FIFO DEPTH
) u_req_fifo(
 
.dout (req_fifo_dout ),
 
.rstn (rst_n ),
.clk (clk ),
.wr_en (req_fifo_wr ), // Write
.rd_en (req_fifo_rd ), // Read
.din (imem_addr ),
.full (req_fifo_full ),
.empty (req_fifo_empty )
);
 
 
 
 
`endif // SCR1_IMEM_WB_OUT_BP
 
 
always_comb begin
req_fifo_rd = 1'b0;
if (wbd_ack_i) begin
req_fifo_rd = ~req_fifo_empty;
end
end
 
//-------------------------------------------------------------------------------
// FIFO response
//-------------------------------------------------------------------------------
`ifdef SCR1_IMEM_WB_IN_BP
assign resp_fifo_hready = wbd_ack_i;
assign resp_fifo.hresp = (wbd_err_i) ? 1'b0 : 1'b1;
assign resp_fifo.hrdata = wbd_dat_i;
assign wbd_stb_o = ~req_fifo_empty;
assign wbd_adr_o = req_fifo[0];
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
 
 
`else // SCR1_IMEM_WB_IN_BP
always_ff @(negedge rst_n, posedge clk) begin
if (~rst_n) begin
resp_fifo_hready <= 1'b0;
end else begin
resp_fifo_hready <= wbd_ack_i ;
end
end
 
always_ff @(posedge clk) begin
if (wbd_ack_i) begin
resp_fifo.hresp <= (wbd_err_i) ? 1'b0 : 1'b1;
resp_fifo.hrdata <= wbd_dat_i;
end
end
 
assign wbd_stb_o = ~req_fifo_empty;
assign wbd_adr_o = 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
`endif // SCR1_IMEM_WB_IN_BP
 
 
 
`ifdef SCR1_TRGT_SIMULATION
//-------------------------------------------------------------------------------
// Assertion
//-------------------------------------------------------------------------------
 
// Check Core interface
SCR1_SVA_IMEM_WB_BRIDGE_REQ_XCHECK : assert property (
@(negedge clk) disable iff (~rst_n)
!$isunknown(imem_req)
) else $error("IMEM WB bridge Error: imem_req has unknown values");
 
SCR1_IMEM_WB_BRIDGE_ADDR_XCHECK : assert property (
@(negedge clk) disable iff (~rst_n)
imem_req |-> !$isunknown(imem_addr)
) else $error("IMEM WB bridge Error: imem_addr has unknown values");
 
SCR1_IMEM_WB_BRIDGE_ADDR_ALLIGN : assert property (
@(negedge clk) disable iff (~rst_n)
imem_req |-> (imem_addr[1:0] == '0)
) else $error("IMEM WB bridge Error: imem_addr has unalign values");
 
// Check WB interface
SCR1_IMEM_WB_BRIDGE_HREADY_XCHECK : assert property (
@(negedge clk) disable iff (~rst_n)
!$isunknown(hready)
) else $error("IMEM WB bridge Error: hready has unknown values");
 
SCR1_IMEM_WB_BRIDGE_HRESP_XCHECK : assert property (
@(negedge clk) disable iff (~rst_n)
!$isunknown(hresp)
) else $error("IMEM WB bridge Error: hresp has unknown values");
 
`endif // SCR1_TRGT_SIMULATION
 
endmodule : scr1_imem_wb
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/top/scr1_top_wb.sv
1,12 → 1,12
//////////////////////////////////////////////////////////////////////
//// ////
//// Syntacore SCR1 interface map to westbone ////
//// yifive Wishbone interface for syntacore ////
//// ////
//// This file is part of the yifive project ////
//// This file is part of the yifive cores project ////
//// http://www.opencores.org/cores/yifive/ ////
//// ////
//// Description ////
//// This module does the westbone interface to syntacore/scr1 ////
//// Description: ////
//// integrated wishbone i/f to instruction/data memory ////
//// ////
//// To Do: ////
//// nothing ////
13,17 → 13,12
//// ////
//// Author(s): ////
//// - Dinesh Annayya, dinesha@opencores.org ////
//// Initial Author: syntacore
//// - https://github.com/syntacore/scr1
//// ////
//// Revision : ////
//// v0: June 7, 2021, Dinesh A ////
//// wishbone integration ////
//// ////
//////////////////////////////////////////////////////////////////////
//// Revision : 06-June- 2021 ////
//// v-0.0 - Dinesh.A, June 06, 2021 ////
//// 1. Initial Version picked from ////
//// https://github.com/syntacore/scr1 ////
//// 2. Added westone i/f towards instruction ////
//// and data memory ////
//////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2000 Authors and OPENCORES.ORG ////
//// ////
49,11 → 44,16
//// from http://www.opencores.org/lgpl.shtml ////
//// ////
//////////////////////////////////////////////////////////////////////
// Orginal owner Details ////
//////////////////////////////////////////////////////////////////////
/// Copyright by Syntacore LLC © 2016-2020. See LICENSE for details///
/// @file <scr1_top_wb.sv> ///
/// @brief SCR1 AHB top ///
//////////////////////////////////////////////////////////////////////
 
 
`include "scr1_arch_description.svh"
`include "scr1_memif.svh"
`include "scr1_ahb.svh"
`include "scr1_wb.svh"
`ifdef SCR1_IPIC_EN
`include "scr1_ipic.svh"
`endif // SCR1_IPIC_EN
104,28 → 104,24
`endif // SCR1_DBG_EN
 
// Instruction Memory Interface
output logic [3:0] imem_hprot,
output logic [2:0] imem_hburst,
output logic [2:0] imem_hsize,
output logic [1:0] imem_htrans,
output logic imem_hmastlock,
output logic [SCR1_AHB_WIDTH-1:0] imem_haddr,
input logic imem_hready,
input logic [SCR1_AHB_WIDTH-1:0] imem_hrdata,
input logic imem_hresp,
output logic wbd_imem_stb_o, // strobe/request
output logic [SCR1_WB_WIDTH-1:0] wbd_imem_adr_o, // address
output logic wbd_imem_we_o, // write
output logic [SCR1_WB_WIDTH-1:0] wbd_imem_dat_o, // data output
output logic [3:0] wbd_imem_sel_o, // byte enable
input logic [SCR1_WB_WIDTH-1:0] wbd_imem_dat_i, // data input
input logic wbd_imem_ack_i, // acknowlegement
input logic wbd_imem_err_i, // error
 
// Data Memory Interface
output logic [3:0] dmem_hprot,
output logic [2:0] dmem_hburst,
output logic [2:0] dmem_hsize,
output logic [1:0] dmem_htrans,
output logic dmem_hmastlock,
output logic [SCR1_AHB_WIDTH-1:0] dmem_haddr,
output logic dmem_hwrite,
output logic [SCR1_AHB_WIDTH-1:0] dmem_hwdata,
input logic dmem_hready,
input logic [SCR1_AHB_WIDTH-1:0] dmem_hrdata,
input logic dmem_hresp
output logic wbd_dmem_stb_o, // strobe/request
output logic [SCR1_WB_WIDTH-1:0] wbd_dmem_adr_o, // address
output logic wbd_dmem_we_o, // write
output logic [SCR1_WB_WIDTH-1:0] wbd_dmem_dat_o, // data output
output logic [3:0] wbd_dmem_sel_o, // byte enable
input logic [SCR1_WB_WIDTH-1:0] wbd_dmem_dat_i, // data input
input logic wbd_dmem_ack_i, // acknowlegement
input logic wbd_dmem_err_i // error
);
 
//-------------------------------------------------------------------------------
163,23 → 159,23
logic [`SCR1_DMEM_DWIDTH-1:0] core_dmem_rdata;
type_scr1_mem_resp_e 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 [`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;
// 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 [`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;
 
// 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 [`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;
// 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 [`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;
 
`ifdef SCR1_TCM_EN
// Instruction memory interface from router to TCM
404,13 → 400,13
.imem_addr (core_imem_addr ),
.imem_rdata (core_imem_rdata ),
.imem_resp (core_imem_resp ),
// Interface to AHB bridge
.port0_req_ack (ahb_imem_req_ack ),
.port0_req (ahb_imem_req ),
.port0_cmd (ahb_imem_cmd ),
.port0_addr (ahb_imem_addr ),
.port0_rdata (ahb_imem_rdata ),
.port0_resp (ahb_imem_resp ),
// Interface to WB bridge
.port0_req_ack (wb_imem_req_ack ),
.port0_req (wb_imem_req ),
.port0_cmd (wb_imem_cmd ),
.port0_addr (wb_imem_addr ),
.port0_rdata (wb_imem_rdata ),
.port0_resp (wb_imem_resp ),
`ifdef SCR1_TCM_EN
// Interface to TCM
.port1_req_ack (tcm_imem_req_ack ),
424,12 → 420,12
 
`else // SCR1_IMEM_ROUTER_EN
 
assign ahb_imem_req = core_imem_req;
assign ahb_imem_cmd = core_imem_cmd;
assign ahb_imem_addr = core_imem_addr;
assign core_imem_req_ack = ahb_imem_req_ack;
assign core_imem_resp = ahb_imem_resp;
assign core_imem_rdata = ahb_imem_rdata;
assign wb_imem_req = core_imem_req;
assign wb_imem_cmd = core_imem_cmd;
assign wb_imem_addr = core_imem_addr;
assign core_imem_req_ack = wb_imem_req_ack;
assign core_imem_resp = wb_imem_resp;
assign core_imem_rdata = wb_imem_rdata;
 
`endif // SCR1_IMEM_ROUTER_EN
 
490,72 → 486,68
.port2_wdata (timer_dmem_wdata ),
.port2_rdata (timer_dmem_rdata ),
.port2_resp (timer_dmem_resp ),
// Interface to AHB bridge
.port0_req_ack (ahb_dmem_req_ack ),
.port0_req (ahb_dmem_req ),
.port0_cmd (ahb_dmem_cmd ),
.port0_width (ahb_dmem_width ),
.port0_addr (ahb_dmem_addr ),
.port0_wdata (ahb_dmem_wdata ),
.port0_rdata (ahb_dmem_rdata ),
.port0_resp (ahb_dmem_resp )
// Interface to WB bridge
.port0_req_ack (wb_dmem_req_ack ),
.port0_req (wb_dmem_req ),
.port0_cmd (wb_dmem_cmd ),
.port0_width (wb_dmem_width ),
.port0_addr (wb_dmem_addr ),
.port0_wdata (wb_dmem_wdata ),
.port0_rdata (wb_dmem_rdata ),
.port0_resp (wb_dmem_resp )
);
 
 
//-------------------------------------------------------------------------------
// Instruction memory AHB bridge
// Instruction memory WB bridge
//-------------------------------------------------------------------------------
scr1_imem_ahb i_imem_ahb (
scr1_imem_wb i_imem_wb (
.rst_n (core_rst_n_local ),
.clk (clk ),
// Interface to imem router
.imem_req_ack (ahb_imem_req_ack ),
.imem_req (ahb_imem_req ),
.imem_addr (ahb_imem_addr ),
.imem_rdata (ahb_imem_rdata ),
.imem_resp (ahb_imem_resp ),
// AHB interface
.hprot (imem_hprot ),
.hburst (imem_hburst ),
.hsize (imem_hsize ),
.htrans (imem_htrans ),
.hmastlock (imem_hmastlock ),
.haddr (imem_haddr ),
.hready (imem_hready ),
.hrdata (imem_hrdata ),
.hresp (imem_hresp )
.imem_req_ack (wb_imem_req_ack ),
.imem_req (wb_imem_req ),
.imem_addr (wb_imem_addr ),
.imem_rdata (wb_imem_rdata ),
.imem_resp (wb_imem_resp ),
// WB interface
.wbd_stb_o (wbd_imem_stb_o ),
.wbd_adr_o (wbd_imem_adr_o ),
.wbd_we_o (wbd_imem_we_o ),
.wbd_dat_o (wbd_imem_dat_o ),
.wbd_sel_o (wbd_imem_sel_o ),
.wbd_dat_i (wbd_imem_dat_i ),
.wbd_ack_i (wbd_imem_ack_i ),
.wbd_err_i (wbd_imem_err_i )
);
 
 
//-------------------------------------------------------------------------------
// Data memory AHB bridge
// Data memory WB bridge
//-------------------------------------------------------------------------------
scr1_dmem_ahb i_dmem_ahb (
scr1_dmem_wb i_dmem_wb (
.rst_n (core_rst_n_local ),
.clk (clk ),
// Interface to dmem router
.dmem_req_ack (ahb_dmem_req_ack ),
.dmem_req (ahb_dmem_req ),
.dmem_cmd (ahb_dmem_cmd ),
.dmem_width (ahb_dmem_width ),
.dmem_addr (ahb_dmem_addr ),
.dmem_wdata (ahb_dmem_wdata ),
.dmem_rdata (ahb_dmem_rdata ),
.dmem_resp (ahb_dmem_resp ),
// AHB interface
.hprot (dmem_hprot ),
.hburst (dmem_hburst ),
.hsize (dmem_hsize ),
.htrans (dmem_htrans ),
.hmastlock (dmem_hmastlock ),
.haddr (dmem_haddr ),
.hwrite (dmem_hwrite ),
.hwdata (dmem_hwdata ),
.hready (dmem_hready ),
.hrdata (dmem_hrdata ),
.hresp (dmem_hresp )
.dmem_req_ack (wb_dmem_req_ack ),
.dmem_req (wb_dmem_req ),
.dmem_cmd (wb_dmem_cmd ),
.dmem_width (wb_dmem_width ),
.dmem_addr (wb_dmem_addr ),
.dmem_wdata (wb_dmem_wdata ),
.dmem_rdata (wb_dmem_rdata ),
.dmem_resp (wb_dmem_resp ),
// WB interface
.wbd_stb_o (wbd_dmem_stb_o ),
.wbd_adr_o (wbd_dmem_adr_o ),
.wbd_we_o (wbd_dmem_we_o ),
.wbd_dat_o (wbd_dmem_dat_o ),
.wbd_sel_o (wbd_dmem_sel_o ),
.wbd_dat_i (wbd_dmem_dat_i ),
.wbd_ack_i (wbd_dmem_ack_i ),
.wbd_err_i (wbd_dmem_err_i )
);
 
endmodule : scr1_top_ahb
endmodule : scr1_top_wb
 
 
/trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/run_modemsim
0,0 → 1,2
vlib work
vlog -f wb_top.files -f core.files +incdir+includes -sv
trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/run_modemsim Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/wb_top.files =================================================================== --- trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/wb_top.files (nonexistent) +++ trunk/caravel_yifive/verilog/rtl/syntacore_scr1/src/wb_top.files (revision 10) @@ -0,0 +1,9 @@ +top/scr1_dmem_router.sv +top/scr1_imem_router.sv +top/scr1_dp_memory.sv +top/scr1_tcm.sv +top/scr1_timer.sv +top/scr1_dmem_wb.sv +top/scr1_imem_wb.sv +top/scr1_top_wb.sv +../../lib/sync_fifo.sv

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.