// $Id: aeMB_core.v,v 1.9 2007-11-23 14:06:41 sybreon Exp $
|
// $Id: aeMB_core.v,v 1.9 2007-11-23 14:06:41 sybreon Exp $
|
//
|
//
|
// AEMB 32'bit RISC MICROPROCESSOR CORE
|
// AEMB 32'bit RISC MICROPROCESSOR CORE
|
//
|
//
|
// Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
|
// Copyright (C) 2004-2007 Shawn Tan Ser Ngiap <shawn.tan@aeste.net>
|
//
|
//
|
// This file is part of AEMB.
|
// This file is part of AEMB.
|
//
|
//
|
// AEMB is free software: you can redistribute it and/or modify it
|
// AEMB is free software: you can redistribute it and/or modify it
|
// under the terms of the GNU Lesser General Public License as
|
// under the terms of the GNU Lesser General Public License as
|
// published by the Free Software Foundation, either version 3 of the
|
// published by the Free Software Foundation, either version 3 of the
|
// License, or (at your option) any later version.
|
// License, or (at your option) any later version.
|
//
|
//
|
// AEMB is distributed in the hope that it will be useful, but WITHOUT
|
// AEMB is distributed in the hope that it will be useful, but WITHOUT
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
// Public License for more details.
|
// Public License for more details.
|
//
|
//
|
// You should have received a copy of the GNU Lesser General Public
|
// You should have received a copy of the GNU Lesser General Public
|
// License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
|
// License along with AEMB. If not, see <http://www.gnu.org/licenses/>.
|
//
|
//
|
// HISTORY
|
// HISTORY
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
// Revision 1.8 2007/10/22 19:12:59 sybreon
|
// Revision 1.8 2007/10/22 19:12:59 sybreon
|
// Made some changes to the interrupt control. In some cases, the interrupt logic waits forever and doesn't execute. Bug was discovered by M. Ettus.
|
// Made some changes to the interrupt control. In some cases, the interrupt logic waits forever and doesn't execute. Bug was discovered by M. Ettus.
|
//
|
//
|
// Revision 1.7 2007/05/30 18:44:30 sybreon
|
// Revision 1.7 2007/05/30 18:44:30 sybreon
|
// Added interrupt support.
|
// Added interrupt support.
|
//
|
//
|
// Revision 1.6 2007/05/17 09:08:21 sybreon
|
// Revision 1.6 2007/05/17 09:08:21 sybreon
|
// Removed asynchronous reset signal.
|
// Removed asynchronous reset signal.
|
//
|
//
|
// Revision 1.5 2007/04/27 00:23:55 sybreon
|
// Revision 1.5 2007/04/27 00:23:55 sybreon
|
// Added code documentation.
|
// Added code documentation.
|
// Improved size & speed of rtl/verilog/aeMB_aslu.v
|
// Improved size & speed of rtl/verilog/aeMB_aslu.v
|
//
|
//
|
// Revision 1.4 2007/04/25 22:15:04 sybreon
|
// Revision 1.4 2007/04/25 22:15:04 sybreon
|
// Added support for 8-bit and 16-bit data types.
|
// Added support for 8-bit and 16-bit data types.
|
//
|
//
|
// Revision 1.3 2007/04/11 04:30:43 sybreon
|
// Revision 1.3 2007/04/11 04:30:43 sybreon
|
// Added pipeline stalling from incomplete bus cycles.
|
// Added pipeline stalling from incomplete bus cycles.
|
// Separated sync and async portions of code.
|
// Separated sync and async portions of code.
|
//
|
//
|
// Revision 1.2 2007/04/04 06:13:23 sybreon
|
// Revision 1.2 2007/04/04 06:13:23 sybreon
|
// Removed unused signals
|
// Removed unused signals
|
//
|
//
|
// Revision 1.1 2007/03/09 17:52:17 sybreon
|
// Revision 1.1 2007/03/09 17:52:17 sybreon
|
// initial import
|
// initial import
|
//
|
//
|
|
|
|
|
module aeMB_core (/*AUTOARG*/
|
module aeMB_core (/*AUTOARG*/
|
// Outputs
|
// Outputs
|
iwb_stb_o, iwb_adr_o, fsl_wre_o, fsl_tag_o, fsl_stb_o, fsl_dat_o,
|
iwb_stb_o, iwb_adr_o, fsl_wre_o, fsl_tag_o, fsl_stb_o, fsl_dat_o,
|
fsl_adr_o, dwb_wre_o, dwb_stb_o, dwb_sel_o, dwb_dat_o, dwb_adr_o,
|
fsl_adr_o, dwb_wre_o, dwb_stb_o, dwb_sel_o, dwb_dat_o, dwb_adr_o,
|
// Inputs
|
// Inputs
|
sys_rst_i, sys_int_i, sys_clk_i, iwb_dat_i, iwb_ack_i, fsl_dat_i,
|
sys_rst_i, sys_int_i, sys_clk_i, iwb_dat_i, iwb_ack_i, fsl_dat_i,
|
fsl_ack_i, dwb_dat_i, dwb_ack_i
|
fsl_ack_i, dwb_dat_i, dwb_ack_i
|
);
|
);
|
// Instruction WB address space
|
// Instruction WB address space
|
parameter ISIZ = 32;
|
parameter ISIZ = 32;
|
// Data WB address space
|
// Data WB address space
|
parameter DSIZ = 32;
|
parameter DSIZ = 32;
|
// Multiplier
|
// Multiplier
|
parameter MUL = 1;
|
parameter MUL = 1;
|
// Barrel Shifter
|
// Barrel Shifter
|
parameter BSF = 1;
|
parameter BSF = 1;
|
|
|
/*AUTOOUTPUT*/
|
/*AUTOOUTPUT*/
|
// Beginning of automatic outputs (from unused autoinst outputs)
|
// Beginning of automatic outputs (from unused autoinst outputs)
|
output [DSIZ-1:2] dwb_adr_o; // From edk32 of aeMB_edk32.v
|
output [DSIZ-1:2] dwb_adr_o; // From edk32 of aeMB_edk32.v
|
output [31:0] dwb_dat_o; // From edk32 of aeMB_edk32.v
|
output [31:0] dwb_dat_o; // From edk32 of aeMB_edk32.v
|
output [3:0] dwb_sel_o; // From edk32 of aeMB_edk32.v
|
output [3:0] dwb_sel_o; // From edk32 of aeMB_edk32.v
|
output dwb_stb_o; // From edk32 of aeMB_edk32.v
|
output dwb_stb_o; // From edk32 of aeMB_edk32.v
|
output dwb_wre_o; // From edk32 of aeMB_edk32.v
|
output dwb_wre_o; // From edk32 of aeMB_edk32.v
|
output [6:2] fsl_adr_o; // From edk32 of aeMB_edk32.v
|
output [6:2] fsl_adr_o; // From edk32 of aeMB_edk32.v
|
output [31:0] fsl_dat_o; // From edk32 of aeMB_edk32.v
|
output [31:0] fsl_dat_o; // From edk32 of aeMB_edk32.v
|
output fsl_stb_o; // From edk32 of aeMB_edk32.v
|
output fsl_stb_o; // From edk32 of aeMB_edk32.v
|
output [1:0] fsl_tag_o; // From edk32 of aeMB_edk32.v
|
output [1:0] fsl_tag_o; // From edk32 of aeMB_edk32.v
|
output fsl_wre_o; // From edk32 of aeMB_edk32.v
|
output fsl_wre_o; // From edk32 of aeMB_edk32.v
|
output [ISIZ-1:2] iwb_adr_o; // From edk32 of aeMB_edk32.v
|
output [ISIZ-1:2] iwb_adr_o; // From edk32 of aeMB_edk32.v
|
output iwb_stb_o; // From edk32 of aeMB_edk32.v
|
output iwb_stb_o; // From edk32 of aeMB_edk32.v
|
// End of automatics
|
// End of automatics
|
/*AUTOINPUT*/
|
/*AUTOINPUT*/
|
// Beginning of automatic inputs (from unused autoinst inputs)
|
// Beginning of automatic inputs (from unused autoinst inputs)
|
input dwb_ack_i; // To edk32 of aeMB_edk32.v
|
input dwb_ack_i; // To edk32 of aeMB_edk32.v
|
input [31:0] dwb_dat_i; // To edk32 of aeMB_edk32.v
|
input [31:0] dwb_dat_i; // To edk32 of aeMB_edk32.v
|
input fsl_ack_i; // To edk32 of aeMB_edk32.v
|
input fsl_ack_i; // To edk32 of aeMB_edk32.v
|
input [31:0] fsl_dat_i; // To edk32 of aeMB_edk32.v
|
input [31:0] fsl_dat_i; // To edk32 of aeMB_edk32.v
|
input iwb_ack_i; // To edk32 of aeMB_edk32.v
|
input iwb_ack_i; // To edk32 of aeMB_edk32.v
|
input [31:0] iwb_dat_i; // To edk32 of aeMB_edk32.v
|
input [31:0] iwb_dat_i; // To edk32 of aeMB_edk32.v
|
input sys_clk_i; // To edk32 of aeMB_edk32.v
|
input sys_clk_i; // To edk32 of aeMB_edk32.v
|
input sys_int_i; // To edk32 of aeMB_edk32.v
|
input sys_int_i; // To edk32 of aeMB_edk32.v
|
input sys_rst_i; // To edk32 of aeMB_edk32.v
|
input sys_rst_i; // To edk32 of aeMB_edk32.v
|
// End of automatics
|
// End of automatics
|
/*AUTOWIRE*/
|
/*AUTOWIRE*/
|
|
|
// INSTANTIATIONS /////////////////////////////////////////////////////////////////
|
// INSTANTIATIONS /////////////////////////////////////////////////////////////////
|
|
|
/*
|
/*
|
aeMB_edk32 AUTO_TEMPLATE (
|
aeMB_edk32 AUTO_TEMPLATE (
|
.dwb_adr_o(dwb_adr_o[DSIZ-1:2]),
|
.dwb_adr_o(dwb_adr_o[DSIZ-1:2]),
|
.iwb_adr_o(iwb_adr_o[ISIZ-1:2]),
|
.iwb_adr_o(iwb_adr_o[ISIZ-1:2]),
|
);
|
);
|
*/
|
*/
|
|
|
aeMB_edk32 #(ISIZ, DSIZ, MUL, BSF)
|
aeMB_edk32 #(ISIZ, DSIZ, MUL, BSF)
|
edk32 (/*AUTOINST*/
|
edk32 (/*AUTOINST*/
|
// Outputs
|
// Outputs
|
.dwb_adr_o (dwb_adr_o[DSIZ-1:2]), // Templated
|
.dwb_adr_o (dwb_adr_o[DSIZ-1:2]), // Templated
|
.dwb_dat_o (dwb_dat_o[31:0]),
|
.dwb_dat_o (dwb_dat_o[31:0]),
|
.dwb_sel_o (dwb_sel_o[3:0]),
|
.dwb_sel_o (dwb_sel_o[3:0]),
|
.dwb_stb_o (dwb_stb_o),
|
.dwb_stb_o (dwb_stb_o),
|
.dwb_wre_o (dwb_wre_o),
|
.dwb_wre_o (dwb_wre_o),
|
.fsl_adr_o (fsl_adr_o[6:2]),
|
.fsl_adr_o (fsl_adr_o[6:2]),
|
.fsl_dat_o (fsl_dat_o[31:0]),
|
.fsl_dat_o (fsl_dat_o[31:0]),
|
.fsl_stb_o (fsl_stb_o),
|
.fsl_stb_o (fsl_stb_o),
|
.fsl_tag_o (fsl_tag_o[1:0]),
|
.fsl_tag_o (fsl_tag_o[1:0]),
|
.fsl_wre_o (fsl_wre_o),
|
.fsl_wre_o (fsl_wre_o),
|
.iwb_adr_o (iwb_adr_o[ISIZ-1:2]), // Templated
|
.iwb_adr_o (iwb_adr_o[ISIZ-1:2]), // Templated
|
.iwb_stb_o (iwb_stb_o),
|
.iwb_stb_o (iwb_stb_o),
|
// Inputs
|
// Inputs
|
.dwb_ack_i (dwb_ack_i),
|
.dwb_ack_i (dwb_ack_i),
|
.dwb_dat_i (dwb_dat_i[31:0]),
|
.dwb_dat_i (dwb_dat_i[31:0]),
|
.fsl_ack_i (fsl_ack_i),
|
.fsl_ack_i (fsl_ack_i),
|
.fsl_dat_i (fsl_dat_i[31:0]),
|
.fsl_dat_i (fsl_dat_i[31:0]),
|
.iwb_ack_i (iwb_ack_i),
|
.iwb_ack_i (iwb_ack_i),
|
.iwb_dat_i (iwb_dat_i[31:0]),
|
.iwb_dat_i (iwb_dat_i[31:0]),
|
.sys_int_i (sys_int_i),
|
.sys_int_i (sys_int_i),
|
.sys_clk_i (sys_clk_i),
|
.sys_clk_i (sys_clk_i),
|
.sys_rst_i (sys_rst_i));
|
.sys_rst_i (sys_rst_i));
|
|
|
|
|
endmodule // aeMB_core
|
endmodule // aeMB_core
|
|
|