blob: 3f1e0a48598e70c7a321d5377a8675cdc90a7cbf [file] [log] [blame]
`define USE_POWER_PINS
module core_region
#(
parameter AXI_ADDR_WIDTH = 32,
parameter AXI_DATA_WIDTH = 64,
parameter AXI_ID_MASTER_WIDTH = 10,
parameter AXI_ID_SLAVE_WIDTH = 10,
parameter AXI_USER_WIDTH = 0,
// parameter DATA_RAM_SIZE = 32768, // in bytes
// parameter INSTR_RAM_SIZE = 32768, // in bytes
parameter DATA_RAM_SIZE = 2048, // in bytes
parameter INSTR_RAM_SIZE = 2048, // in bytes
parameter USE_ZERO_RISCY = 1,
parameter RISCY_RV32F = 0,
parameter ZERO_RV32M = 1,
parameter ZERO_RV32E = 0
)
(
`ifdef USE_POWER_PINS
vccd1, // User area 1 1.8V supply
vssd1, // User area 1 digital ground
`endif
clk,
rst_n,
testmode_i,
fetch_enable_i,
irq_i,
core_busy_o,
clock_gating_i,
boot_addr_i,
core_master_aw_addr,
core_master_aw_prot,
core_master_aw_region,
core_master_aw_len,
core_master_aw_size,
core_master_aw_burst,
core_master_aw_lock,
core_master_aw_cache,
core_master_aw_qos,
core_master_aw_id,
core_master_aw_user,
core_master_aw_ready,
core_master_aw_valid,
core_master_ar_addr,
core_master_ar_prot,
core_master_ar_region,
core_master_ar_len,
core_master_ar_size,
core_master_ar_burst,
core_master_ar_lock,
core_master_ar_cache,
core_master_ar_qos,
core_master_ar_id,
core_master_ar_user,
core_master_ar_ready,
core_master_ar_valid,
core_master_w_valid,
core_master_w_data,
core_master_w_strb,
core_master_w_user,
core_master_w_last,
core_master_w_ready,
core_master_r_data,
core_master_r_resp,
core_master_r_last,
core_master_r_id,
core_master_r_user,
core_master_r_ready,
core_master_r_valid,
core_master_b_resp,
core_master_b_id,
core_master_b_user,
core_master_b_ready,
core_master_b_valid,
dbg_master_aw_addr,
dbg_master_aw_prot,
dbg_master_aw_region,
dbg_master_aw_len,
dbg_master_aw_size,
dbg_master_aw_burst,
dbg_master_aw_lock,
dbg_master_aw_cache,
dbg_master_aw_qos,
dbg_master_aw_id,
dbg_master_aw_user,
dbg_master_aw_ready,
dbg_master_aw_valid,
dbg_master_ar_addr,
dbg_master_ar_prot,
dbg_master_ar_region,
dbg_master_ar_len,
dbg_master_ar_size,
dbg_master_ar_burst,
dbg_master_ar_lock,
dbg_master_ar_cache,
dbg_master_ar_qos,
dbg_master_ar_id,
dbg_master_ar_user,
dbg_master_ar_ready,
dbg_master_ar_valid,
dbg_master_w_valid,
dbg_master_w_data,
dbg_master_w_strb,
dbg_master_w_user,
dbg_master_w_last,
dbg_master_w_ready,
dbg_master_r_data,
dbg_master_r_resp,
dbg_master_r_last,
dbg_master_r_id,
dbg_master_r_user,
dbg_master_r_ready,
dbg_master_r_valid,
dbg_master_b_resp,
dbg_master_b_id,
dbg_master_b_user,
dbg_master_b_ready,
dbg_master_b_valid,
data_slave_aw_addr,
data_slave_aw_prot,
data_slave_aw_region,
data_slave_aw_len,
data_slave_aw_size,
data_slave_aw_burst,
data_slave_aw_lock,
data_slave_aw_cache,
data_slave_aw_qos,
data_slave_aw_id,
data_slave_aw_user,
data_slave_aw_ready,
data_slave_aw_valid,
data_slave_ar_addr,
data_slave_ar_prot,
data_slave_ar_region,
data_slave_ar_len,
data_slave_ar_size,
data_slave_ar_burst,
data_slave_ar_lock,
data_slave_ar_cache,
data_slave_ar_qos,
data_slave_ar_id,
data_slave_ar_user,
data_slave_ar_ready,
data_slave_ar_valid,
data_slave_w_valid,
data_slave_w_data,
data_slave_w_strb,
data_slave_w_user,
data_slave_w_last,
data_slave_w_ready,
data_slave_r_data,
data_slave_r_resp,
data_slave_r_last,
data_slave_r_id,
data_slave_r_user,
data_slave_r_ready,
data_slave_r_valid,
data_slave_b_resp,
data_slave_b_id,
data_slave_b_user,
data_slave_b_ready,
data_slave_b_valid,
instr_slave_aw_addr,
instr_slave_aw_prot,
instr_slave_aw_region,
instr_slave_aw_len,
instr_slave_aw_size,
instr_slave_aw_burst,
instr_slave_aw_lock,
instr_slave_aw_cache,
instr_slave_aw_qos,
instr_slave_aw_id,
instr_slave_aw_user,
instr_slave_aw_ready,
instr_slave_aw_valid,
instr_slave_ar_addr,
instr_slave_ar_prot,
instr_slave_ar_region,
instr_slave_ar_len,
instr_slave_ar_size,
instr_slave_ar_burst,
instr_slave_ar_lock,
instr_slave_ar_cache,
instr_slave_ar_qos,
instr_slave_ar_id,
instr_slave_ar_user,
instr_slave_ar_ready,
instr_slave_ar_valid,
instr_slave_w_valid,
instr_slave_w_data,
instr_slave_w_strb,
instr_slave_w_user,
instr_slave_w_last,
instr_slave_w_ready,
instr_slave_r_data,
instr_slave_r_resp,
instr_slave_r_last,
instr_slave_r_id,
instr_slave_r_user,
instr_slave_r_ready,
instr_slave_r_valid,
instr_slave_b_resp,
instr_slave_b_id,
instr_slave_b_user,
instr_slave_b_ready,
instr_slave_b_valid,
debug_req,
debug_gnt,
debug_rvalid,
debug_addr,
debug_we,
debug_wdata,
debug_rdata,
tck_i,
trstn_i,
tms_i,
tdi_i,
tdo_o
);
//parameter AXI_ADDR_WIDTH = 32;
//parameter AXI_DATA_WIDTH = 64;
//parameter AXI_ID_MASTER_WIDTH = 10;
//parameter AXI_ID_SLAVE_WIDTH = 10;
//parameter AXI_USER_WIDTH = 0;
parameter AXI_STRB_WIDTH = AXI_DATA_WIDTH / 8;
parameter ADDR_WIDTH = AXI_ADDR_WIDTH;
//parameter DATA_RAM_SIZE = 2048;
//parameter INSTR_RAM_SIZE = 2048;
//parameter USE_ZERO_RISCY = 1;
//parameter RISCY_RV32F = 0;
//parameter ZERO_RV32M = 1;
//parameter ZERO_RV32E = 0;
parameter AXI_ID_WIDTH = AXI_ID_MASTER_WIDTH;
inout wire vccd1;
inout wire vssd1;
input wire clk;
input wire rst_n;
input wire testmode_i;
input wire fetch_enable_i;
input wire [31:0] irq_i;
output wire core_busy_o;
input wire clock_gating_i;
input wire [31:0] boot_addr_i;
output wire [AXI_ADDR_WIDTH - 1:0] core_master_aw_addr;
output wire [2:0] core_master_aw_prot;
output wire [3:0] core_master_aw_region;
output wire [7:0] core_master_aw_len;
output wire [2:0] core_master_aw_size;
output wire [1:0] core_master_aw_burst;
output wire core_master_aw_lock;
output wire [3:0] core_master_aw_cache;
output wire [3:0] core_master_aw_qos;
output wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_aw_id;
output wire [AXI_USER_WIDTH - 1:0] core_master_aw_user;
input wire core_master_aw_ready;
output wire core_master_aw_valid;
output wire [AXI_ADDR_WIDTH - 1:0] core_master_ar_addr;
output wire [2:0] core_master_ar_prot;
output wire [3:0] core_master_ar_region;
output wire [7:0] core_master_ar_len;
output wire [2:0] core_master_ar_size;
output wire [1:0] core_master_ar_burst;
output wire core_master_ar_lock;
output wire [3:0] core_master_ar_cache;
output wire [3:0] core_master_ar_qos;
output wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_ar_id;
output wire [AXI_USER_WIDTH - 1:0] core_master_ar_user;
input wire core_master_ar_ready;
output wire core_master_ar_valid;
output wire core_master_w_valid;
output wire [AXI_DATA_WIDTH - 1:0] core_master_w_data;
output wire [AXI_STRB_WIDTH - 1:0] core_master_w_strb;
output wire [AXI_USER_WIDTH - 1:0] core_master_w_user;
output wire core_master_w_last;
input wire core_master_w_ready;
input wire [AXI_DATA_WIDTH - 1:0] core_master_r_data;
input wire [1:0] core_master_r_resp;
input wire core_master_r_last;
input wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_r_id;
input wire [AXI_USER_WIDTH - 1:0] core_master_r_user;
output wire core_master_r_ready;
input wire core_master_r_valid;
input wire [1:0] core_master_b_resp;
input wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_b_id;
input wire [AXI_USER_WIDTH - 1:0] core_master_b_user;
output wire core_master_b_ready;
input wire core_master_b_valid;
output wire [AXI_ADDR_WIDTH - 1:0] dbg_master_aw_addr;
output wire [2:0] dbg_master_aw_prot;
output wire [3:0] dbg_master_aw_region;
output wire [7:0] dbg_master_aw_len;
output wire [2:0] dbg_master_aw_size;
output wire [1:0] dbg_master_aw_burst;
output wire dbg_master_aw_lock;
output wire [3:0] dbg_master_aw_cache;
output wire [3:0] dbg_master_aw_qos;
output wire [AXI_ID_MASTER_WIDTH - 1:0] dbg_master_aw_id;
output wire [AXI_USER_WIDTH - 1:0] dbg_master_aw_user;
input wire dbg_master_aw_ready;
output wire dbg_master_aw_valid;
output wire [AXI_ADDR_WIDTH - 1:0] dbg_master_ar_addr;
output wire [2:0] dbg_master_ar_prot;
output wire [3:0] dbg_master_ar_region;
output wire [7:0] dbg_master_ar_len;
output wire [2:0] dbg_master_ar_size;
output wire [1:0] dbg_master_ar_burst;
output wire dbg_master_ar_lock;
output wire [3:0] dbg_master_ar_cache;
output wire [3:0] dbg_master_ar_qos;
output wire [AXI_ID_MASTER_WIDTH - 1:0] dbg_master_ar_id;
output wire [AXI_USER_WIDTH - 1:0] dbg_master_ar_user;
input wire dbg_master_ar_ready;
output wire dbg_master_ar_valid;
output wire dbg_master_w_valid;
output wire [AXI_DATA_WIDTH - 1:0] dbg_master_w_data;
output wire [AXI_STRB_WIDTH - 1:0] dbg_master_w_strb;
output wire [AXI_USER_WIDTH - 1:0] dbg_master_w_user;
output wire dbg_master_w_last;
input wire dbg_master_w_ready;
input wire [AXI_DATA_WIDTH - 1:0] dbg_master_r_data;
input wire [1:0] dbg_master_r_resp;
input wire dbg_master_r_last;
input wire [AXI_ID_MASTER_WIDTH - 1:0] dbg_master_r_id;
input wire [AXI_USER_WIDTH - 1:0] dbg_master_r_user;
output wire dbg_master_r_ready;
input wire dbg_master_r_valid;
input wire [1:0] dbg_master_b_resp;
input wire [AXI_ID_MASTER_WIDTH - 1:0] dbg_master_b_id;
input wire [AXI_USER_WIDTH - 1:0] dbg_master_b_user;
output wire dbg_master_b_ready;
input wire dbg_master_b_valid;
input wire [AXI_ADDR_WIDTH - 1:0] data_slave_aw_addr;
input wire [2:0] data_slave_aw_prot;
input wire [3:0] data_slave_aw_region;
input wire [7:0] data_slave_aw_len;
input wire [2:0] data_slave_aw_size;
input wire [1:0] data_slave_aw_burst;
input wire data_slave_aw_lock;
input wire [3:0] data_slave_aw_cache;
input wire [3:0] data_slave_aw_qos;
input wire [AXI_ID_SLAVE_WIDTH - 1:0] data_slave_aw_id;
input wire [AXI_USER_WIDTH - 1:0] data_slave_aw_user;
output wire data_slave_aw_ready;
input wire data_slave_aw_valid;
input wire [AXI_ADDR_WIDTH - 1:0] data_slave_ar_addr;
input wire [2:0] data_slave_ar_prot;
input wire [3:0] data_slave_ar_region;
input wire [7:0] data_slave_ar_len;
input wire [2:0] data_slave_ar_size;
input wire [1:0] data_slave_ar_burst;
input wire data_slave_ar_lock;
input wire [3:0] data_slave_ar_cache;
input wire [3:0] data_slave_ar_qos;
input wire [AXI_ID_SLAVE_WIDTH - 1:0] data_slave_ar_id;
input wire [AXI_USER_WIDTH - 1:0] data_slave_ar_user;
output wire data_slave_ar_ready;
input wire data_slave_ar_valid;
input wire data_slave_w_valid;
input wire [AXI_DATA_WIDTH - 1:0] data_slave_w_data;
input wire [AXI_STRB_WIDTH - 1:0] data_slave_w_strb;
input wire [AXI_USER_WIDTH - 1:0] data_slave_w_user;
input wire data_slave_w_last;
output wire data_slave_w_ready;
output wire [AXI_DATA_WIDTH - 1:0] data_slave_r_data;
output wire [1:0] data_slave_r_resp;
output wire data_slave_r_last;
output wire [AXI_ID_SLAVE_WIDTH - 1:0] data_slave_r_id;
output wire [AXI_USER_WIDTH - 1:0] data_slave_r_user;
input wire data_slave_r_ready;
output wire data_slave_r_valid;
output wire [1:0] data_slave_b_resp;
output wire [AXI_ID_SLAVE_WIDTH - 1:0] data_slave_b_id;
output wire [AXI_USER_WIDTH - 1:0] data_slave_b_user;
input wire data_slave_b_ready;
output wire data_slave_b_valid;
input wire [AXI_ADDR_WIDTH - 1:0] instr_slave_aw_addr;
input wire [2:0] instr_slave_aw_prot;
input wire [3:0] instr_slave_aw_region;
input wire [7:0] instr_slave_aw_len;
input wire [2:0] instr_slave_aw_size;
input wire [1:0] instr_slave_aw_burst;
input wire instr_slave_aw_lock;
input wire [3:0] instr_slave_aw_cache;
input wire [3:0] instr_slave_aw_qos;
input wire [AXI_ID_SLAVE_WIDTH - 1:0] instr_slave_aw_id;
input wire [AXI_USER_WIDTH - 1:0] instr_slave_aw_user;
output wire instr_slave_aw_ready;
input wire instr_slave_aw_valid;
input wire [AXI_ADDR_WIDTH - 1:0] instr_slave_ar_addr;
input wire [2:0] instr_slave_ar_prot;
input wire [3:0] instr_slave_ar_region;
input wire [7:0] instr_slave_ar_len;
input wire [2:0] instr_slave_ar_size;
input wire [1:0] instr_slave_ar_burst;
input wire instr_slave_ar_lock;
input wire [3:0] instr_slave_ar_cache;
input wire [3:0] instr_slave_ar_qos;
input wire [AXI_ID_SLAVE_WIDTH - 1:0] instr_slave_ar_id;
input wire [AXI_USER_WIDTH - 1:0] instr_slave_ar_user;
output wire instr_slave_ar_ready;
input wire instr_slave_ar_valid;
input wire instr_slave_w_valid;
input wire [AXI_DATA_WIDTH - 1:0] instr_slave_w_data;
input wire [AXI_STRB_WIDTH - 1:0] instr_slave_w_strb;
input wire [AXI_USER_WIDTH - 1:0] instr_slave_w_user;
input wire instr_slave_w_last;
output wire instr_slave_w_ready;
output wire [AXI_DATA_WIDTH - 1:0] instr_slave_r_data;
output wire [1:0] instr_slave_r_resp;
output wire instr_slave_r_last;
output wire [AXI_ID_SLAVE_WIDTH - 1:0] instr_slave_r_id;
output wire [AXI_USER_WIDTH - 1:0] instr_slave_r_user;
input wire instr_slave_r_ready;
output wire instr_slave_r_valid;
output wire [1:0] instr_slave_b_resp;
output wire [AXI_ID_SLAVE_WIDTH - 1:0] instr_slave_b_id;
output wire [AXI_USER_WIDTH - 1:0] instr_slave_b_user;
input wire instr_slave_b_ready;
output wire instr_slave_b_valid;
input wire debug_req;
output wire debug_gnt;
output wire debug_rvalid;
input wire [15-1:0] debug_addr;
input wire debug_we;
input wire [31:0] debug_wdata;
output wire [31:0] debug_rdata;
input wire tck_i;
input wire trstn_i;
input wire tms_i;
input wire tdi_i;
output wire tdo_o;
localparam INSTR_ADDR_WIDTH = $clog2(INSTR_RAM_SIZE) + 1;
localparam DATA_ADDR_WIDTH = $clog2(DATA_RAM_SIZE);
localparam AXI_B_WIDTH = $clog2(AXI_DATA_WIDTH / 8);
wire core_instr_req;
wire core_instr_gnt;
wire core_instr_rvalid;
wire [31:0] core_instr_addr;
wire [31:0] core_instr_rdata;
wire core_lsu_req;
reg core_lsu_gnt;
wire core_lsu_rvalid;
wire [31:0] core_lsu_addr;
wire core_lsu_we;
wire [3:0] core_lsu_be;
wire [31:0] core_lsu_rdata;
wire [31:0] core_lsu_wdata;
wire core_data_req;
wire core_data_gnt;
wire core_data_rvalid;
wire [31:0] core_data_addr;
wire core_data_we;
wire [3:0] core_data_be;
wire [31:0] core_data_rdata;
wire [31:0] core_data_wdata;
wire is_axi_addr;
wire axi_mem_req;
wire [DATA_ADDR_WIDTH - 1:0] axi_mem_addr;
wire axi_mem_we;
wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_mem_be;
wire [AXI_DATA_WIDTH - 1:0] axi_mem_rdata;
wire [AXI_DATA_WIDTH - 1:0] axi_mem_wdata;
wire axi_instr_req;
wire [INSTR_ADDR_WIDTH - 1:0] axi_instr_addr;
wire axi_instr_we;
wire [(AXI_DATA_WIDTH / 8) - 1:0] axi_instr_be;
wire [AXI_DATA_WIDTH - 1:0] axi_instr_rdata;
wire [AXI_DATA_WIDTH - 1:0] axi_instr_wdata;
wire instr_mem_en;
wire [INSTR_ADDR_WIDTH - 1:0] instr_mem_addr;
wire instr_mem_we;
wire [(AXI_DATA_WIDTH / 8) - 1:0] instr_mem_be;
wire [AXI_DATA_WIDTH - 1:0] instr_mem_rdata;
wire [AXI_DATA_WIDTH - 1:0] instr_mem_wdata;
wire data_mem_en;
wire [DATA_ADDR_WIDTH - 1:0] data_mem_addr;
wire data_mem_we;
wire [(AXI_DATA_WIDTH / 8) - 1:0] data_mem_be;
wire [AXI_DATA_WIDTH - 1:0] data_mem_rdata;
wire [AXI_DATA_WIDTH - 1:0] data_mem_wdata;
reg [0:0] lsu_resp_CS;
reg [0:0] lsu_resp_NS;
wire core_axi_req;
wire core_axi_gnt;
wire core_axi_rvalid;
wire [31:0] core_axi_addr;
wire core_axi_we;
wire [3:0] core_axi_be;
wire [31:0] core_axi_rdata;
wire [31:0] core_axi_wdata;
wire [AXI_ADDR_WIDTH - 1:0] core_master_int_aw_addr;
wire [2:0] core_master_int_aw_prot;
wire [3:0] core_master_int_aw_region;
wire [7:0] core_master_int_aw_len;
wire [2:0] core_master_int_aw_size;
wire [1:0] core_master_int_aw_burst;
wire core_master_int_aw_lock;
wire [3:0] core_master_int_aw_cache;
wire [3:0] core_master_int_aw_qos;
wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_int_aw_id;
wire [AXI_USER_WIDTH - 1:0] core_master_int_aw_user;
wire core_master_int_aw_ready;
wire core_master_int_aw_valid;
wire [AXI_ADDR_WIDTH - 1:0] core_master_int_ar_addr;
wire [2:0] core_master_int_ar_prot;
wire [3:0] core_master_int_ar_region;
wire [7:0] core_master_int_ar_len;
wire [2:0] core_master_int_ar_size;
wire [1:0] core_master_int_ar_burst;
wire core_master_int_ar_lock;
wire [3:0] core_master_int_ar_cache;
wire [3:0] core_master_int_ar_qos;
wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_int_ar_id;
wire [AXI_USER_WIDTH - 1:0] core_master_int_ar_user;
wire core_master_int_ar_ready;
wire core_master_int_ar_valid;
wire core_master_int_w_valid;
wire [AXI_DATA_WIDTH - 1:0] core_master_int_w_data;
wire [AXI_STRB_WIDTH - 1:0] core_master_int_w_strb;
wire [AXI_USER_WIDTH - 1:0] core_master_int_w_user;
wire core_master_int_w_last;
wire core_master_int_w_ready;
wire [AXI_DATA_WIDTH - 1:0] core_master_int_r_data;
wire [1:0] core_master_int_r_resp;
wire core_master_int_r_last;
wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_int_r_id;
wire [AXI_USER_WIDTH - 1:0] core_master_int_r_user;
wire core_master_int_r_ready;
wire core_master_int_r_valid;
wire [1:0] core_master_int_b_resp;
wire [AXI_ID_MASTER_WIDTH - 1:0] core_master_int_b_id;
wire [AXI_USER_WIDTH - 1:0] core_master_int_b_user;
wire core_master_int_b_ready;
wire core_master_int_b_valid;
reg [4:0] irq_id;
always @(*) begin
irq_id = 1'sb0;
begin : sv2v_autoblock_1
reg signed [31:0] i;
for (i = 0; i < 32; i = i + 1)
if (irq_i[i])
irq_id = i[4:0];
end
end
generate
if (USE_ZERO_RISCY) begin : CORE
zeroriscy_core #(
.N_EXT_PERF_COUNTERS(0),
.RV32E(ZERO_RV32E),
.RV32M(ZERO_RV32M)
) RISCV_CORE(
.clk_i(clk),
.rst_ni(rst_n),
.clock_en_i(clock_gating_i),
.test_en_i(testmode_i),
.boot_addr_i(boot_addr_i),
.core_id_i(4'h0),
.cluster_id_i(6'h00),
.instr_addr_o(core_instr_addr),
.instr_req_o(core_instr_req),
.instr_rdata_i(core_instr_rdata),
.instr_gnt_i(core_instr_gnt),
.instr_rvalid_i(core_instr_rvalid),
.data_addr_o(core_lsu_addr),
.data_wdata_o(core_lsu_wdata),
.data_we_o(core_lsu_we),
.data_req_o(core_lsu_req),
.data_be_o(core_lsu_be),
.data_rdata_i(core_lsu_rdata),
.data_gnt_i(core_lsu_gnt),
.data_rvalid_i(core_lsu_rvalid),
.data_err_i(1'b0),
.irq_i(|irq_i),
.irq_id_i(irq_id),
.irq_ack_o(),
.irq_id_o(),
.debug_req_i(debug_req),
.debug_gnt_o(debug_gnt),
.debug_rvalid_o(debug_rvalid),
.debug_addr_i(debug_addr),
.debug_we_i(debug_we),
.debug_wdata_i(debug_wdata),
.debug_rdata_o(debug_rdata),
.debug_halted_o(),
.debug_halt_i(1'b0),
.debug_resume_i(1'b0),
.fetch_enable_i(fetch_enable_i),
.core_busy_o(core_busy_o),
.ext_perf_counters_i()
);
end
else begin : CORE
riscv_core #(
.N_EXT_PERF_COUNTERS(0),
.FPU(RISCY_RV32F),
.SHARED_FP(0),
.SHARED_FP_DIVSQRT(2)
) RISCV_CORE(
.clk_i(clk),
.rst_ni(rst_n),
.clock_en_i(clock_gating_i),
.test_en_i(testmode_i),
.boot_addr_i(boot_addr_i),
.core_id_i(4'h0),
.cluster_id_i(6'h00),
.instr_addr_o(core_instr_addr),
.instr_req_o(core_instr_req),
.instr_rdata_i(core_instr_rdata),
.instr_gnt_i(core_instr_gnt),
.instr_rvalid_i(core_instr_rvalid),
.data_addr_o(core_lsu_addr),
.data_wdata_o(core_lsu_wdata),
.data_we_o(core_lsu_we),
.data_req_o(core_lsu_req),
.data_be_o(core_lsu_be),
.data_rdata_i(core_lsu_rdata),
.data_gnt_i(core_lsu_gnt),
.data_rvalid_i(core_lsu_rvalid),
.data_err_i(1'b0),
.irq_i(|irq_i),
.irq_id_i(irq_id),
.irq_ack_o(),
.irq_id_o(),
.irq_sec_i(1'b0),
.sec_lvl_o(),
.debug_req_i(debug_req),
.debug_gnt_o(debug_gnt),
.debug_rvalid_o(debug_rvalid),
.debug_addr_i(debug_addr),
.debug_we_i(debug_we),
.debug_wdata_i(debug_wdata),
.debug_rdata_o(debug_rdata),
.debug_halted_o(),
.debug_halt_i(1'b0),
.debug_resume_i(1'b0),
.fetch_enable_i(fetch_enable_i),
.core_busy_o(core_busy_o),
.apu_master_req_o(),
.apu_master_ready_o(),
.apu_master_gnt_i(1'b1),
.apu_master_operands_o(),
.apu_master_op_o(),
.apu_master_type_o(),
.apu_master_flags_o(),
.apu_master_valid_i(1'sb0),
.apu_master_result_i(1'sb0),
.apu_master_flags_i(1'sb0),
.ext_perf_counters_i()
);
end
endgenerate
core2axi_wrap #(
.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
.AXI_ID_WIDTH(AXI_ID_MASTER_WIDTH),
.AXI_USER_WIDTH(AXI_USER_WIDTH),
.REGISTERED_GRANT("FALSE")
) core2axi_i(
.clk_i(clk),
.rst_ni(rst_n),
.data_req_i(core_axi_req),
.data_gnt_o(core_axi_gnt),
.data_rvalid_o(core_axi_rvalid),
.data_addr_i(core_axi_addr),
.data_we_i(core_axi_we),
.data_be_i(core_axi_be),
.data_rdata_o(core_axi_rdata),
.data_wdata_i(core_axi_wdata),
.m00_aw_addr(core_master_int_aw_addr),
.m00_aw_prot(core_master_int_aw_prot),
.m00_aw_region(core_master_int_aw_region),
.m00_aw_len(core_master_int_aw_len),
.m00_aw_size(core_master_int_aw_size),
.m00_aw_burst(core_master_int_aw_burst),
.m00_aw_lock(core_master_int_aw_lock),
.m00_aw_cache(core_master_int_aw_cache),
.m00_aw_qos(core_master_int_aw_qos),
.m00_aw_id(core_master_int_aw_id),
.m00_aw_user(core_master_int_aw_user),
.m00_aw_ready(core_master_int_aw_ready),
.m00_aw_valid(core_master_int_aw_valid),
.m00_ar_addr(core_master_int_ar_addr),
.m00_ar_prot(core_master_int_ar_prot),
.m00_ar_region(core_master_int_ar_region),
.m00_ar_len(core_master_int_ar_len),
.m00_ar_size(core_master_int_ar_size),
.m00_ar_burst(core_master_int_ar_burst),
.m00_ar_lock(core_master_int_ar_lock),
.m00_ar_cache(core_master_int_ar_cache),
.m00_ar_qos(core_master_int_ar_qos),
.m00_ar_id(core_master_int_ar_id),
.m00_ar_user(core_master_int_ar_user),
.m00_ar_ready(core_master_int_ar_ready),
.m00_ar_valid(core_master_int_ar_valid),
.m00_w_valid(core_master_int_w_valid),
.m00_w_data(core_master_int_w_data),
.m00_w_strb(core_master_int_w_strb),
.m00_w_user(core_master_int_w_user),
.m00_w_last(core_master_int_w_last),
.m00_w_ready(core_master_int_w_ready),
.m00_r_data(core_master_int_r_data),
.m00_r_resp(core_master_int_r_resp),
.m00_r_last(core_master_int_r_last),
.m00_r_id(core_master_int_r_id),
.m00_r_user(core_master_int_r_user),
.m00_r_ready(core_master_int_r_ready),
.m00_r_valid(core_master_int_r_valid),
.m00_b_resp(core_master_int_b_resp),
.m00_b_id(core_master_int_b_id),
.m00_b_user(core_master_int_b_user),
.m00_b_ready(core_master_int_b_ready),
.m00_b_valid(core_master_int_b_valid)
);
axi_slice_wrap #(
.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
.AXI_USER_WIDTH(AXI_USER_WIDTH),
.AXI_ID_WIDTH(AXI_ID_MASTER_WIDTH),
.SLICE_DEPTH(2)
) axi_slice_core2axi(
.clk_i(clk),
.rst_ni(rst_n),
.test_en_i(testmode_i),
.s00_aw_addr(core_master_int_aw_addr),
.s00_aw_prot(core_master_int_aw_prot),
.s00_aw_region(core_master_int_aw_region),
.s00_aw_len(core_master_int_aw_len),
.s00_aw_size(core_master_int_aw_size),
.s00_aw_burst(core_master_int_aw_burst),
.s00_aw_lock(core_master_int_aw_lock),
.s00_aw_cache(core_master_int_aw_cache),
.s00_aw_qos(core_master_int_aw_qos),
.s00_aw_id(core_master_int_aw_id),
.s00_aw_user(core_master_int_aw_user),
.s00_aw_ready(core_master_int_aw_ready),
.s00_aw_valid(core_master_int_aw_valid),
.s00_ar_addr(core_master_int_ar_addr),
.s00_ar_prot(core_master_int_ar_prot),
.s00_ar_region(core_master_int_ar_region),
.s00_ar_len(core_master_int_ar_len),
.s00_ar_size(core_master_int_ar_size),
.s00_ar_burst(core_master_int_ar_burst),
.s00_ar_lock(core_master_int_ar_lock),
.s00_ar_cache(core_master_int_ar_cache),
.s00_ar_qos(core_master_int_ar_qos),
.s00_ar_id(core_master_int_ar_id),
.s00_ar_user(core_master_int_ar_user),
.s00_ar_ready(core_master_int_ar_ready),
.s00_ar_valid(core_master_int_ar_valid),
.s00_w_valid(core_master_int_w_valid),
.s00_w_data(core_master_int_w_data),
.s00_w_strb(core_master_int_w_strb),
.s00_w_user(core_master_int_w_user),
.s00_w_last(core_master_int_w_last),
.s00_w_ready(core_master_int_w_ready),
.s00_r_data(core_master_int_r_data),
.s00_r_resp(core_master_int_r_resp),
.s00_r_last(core_master_int_r_last),
.s00_r_id(core_master_int_r_id),
.s00_r_user(core_master_int_r_user),
.s00_r_ready(core_master_int_r_ready),
.s00_r_valid(core_master_int_r_valid),
.s00_b_resp(core_master_int_b_resp),
.s00_b_id(core_master_int_b_id),
.s00_b_user(core_master_int_b_user),
.s00_b_ready(core_master_int_b_ready),
.s00_b_valid(core_master_int_b_valid),
.m00_aw_addr(core_master_aw_addr),
.m00_aw_prot(core_master_aw_prot),
.m00_aw_region(core_master_aw_region),
.m00_aw_len(core_master_aw_len),
.m00_aw_size(core_master_aw_size),
.m00_aw_burst(core_master_aw_burst),
.m00_aw_lock(core_master_aw_lock),
.m00_aw_cache(core_master_aw_cache),
.m00_aw_qos(core_master_aw_qos),
.m00_aw_id(core_master_aw_id),
.m00_aw_user(core_master_aw_user),
.m00_aw_ready(core_master_aw_ready),
.m00_aw_valid(core_master_aw_valid),
.m00_ar_addr(core_master_ar_addr),
.m00_ar_prot(core_master_ar_prot),
.m00_ar_region(core_master_ar_region),
.m00_ar_len(core_master_ar_len),
.m00_ar_size(core_master_ar_size),
.m00_ar_burst(core_master_ar_burst),
.m00_ar_lock(core_master_ar_lock),
.m00_ar_cache(core_master_ar_cache),
.m00_ar_qos(core_master_ar_qos),
.m00_ar_id(core_master_ar_id),
.m00_ar_user(core_master_ar_user),
.m00_ar_ready(core_master_ar_ready),
.m00_ar_valid(core_master_ar_valid),
.m00_w_valid(core_master_w_valid),
.m00_w_data(core_master_w_data),
.m00_w_strb(core_master_w_strb),
.m00_w_user(core_master_w_user),
.m00_w_last(core_master_w_last),
.m00_w_ready(core_master_w_ready),
.m00_r_data(core_master_r_data),
.m00_r_resp(core_master_r_resp),
.m00_r_last(core_master_r_last),
.m00_r_id(core_master_r_id),
.m00_r_user(core_master_r_user),
.m00_r_ready(core_master_r_ready),
.m00_r_valid(core_master_r_valid),
.m00_b_resp(core_master_b_resp),
.m00_b_id(core_master_b_id),
.m00_b_user(core_master_b_user),
.m00_b_ready(core_master_b_ready),
.m00_b_valid(core_master_b_valid)
);
assign is_axi_addr = core_lsu_addr[31:20] != 12'h001;
assign core_data_req = ~is_axi_addr & core_lsu_req;
assign core_axi_req = is_axi_addr & core_lsu_req;
assign core_data_addr = core_lsu_addr;
assign core_data_we = core_lsu_we;
assign core_data_be = core_lsu_be;
assign core_data_wdata = core_lsu_wdata;
assign core_axi_addr = core_lsu_addr;
assign core_axi_we = core_lsu_we;
assign core_axi_be = core_lsu_be;
assign core_axi_wdata = core_lsu_wdata;
always @(posedge clk or negedge rst_n)
if (rst_n == 1'b0)
lsu_resp_CS <= 1'd1;
else
lsu_resp_CS <= lsu_resp_NS;
always @(*) begin
lsu_resp_NS = lsu_resp_CS;
core_lsu_gnt = 1'b0;
if (core_axi_req) begin
core_lsu_gnt = core_axi_gnt;
lsu_resp_NS = 1'd0;
end
else if (core_data_req) begin
core_lsu_gnt = core_data_gnt;
lsu_resp_NS = 1'd1;
end
end
assign core_lsu_rdata = (lsu_resp_CS == 1'd0 ? core_axi_rdata : core_data_rdata);
assign core_lsu_rvalid = core_axi_rvalid | core_data_rvalid;
instr_ram_wrap #(
.RAM_SIZE(INSTR_RAM_SIZE),
.DATA_WIDTH(AXI_DATA_WIDTH)
) instr_mem(
.clk(clk),
.rst_n(rst_n),
.en_i(instr_mem_en),
.addr_i(instr_mem_addr),
.wdata_i(instr_mem_wdata),
.rdata_o(instr_mem_rdata),
.we_i(instr_mem_we),
.be_i(instr_mem_be),
.bypass_en_i(testmode_i)
);
axi_mem_if_SP_wrap #(
.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
.AXI_ID_WIDTH(AXI_ID_SLAVE_WIDTH),
.AXI_USER_WIDTH(AXI_USER_WIDTH),
.MEM_ADDR_WIDTH(INSTR_ADDR_WIDTH)
) instr_mem_axi_if(
.clk(clk),
.rst_n(rst_n),
.test_en_i(testmode_i),
.mem_req_o(axi_instr_req),
.mem_addr_o(axi_instr_addr),
.mem_we_o(axi_instr_we),
.mem_be_o(axi_instr_be),
.mem_rdata_i(axi_instr_rdata),
.mem_wdata_o(axi_instr_wdata),
.aw_addr(instr_slave_aw_addr),
.aw_prot(instr_slave_aw_prot),
.aw_region(instr_slave_aw_region),
.aw_len(instr_slave_aw_len),
.aw_size(instr_slave_aw_size),
.aw_burst(instr_slave_aw_burst),
.aw_lock(instr_slave_aw_lock),
.aw_cache(instr_slave_aw_cache),
.aw_qos(instr_slave_aw_qos),
.aw_id(instr_slave_aw_id),
.aw_user(instr_slave_aw_user),
.aw_ready(instr_slave_aw_ready),
.aw_valid(instr_slave_aw_valid),
.ar_addr(instr_slave_ar_addr),
.ar_prot(instr_slave_ar_prot),
.ar_region(instr_slave_ar_region),
.ar_len(instr_slave_ar_len),
.ar_size(instr_slave_ar_size),
.ar_burst(instr_slave_ar_burst),
.ar_lock(instr_slave_ar_lock),
.ar_cache(instr_slave_ar_cache),
.ar_qos(instr_slave_ar_qos),
.ar_id(instr_slave_ar_id),
.ar_user(instr_slave_ar_user),
.ar_ready(instr_slave_ar_ready),
.ar_valid(instr_slave_ar_valid),
.w_valid(instr_slave_w_valid),
.w_data(instr_slave_w_data),
.w_strb(instr_slave_w_strb),
.w_user(instr_slave_w_user),
.w_last(instr_slave_w_last),
.w_ready(instr_slave_w_ready),
.r_data(instr_slave_r_data),
.r_resp(instr_slave_r_resp),
.r_last(instr_slave_r_last),
.r_id(instr_slave_r_id),
.r_user(instr_slave_r_user),
.r_ready(instr_slave_r_ready),
.r_valid(instr_slave_r_valid),
.b_resp(instr_slave_b_resp),
.b_id(instr_slave_b_id),
.b_user(instr_slave_b_user),
.b_ready(instr_slave_b_ready),
.b_valid(instr_slave_b_valid)
);
ram_mux #(
.ADDR_WIDTH(INSTR_ADDR_WIDTH),
.IN0_WIDTH(AXI_DATA_WIDTH),
.IN1_WIDTH(32),
.OUT_WIDTH(AXI_DATA_WIDTH)
) instr_ram_mux_i(
.clk(clk),
.rst_n(rst_n),
.port0_req_i(axi_instr_req),
.port0_gnt_o(),
.port0_rvalid_o(),
.port0_addr_i({axi_instr_addr[(INSTR_ADDR_WIDTH - AXI_B_WIDTH) - 1:0], {AXI_B_WIDTH {1'b0}}}),
.port0_we_i(axi_instr_we),
.port0_be_i(axi_instr_be),
.port0_rdata_o(axi_instr_rdata),
.port0_wdata_i(axi_instr_wdata),
.port1_req_i(core_instr_req),
.port1_gnt_o(core_instr_gnt),
.port1_rvalid_o(core_instr_rvalid),
.port1_addr_i(core_instr_addr[INSTR_ADDR_WIDTH - 1:0]),
.port1_we_i(1'b0),
.port1_be_i(4'sb1),
.port1_rdata_o(core_instr_rdata),
.port1_wdata_i({AXI_DATA_WIDTH{ 1'b0 }}),
.ram_en_o(instr_mem_en),
.ram_addr_o(instr_mem_addr),
.ram_we_o(instr_mem_we),
.ram_be_o(instr_mem_be),
.ram_rdata_i(instr_mem_rdata),
.ram_wdata_o(instr_mem_wdata)
);
sp_ram_wrap #(
.RAM_SIZE(DATA_RAM_SIZE),
.DATA_WIDTH(AXI_DATA_WIDTH)
) data_mem(
`ifdef USE_POWER_PINS
.vccd1(vccd1), // User area 1 1.8V supply
.vssd1(vssd1), // User area 1 digital ground
`endif
.clk(clk),
.rstn_i(rst_n),
.en_i(data_mem_en),
.addr_i(data_mem_addr),
.wdata_i(data_mem_wdata),
.rdata_o(data_mem_rdata),
.we_i(data_mem_we),
.be_i(data_mem_be),
.bypass_en_i(testmode_i)
);
axi_mem_if_SP_wrap #(
.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
.AXI_ID_WIDTH(AXI_ID_SLAVE_WIDTH),
.AXI_USER_WIDTH(AXI_USER_WIDTH),
.MEM_ADDR_WIDTH(DATA_ADDR_WIDTH)
) data_mem_axi_if(
.clk(clk),
.rst_n(rst_n),
.test_en_i(testmode_i),
.mem_req_o(axi_mem_req),
.mem_addr_o(axi_mem_addr),
.mem_we_o(axi_mem_we),
.mem_be_o(axi_mem_be),
.mem_rdata_i(axi_mem_rdata),
.mem_wdata_o(axi_mem_wdata),
.aw_addr(data_slave_aw_addr),
.aw_prot(data_slave_aw_prot),
.aw_region(data_slave_aw_region),
.aw_len(data_slave_aw_len),
.aw_size(data_slave_aw_size),
.aw_burst(data_slave_aw_burst),
.aw_lock(data_slave_aw_lock),
.aw_cache(data_slave_aw_cache),
.aw_qos(data_slave_aw_qos),
.aw_id(data_slave_aw_id),
.aw_user(data_slave_aw_user),
.aw_ready(data_slave_aw_ready),
.aw_valid(data_slave_aw_valid),
.ar_addr(data_slave_ar_addr),
.ar_prot(data_slave_ar_prot),
.ar_region(data_slave_ar_region),
.ar_len(data_slave_ar_len),
.ar_size(data_slave_ar_size),
.ar_burst(data_slave_ar_burst),
.ar_lock(data_slave_ar_lock),
.ar_cache(data_slave_ar_cache),
.ar_qos(data_slave_ar_qos),
.ar_id(data_slave_ar_id),
.ar_user(data_slave_ar_user),
.ar_ready(data_slave_ar_ready),
.ar_valid(data_slave_ar_valid),
.w_valid(data_slave_w_valid),
.w_data(data_slave_w_data),
.w_strb(data_slave_w_strb),
.w_user(data_slave_w_user),
.w_last(data_slave_w_last),
.w_ready(data_slave_w_ready),
.r_data(data_slave_r_data),
.r_resp(data_slave_r_resp),
.r_last(data_slave_r_last),
.r_id(data_slave_r_id),
.r_user(data_slave_r_user),
.r_ready(data_slave_r_ready),
.r_valid(data_slave_r_valid),
.b_resp(data_slave_b_resp),
.b_id(data_slave_b_id),
.b_user(data_slave_b_user),
.b_ready(data_slave_b_ready),
.b_valid(data_slave_b_valid)
);
ram_mux #(
.ADDR_WIDTH(DATA_ADDR_WIDTH),
.IN0_WIDTH(AXI_DATA_WIDTH),
.IN1_WIDTH(32),
.OUT_WIDTH(AXI_DATA_WIDTH)
) data_ram_mux_i(
.clk(clk),
.rst_n(rst_n),
.port0_req_i(axi_mem_req),
.port0_gnt_o(),
.port0_rvalid_o(),
.port0_addr_i({axi_mem_addr[(DATA_ADDR_WIDTH - AXI_B_WIDTH) - 1:0], {AXI_B_WIDTH {1'b0}}}),
.port0_we_i(axi_mem_we),
.port0_be_i(axi_mem_be),
.port0_rdata_o(axi_mem_rdata),
.port0_wdata_i(axi_mem_wdata),
.port1_req_i(core_data_req),
.port1_gnt_o(core_data_gnt),
.port1_rvalid_o(core_data_rvalid),
.port1_addr_i(core_data_addr[DATA_ADDR_WIDTH - 1:0]),
.port1_we_i(core_data_we),
.port1_be_i(core_data_be),
.port1_rdata_o(core_data_rdata),
.port1_wdata_i(core_data_wdata),
.ram_en_o(data_mem_en),
.ram_addr_o(data_mem_addr),
.ram_we_o(data_mem_we),
.ram_be_o(data_mem_be),
.ram_rdata_i(data_mem_rdata),
.ram_wdata_o(data_mem_wdata)
);
adv_dbg_if #(
.NB_CORES(1),
.AXI_ADDR_WIDTH(AXI_ADDR_WIDTH),
.AXI_DATA_WIDTH(AXI_DATA_WIDTH),
.AXI_USER_WIDTH(AXI_USER_WIDTH),
.AXI_ID_WIDTH(AXI_ID_MASTER_WIDTH)
) adv_dbg_if_i(
.tms_pad_i(tms_i),
.tck_pad_i(tck_i),
.trstn_pad_i(trstn_i),
.tdi_pad_i(tdi_i),
.tdo_pad_o(tdo_o),
.test_mode_i(testmode_i),
.cpu_addr_o(),
.cpu_data_i(32'sb0),
.cpu_data_o(),
.cpu_bp_i(1'sb0),
.cpu_stall_o(),
.cpu_stb_o(),
.cpu_we_o(),
.cpu_ack_i(1'sb1),
.cpu_rst_o(),
.axi_aclk(clk),
.axi_aresetn(rst_n),
.axi_master_aw_valid(dbg_master_aw_valid),
.axi_master_aw_addr(dbg_master_aw_addr),
.axi_master_aw_prot(dbg_master_aw_prot),
.axi_master_aw_region(dbg_master_aw_region),
.axi_master_aw_len(dbg_master_aw_len),
.axi_master_aw_size(dbg_master_aw_size),
.axi_master_aw_burst(dbg_master_aw_burst),
.axi_master_aw_lock(dbg_master_aw_lock),
.axi_master_aw_cache(dbg_master_aw_cache),
.axi_master_aw_qos(dbg_master_aw_qos),
.axi_master_aw_id(dbg_master_aw_id),
.axi_master_aw_user(dbg_master_aw_user),
.axi_master_aw_ready(dbg_master_aw_ready),
.axi_master_ar_valid(dbg_master_ar_valid),
.axi_master_ar_addr(dbg_master_ar_addr),
.axi_master_ar_prot(dbg_master_ar_prot),
.axi_master_ar_region(dbg_master_ar_region),
.axi_master_ar_len(dbg_master_ar_len),
.axi_master_ar_size(dbg_master_ar_size),
.axi_master_ar_burst(dbg_master_ar_burst),
.axi_master_ar_lock(dbg_master_ar_lock),
.axi_master_ar_cache(dbg_master_ar_cache),
.axi_master_ar_qos(dbg_master_ar_qos),
.axi_master_ar_id(dbg_master_ar_id),
.axi_master_ar_user(dbg_master_ar_user),
.axi_master_ar_ready(dbg_master_ar_ready),
.axi_master_w_valid(dbg_master_w_valid),
.axi_master_w_data(dbg_master_w_data),
.axi_master_w_strb(dbg_master_w_strb),
.axi_master_w_user(dbg_master_w_user),
.axi_master_w_last(dbg_master_w_last),
.axi_master_w_ready(dbg_master_w_ready),
.axi_master_r_valid(dbg_master_r_valid),
.axi_master_r_data(dbg_master_r_data),
.axi_master_r_resp(dbg_master_r_resp),
.axi_master_r_last(dbg_master_r_last),
.axi_master_r_id(dbg_master_r_id),
.axi_master_r_user(dbg_master_r_user),
.axi_master_r_ready(dbg_master_r_ready),
.axi_master_b_valid(dbg_master_b_valid),
.axi_master_b_resp(dbg_master_b_resp),
.axi_master_b_id(dbg_master_b_id),
.axi_master_b_user(dbg_master_b_user),
.axi_master_b_ready(dbg_master_b_ready)
);
endmodule