Line 42... |
Line 42... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.3 2002/01/28 01:16:00 lampret
|
|
// Changed 'void' nop-ops instead of insn[0] to use insn[16]. Debug unit stalls the tick timer. Prepared new flag generation for add and and insns. Blocked DC/IC while they are turned off. Fixed I/D MMU SPRs layout except WAYs. TODO: smart IC invalidate, l.j 2 and TLB ways.
|
|
//
|
// Revision 1.2 2002/01/14 06:18:22 lampret
|
// Revision 1.2 2002/01/14 06:18:22 lampret
|
// Fixed mem2reg bug in FAST implementation. Updated debug unit to work with new genpc/if.
|
// Fixed mem2reg bug in FAST implementation. Updated debug unit to work with new genpc/if.
|
//
|
//
|
// Revision 1.1 2002/01/03 08:16:15 lampret
|
// Revision 1.1 2002/01/03 08:16:15 lampret
|
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
|
// New prefixes for RTL files, prefixed module names. Updated cache controllers and MMUs.
|
Line 89... |
Line 92... |
dcbiu_dat_o, dcbiu_adr_o, dcbiu_cyc_o, dcbiu_stb_o, dcbiu_we_o, dcbiu_sel_o, dcbiu_cab_o,
|
dcbiu_dat_o, dcbiu_adr_o, dcbiu_cyc_o, dcbiu_stb_o, dcbiu_we_o, dcbiu_sel_o, dcbiu_cab_o,
|
dcbiu_dat_i, dcbiu_ack_i, dcbiu_err_i,
|
dcbiu_dat_i, dcbiu_ack_i, dcbiu_err_i,
|
|
|
// Internal i/f
|
// Internal i/f
|
dc_en,
|
dc_en,
|
dcdmmu_adr_i, dcdmmu_cyc_i, dcdmmu_stb_i, dcdmmu_ci_i,
|
dcdmmu_adr_i, dcdmmu_cycstb_i, dcdmmu_ci_i,
|
dcpu_we_i, dcpu_sel_i, dcpu_tag_i, dcpu_dat_i,
|
dcpu_we_i, dcpu_sel_i, dcpu_tag_i, dcpu_dat_i,
|
dcpu_dat_o, dcpu_ack_o, dcpu_rty_o, dcdmmu_err_o, dcdmmu_tag_o,
|
dcpu_dat_o, dcpu_ack_o, dcpu_rty_o, dcdmmu_err_o, dcdmmu_tag_o,
|
|
|
// SPRs
|
// SPRs
|
spr_cs, spr_write, spr_dat_i
|
spr_cs, spr_write, spr_dat_i
|
Line 128... |
Line 131... |
//
|
//
|
// Internal I/F
|
// Internal I/F
|
//
|
//
|
input dc_en;
|
input dc_en;
|
input [31:0] dcdmmu_adr_i;
|
input [31:0] dcdmmu_adr_i;
|
input dcdmmu_cyc_i;
|
input dcdmmu_cycstb_i;
|
input dcdmmu_stb_i;
|
|
input dcdmmu_ci_i;
|
input dcdmmu_ci_i;
|
input dcpu_we_i;
|
input dcpu_we_i;
|
input [3:0] dcpu_sel_i;
|
input [3:0] dcpu_sel_i;
|
input [3:0] dcpu_tag_i;
|
input [3:0] dcpu_tag_i;
|
input [dw-1:0] dcpu_dat_i;
|
input [dw-1:0] dcpu_dat_i;
|
Line 170... |
Line 172... |
wire dc_inv;
|
wire dc_inv;
|
wire dcfsm_first_hit_ack;
|
wire dcfsm_first_hit_ack;
|
wire dcfsm_first_miss_ack;
|
wire dcfsm_first_miss_ack;
|
wire dcfsm_first_miss_err;
|
wire dcfsm_first_miss_err;
|
wire dcfsm_burst;
|
wire dcfsm_burst;
|
|
wire dcfsm_tag_we;
|
|
|
//
|
//
|
// Simple assignments
|
// Simple assignments
|
//
|
//
|
assign dcbiu_adr_o = dc_addr;
|
assign dcbiu_adr_o = dc_addr;
|
assign dc_inv = spr_cs & spr_write;
|
assign dc_inv = spr_cs & spr_write;
|
assign dctag_we = (dcfsm_biu_read & dcbiu_ack_i) | dc_inv;
|
assign dctag_we = dcfsm_tag_we | dc_inv;
|
assign dctag_addr = dc_inv ? spr_dat_i[`OR1200_DCINDXH:`OR1200_DCLS] : dc_addr[`OR1200_DCINDXH:`OR1200_DCLS];
|
assign dctag_addr = dc_inv ? spr_dat_i[`OR1200_DCINDXH:`OR1200_DCLS] : dc_addr[`OR1200_DCINDXH:`OR1200_DCLS];
|
assign dctag_en = dc_inv | dc_en;
|
assign dctag_en = dc_inv | dc_en;
|
assign dctag_v = ~dc_inv;
|
assign dctag_v = ~dc_inv;
|
|
|
//
|
//
|
Line 190... |
Line 193... |
assign dcbiu_dat_o = dcpu_dat_i;
|
assign dcbiu_dat_o = dcpu_dat_i;
|
|
|
//
|
//
|
// Bypases of the DC when DC is disabled
|
// Bypases of the DC when DC is disabled
|
//
|
//
|
assign dcbiu_cyc_o = (dc_en) ? dcfsm_biu_read | dcfsm_biu_write : dcdmmu_cyc_i;
|
assign dcbiu_cyc_o = (dc_en) ? dcfsm_biu_read | dcfsm_biu_write : dcdmmu_cycstb_i;
|
assign dcbiu_stb_o = (dc_en) ? dcfsm_biu_read | dcfsm_biu_write : dcdmmu_stb_i;
|
assign dcbiu_stb_o = (dc_en) ? dcfsm_biu_read | dcfsm_biu_write : dcdmmu_cycstb_i;
|
assign dcbiu_we_o = (dc_en) ? dcfsm_biu_write : dcpu_we_i;
|
assign dcbiu_we_o = (dc_en) ? dcfsm_biu_write : dcpu_we_i;
|
assign dcbiu_sel_o = (dc_en & dcfsm_biu_read & !dcfsm_biu_write & !dcdmmu_ci_i) ? 4'b1111 : dcpu_sel_i;
|
assign dcbiu_sel_o = (dc_en & dcfsm_biu_read & !dcfsm_biu_write & !dcdmmu_ci_i) ? 4'b1111 : dcpu_sel_i;
|
assign dcbiu_cab_o = (dc_en) ? dcfsm_burst : 1'b0;
|
assign dcbiu_cab_o = (dc_en) ? dcfsm_burst : 1'b0;
|
assign dcpu_rty_o = ~dcpu_ack_o;
|
assign dcpu_rty_o = ~dcpu_ack_o;
|
assign dcdmmu_tag_o = dcdmmu_err_o ? `OR1200_DTAG_BE : dcpu_tag_i;
|
assign dcdmmu_tag_o = dcdmmu_err_o ? `OR1200_DTAG_BE : dcpu_tag_i;
|
Line 207... |
Line 210... |
assign dcdmmu_err_o = dc_en ? dcfsm_first_miss_err : dcbiu_err_i;
|
assign dcdmmu_err_o = dc_en ? dcfsm_first_miss_err : dcbiu_err_i;
|
|
|
//
|
//
|
// Select between claddr generated by DC FSM and addr[3:2] generated by LSU
|
// Select between claddr generated by DC FSM and addr[3:2] generated by LSU
|
//
|
//
|
assign dc_addr = (dcfsm_biu_read | dcfsm_biu_write) ? saved_addr : dcdmmu_adr_i;
|
//assign dc_addr = (dcfsm_biu_read | dcfsm_biu_write) ? saved_addr : dcdmmu_adr_i;
|
|
|
//
|
//
|
// Select between input data generated by LSU or by BIU
|
// Select between input data generated by LSU or by BIU
|
//
|
//
|
assign to_dcram = (dcfsm_biu_read) ? dcbiu_dat_i : dcpu_dat_i;
|
assign to_dcram = (dcfsm_biu_read) ? dcbiu_dat_i : dcpu_dat_i;
|
Line 236... |
Line 239... |
//
|
//
|
or1200_dc_fsm or1200_dc_fsm(
|
or1200_dc_fsm or1200_dc_fsm(
|
.clk(clk),
|
.clk(clk),
|
.rst(rst),
|
.rst(rst),
|
.dc_en(dc_en),
|
.dc_en(dc_en),
|
.dcdmmu_cyc_i(dcdmmu_cyc_i),
|
.dcdmmu_cycstb_i(dcdmmu_cycstb_i),
|
.dcdmmu_stb_i(dcdmmu_stb_i),
|
|
.dcdmmu_ci_i(dcdmmu_ci_i),
|
.dcdmmu_ci_i(dcdmmu_ci_i),
|
.dcpu_we_i(dcpu_we_i),
|
.dcpu_we_i(dcpu_we_i),
|
.dcpu_sel_i(dcpu_sel_i),
|
.dcpu_sel_i(dcpu_sel_i),
|
.tagcomp_miss(tagcomp_miss),
|
.tagcomp_miss(tagcomp_miss),
|
.biudata_valid(dcbiu_ack_i),
|
.biudata_valid(dcbiu_ack_i),
|
Line 252... |
Line 254... |
.biu_read(dcfsm_biu_read),
|
.biu_read(dcfsm_biu_read),
|
.biu_write(dcfsm_biu_write),
|
.biu_write(dcfsm_biu_write),
|
.first_hit_ack(dcfsm_first_hit_ack),
|
.first_hit_ack(dcfsm_first_hit_ack),
|
.first_miss_ack(dcfsm_first_miss_ack),
|
.first_miss_ack(dcfsm_first_miss_ack),
|
.first_miss_err(dcfsm_first_miss_err),
|
.first_miss_err(dcfsm_first_miss_err),
|
.burst(dcfsm_burst)
|
.burst(dcfsm_burst),
|
|
.tag_we(dcfsm_tag_we),
|
|
.dc_addr(dc_addr)
|
);
|
);
|
|
|
//
|
//
|
// Instantiation of DC main memory
|
// Instantiation of DC main memory
|
//
|
//
|