URL
https://opencores.org/ocsvn/yifive/yifive/trunk
Subversion Repositories yifive
[/] [yifive/] [trunk/] [caravel_yifive/] [verilog/] [rtl/] [syntacore/] [scr1/] [src/] [top/] [scr1_imem_router.sv] - Rev 21
Compare with Previous | Blame | View Log
/// Copyright by Syntacore LLC © 2016-2021. See LICENSE for details/// @file <scr1_imem_router.sv>/// @brief Instruction memory router///`include "scr1_memif.svh"`include "scr1_arch_description.svh"module scr1_imem_router#(parameter SCR1_ADDR_MASK = `SCR1_IMEM_AWIDTH'hFFFF0000,parameter SCR1_ADDR_PATTERN = `SCR1_IMEM_AWIDTH'h00010000)(// Control signalsinput logic rst_n,input logic clk,// Core interfaceoutput logic imem_req_ack,input logic imem_req,input logic imem_cmd,input logic [`SCR1_IMEM_AWIDTH-1:0] imem_addr,output logic [`SCR1_IMEM_DWIDTH-1:0] imem_rdata,output logic [1:0] imem_resp,// PORT0 interfaceinput logic port0_req_ack,output logic port0_req,output logic port0_cmd,output logic [`SCR1_IMEM_AWIDTH-1:0] port0_addr,input logic [`SCR1_IMEM_DWIDTH-1:0] port0_rdata,input logic [1:0] port0_resp,// PORT1 interfaceinput logic port1_req_ack,output logic port1_req,output logic port1_cmd,output logic [`SCR1_IMEM_AWIDTH-1:0] port1_addr,input logic [`SCR1_IMEM_DWIDTH-1:0] port1_rdata,input logic [1:0] port1_resp);//-------------------------------------------------------------------------------// Local types declaration//-------------------------------------------------------------------------------typedef enum logic {SCR1_FSM_ADDR,SCR1_FSM_DATA} type_scr1_fsm_e;//-------------------------------------------------------------------------------// Local signal declaration//-------------------------------------------------------------------------------type_scr1_fsm_e fsm;logic port_sel;logic port_sel_r;logic [`SCR1_IMEM_DWIDTH-1:0] sel_rdata;logic [1:0] sel_resp;logic sel_req_ack;//-------------------------------------------------------------------------------// FSM//-------------------------------------------------------------------------------assign port_sel = ((imem_addr & SCR1_ADDR_MASK) == SCR1_ADDR_PATTERN);always_ff @(negedge rst_n, posedge clk) beginif (~rst_n) beginfsm <= SCR1_FSM_ADDR;port_sel_r <= 1'b0;end else begincase (fsm)SCR1_FSM_ADDR : beginif (imem_req & sel_req_ack) beginfsm <= SCR1_FSM_DATA;port_sel_r <= port_sel;endendSCR1_FSM_DATA : begincase (sel_resp)SCR1_MEM_RESP_RDY_OK : beginif (imem_req & sel_req_ack) beginfsm <= SCR1_FSM_DATA;port_sel_r <= port_sel;end else beginfsm <= SCR1_FSM_ADDR;endendSCR1_MEM_RESP_RDY_ER : beginfsm <= SCR1_FSM_ADDR;enddefault : beginendendcaseenddefault : beginendendcaseendendalways_comb beginif ((fsm == SCR1_FSM_ADDR) | ((fsm == SCR1_FSM_DATA) & (sel_resp == SCR1_MEM_RESP_RDY_OK))) beginsel_req_ack = (port_sel) ? port1_req_ack : port0_req_ack;end else beginsel_req_ack = 1'b0;endendassign sel_rdata = (port_sel_r) ? port1_rdata : port0_rdata;assign sel_resp = (port_sel_r) ? port1_resp : port0_resp;//-------------------------------------------------------------------------------// Interface to core//-------------------------------------------------------------------------------assign imem_req_ack = sel_req_ack;assign imem_rdata = sel_rdata;assign imem_resp = sel_resp;//-------------------------------------------------------------------------------// Interface to PORT0//-------------------------------------------------------------------------------always_comb beginport0_req = 1'b0;case (fsm)SCR1_FSM_ADDR : beginport0_req = imem_req & ~port_sel;endSCR1_FSM_DATA : beginif (sel_resp == SCR1_MEM_RESP_RDY_OK) beginport0_req = imem_req & ~port_sel;endenddefault : beginendendcaseend`ifdef SCR1_XPROP_ENassign port0_cmd = (~port_sel) ? imem_cmd : SCR1_MEM_CMD_ERROR;assign port0_addr = (~port_sel) ? imem_addr : 'x;`else // SCR1_XPROP_ENassign port0_cmd = imem_cmd ;assign port0_addr = imem_addr;`endif // SCR1_XPROP_EN//-------------------------------------------------------------------------------// Interface to PORT1//-------------------------------------------------------------------------------always_comb beginport1_req = 1'b0;case (fsm)SCR1_FSM_ADDR : beginport1_req = imem_req & port_sel;endSCR1_FSM_DATA : beginif (sel_resp == SCR1_MEM_RESP_RDY_OK) beginport1_req = imem_req & port_sel;endenddefault : beginendendcaseend`ifdef SCR1_XPROP_ENassign port1_cmd = (port_sel) ? imem_cmd : SCR1_MEM_CMD_ERROR;assign port1_addr = (port_sel) ? imem_addr : 'x;`else // SCR1_XPROP_ENassign port1_cmd = imem_cmd ;assign port1_addr = imem_addr;`endif // SCR1_XPROP_EN`ifdef SCR1_TRGT_SIMULATION//-------------------------------------------------------------------------------// Assertion//-------------------------------------------------------------------------------SCR1_SVA_IMEM_RT_XCHECK : assert property (@(negedge clk) disable iff (~rst_n)imem_req |-> !$isunknown({port_sel, imem_cmd})) else $error("IMEM router Error: unknown values");`endif // SCR1_TRGT_SIMULATIONendmodule : scr1_imem_router
