Line 42... |
Line 42... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.4 2002/02/11 04:33:17 lampret
|
|
// Speed optimizations (removed duplicate _cyc_ and _stb_). Fixed D/IMMU cache-inhibit attr.
|
|
//
|
// Revision 1.3 2002/01/28 01:16:00 lampret
|
// 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.
|
// 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.
|
Line 87... |
Line 90... |
module or1200_dc_top(
|
module or1200_dc_top(
|
// Rst, clk and clock control
|
// Rst, clk and clock control
|
clk, rst,
|
clk, rst,
|
|
|
// External i/f
|
// External i/f
|
dcbiu_dat_o, dcbiu_adr_o, dcbiu_cyc_o, dcbiu_stb_o, dcbiu_we_o, dcbiu_sel_o, dcbiu_cab_o,
|
dcsb_dat_o, dcsb_adr_o, dcsb_cyc_o, dcsb_stb_o, dcsb_we_o, dcsb_sel_o, dcsb_cab_o,
|
dcbiu_dat_i, dcbiu_ack_i, dcbiu_err_i,
|
dcsb_dat_i, dcsb_ack_i, dcsb_err_i,
|
|
|
// Internal i/f
|
// Internal i/f
|
dc_en,
|
dc_en,
|
dcdmmu_adr_i, dcdmmu_cycstb_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,
|
Line 115... |
Line 118... |
input rst;
|
input rst;
|
|
|
//
|
//
|
// External I/F
|
// External I/F
|
//
|
//
|
output [dw-1:0] dcbiu_dat_o;
|
output [dw-1:0] dcsb_dat_o;
|
output [31:0] dcbiu_adr_o;
|
output [31:0] dcsb_adr_o;
|
output dcbiu_cyc_o;
|
output dcsb_cyc_o;
|
output dcbiu_stb_o;
|
output dcsb_stb_o;
|
output dcbiu_we_o;
|
output dcsb_we_o;
|
output [3:0] dcbiu_sel_o;
|
output [3:0] dcsb_sel_o;
|
output dcbiu_cab_o;
|
output dcsb_cab_o;
|
input [dw-1:0] dcbiu_dat_i;
|
input [dw-1:0] dcsb_dat_i;
|
input dcbiu_ack_i;
|
input dcsb_ack_i;
|
input dcbiu_err_i;
|
input dcsb_err_i;
|
|
|
//
|
//
|
// Internal I/F
|
// Internal I/F
|
//
|
//
|
input dc_en;
|
input dc_en;
|
Line 177... |
Line 180... |
wire dcfsm_tag_we;
|
wire dcfsm_tag_we;
|
|
|
//
|
//
|
// Simple assignments
|
// Simple assignments
|
//
|
//
|
assign dcbiu_adr_o = dc_addr;
|
assign dcsb_adr_o = dc_addr;
|
assign dc_inv = spr_cs & spr_write;
|
assign dc_inv = spr_cs & spr_write;
|
assign dctag_we = dcfsm_tag_we | 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;
|
|
|
//
|
//
|
// Data to BIU is from DCRAM when DC is enabled or from LSU when
|
// Data to BIU is from DCRAM when DC is enabled or from LSU when
|
// DC is disabled
|
// DC is disabled
|
//
|
//
|
assign dcbiu_dat_o = dcpu_dat_i;
|
assign dcsb_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_cycstb_i;
|
assign dcsb_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_cycstb_i;
|
assign dcsb_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 dcsb_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 dcsb_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 dcsb_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;
|
|
|
//
|
//
|
// DC/LSU normal and error termination
|
// DC/LSU normal and error termination
|
//
|
//
|
assign dcpu_ack_o = dc_en ? dcfsm_first_hit_ack | dcfsm_first_miss_ack : dcbiu_ack_i;
|
assign dcpu_ack_o = dc_en ? dcfsm_first_hit_ack | dcfsm_first_miss_ack : dcsb_ack_i;
|
assign dcdmmu_err_o = dc_en ? dcfsm_first_miss_err : dcbiu_err_i;
|
assign dcdmmu_err_o = dc_en ? dcfsm_first_miss_err : dcsb_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) ? dcsb_dat_i : dcpu_dat_i;
|
|
|
//
|
//
|
// Select between data generated by DCRAM or passed by BIU
|
// Select between data generated by DCRAM or passed by BIU
|
//
|
//
|
assign dcpu_dat_o = dcfsm_first_miss_ack | !dc_en ? dcbiu_dat_i : from_dcram;
|
assign dcpu_dat_o = dcfsm_first_miss_ack | !dc_en ? dcsb_dat_i : from_dcram;
|
|
|
//
|
//
|
// Tag comparison
|
// Tag comparison
|
//
|
//
|
always @(tag or saved_addr or tag_v) begin
|
always @(tag or saved_addr or tag_v) begin
|
Line 244... |
Line 247... |
.dcdmmu_cycstb_i(dcdmmu_cycstb_i),
|
.dcdmmu_cycstb_i(dcdmmu_cycstb_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(dcsb_ack_i),
|
.biudata_error(dcbiu_err_i),
|
.biudata_error(dcsb_err_i),
|
.start_addr(dcdmmu_adr_i),
|
.start_addr(dcdmmu_adr_i),
|
.saved_addr(saved_addr),
|
.saved_addr(saved_addr),
|
.dcram_we(dcram_we),
|
.dcram_we(dcram_we),
|
.biu_read(dcfsm_biu_read),
|
.biu_read(dcfsm_biu_read),
|
.biu_write(dcfsm_biu_write),
|
.biu_write(dcfsm_biu_write),
|