Line 42... |
Line 42... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// 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.
|
|
//
|
// 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.
|
//
|
//
|
// Revision 1.6 2001/10/21 17:57:16 lampret
|
// Revision 1.6 2001/10/21 17:57:16 lampret
|
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
|
// Removed params from generic_XX.v. Added translate_off/on in sprs.v and id.v. Removed spr_addr from dc.v and ic.v. Fixed CR+LF.
|
Line 147... |
Line 150... |
wire dtlb_swe;
|
wire dtlb_swe;
|
wire dtlb_sre;
|
wire dtlb_sre;
|
wire [31:0] dtlb_dat_o;
|
wire [31:0] dtlb_dat_o;
|
wire dtlb_en;
|
wire dtlb_en;
|
wire dtlb_ci;
|
wire dtlb_ci;
|
wire dtlb_done;
|
reg dtlb_done;
|
wire fault;
|
wire fault;
|
wire miss;
|
wire miss;
|
reg dcpu_cyc_dlyd;
|
|
reg dcpu_stb_dlyd;
|
|
|
|
//
|
//
|
// Implemented bits inside match and translate registers
|
// Implemented bits inside match and translate registers
|
//
|
//
|
// dtlbwYmrX: vpn 31-10 v 0
|
// dtlbwYmrX: vpn 31-10 v 0
|
Line 177... |
Line 178... |
assign dcdmmu_adr_o = dcpu_adr_i;
|
assign dcdmmu_adr_o = dcpu_adr_i;
|
assign dcpu_tag_o = dcdmmu_tag_i;
|
assign dcpu_tag_o = dcdmmu_tag_i;
|
assign dcdmmu_cyc_o = dcpu_cyc_i;
|
assign dcdmmu_cyc_o = dcpu_cyc_i;
|
assign dcdmmu_stb_o = dcpu_stb_i;
|
assign dcdmmu_stb_o = dcpu_stb_i;
|
assign dcpu_err_o = dcdmmu_err_i;
|
assign dcpu_err_o = dcdmmu_err_i;
|
assign dcdmmu_ci_o = !dcpu_adr_i[30];
|
assign dcdmmu_ci_o = dcpu_adr_i[31];
|
|
|
`else
|
`else
|
|
|
//
|
//
|
// DTLB SPR access
|
// DTLB SPR access
|
Line 206... |
Line 207... |
// dcpu_err_o
|
// dcpu_err_o
|
//
|
//
|
assign dcpu_err_o = miss | fault | dcdmmu_err_i;
|
assign dcpu_err_o = miss | fault | dcdmmu_err_i;
|
|
|
//
|
//
|
// Delay WISHBONE control signals in case DC is disabled and DMMU is
|
// Assert dtlb_done one clock cycle after new address and dtlb_en must be active.
|
// enabled to prevent premature external BIU access.
|
|
//
|
//
|
always @(posedge rst or posedge clk)
|
always @(posedge clk or posedge rst)
|
if (rst)
|
|
dcpu_cyc_dlyd <= #1 1'b0;
|
|
else
|
|
dcpu_cyc_dlyd <= #1 ~(miss | fault) & dcpu_cyc_i;
|
|
always @(posedge rst or posedge clk)
|
|
if (rst)
|
if (rst)
|
dcpu_stb_dlyd <= #1 1'b0;
|
dtlb_done <= #1 1'b0;
|
|
else if (dtlb_en)
|
|
dtlb_done <= #1 dcpu_cyc_i;
|
else
|
else
|
dcpu_stb_dlyd <= #1 ~(miss | fault) & dcpu_stb_i;
|
dtlb_done <= #1 1'b0;
|
|
|
|
|
//
|
//
|
// Cut transfer if something goes wrong with translation. If DC is disabled,
|
// Cut transfer if something goes wrong with translation. If DC is disabled,
|
// use delayed signals.
|
// use delayed signals.
|
//
|
//
|
assign dcdmmu_cyc_o = (!dc_en & dmmu_en) ? ~(miss | fault) & dcpu_cyc_dlyd : (miss | fault) ? 1'b0 : dcpu_cyc_i;
|
assign dcdmmu_cyc_o = (!dc_en & dmmu_en) ? ~(miss | fault) & dtlb_done & dcpu_cyc_i : (miss | fault) ? 1'b0 : dcpu_cyc_i;
|
assign dcdmmu_stb_o = (!dc_en & dmmu_en) ? ~(miss | fault) & dcpu_stb_dlyd : (miss | fault) ? 1'b0 : dcpu_stb_i;
|
assign dcdmmu_stb_o = (!dc_en & dmmu_en) ? ~(miss | fault) & dtlb_done & dcpu_stb_i : (miss | fault) ? 1'b0 : dcpu_stb_i;
|
|
|
//
|
//
|
// Cache Inhibit
|
// Cache Inhibit
|
//
|
//
|
assign dcdmmu_ci_o = dmmu_en ? dtlb_done & dtlb_ci : 1'b0;
|
assign dcdmmu_ci_o = dmmu_en ? dtlb_done & dtlb_ci : dcpu_adr_i[31];
|
|
|
//
|
//
|
// Physical address is either translated virtual address or
|
// Physical address is either translated virtual address or
|
// simply equal when DMMU is disabled
|
// simply equal when DMMU is disabled
|
//
|
//
|
Line 246... |
Line 244... |
assign spr_dat_o = dtlb_spr_access ? dtlb_dat_o : 32'h00000000;
|
assign spr_dat_o = dtlb_spr_access ? dtlb_dat_o : 32'h00000000;
|
|
|
//
|
//
|
// Page fault exception logic
|
// Page fault exception logic
|
//
|
//
|
assign fault = dtlb_en & dtlb_done &
|
assign fault = dtlb_done &
|
( (!dcpu_we_i & !supv & !dtlb_ure) // Load in user mode not enabled
|
( (!dcpu_we_i & !supv & !dtlb_ure) // Load in user mode not enabled
|
|| (!dcpu_we_i & supv & !dtlb_sre) // Load in supv mode not enabled
|
|| (!dcpu_we_i & supv & !dtlb_sre) // Load in supv mode not enabled
|
|| (dcpu_we_i & !supv & !dtlb_uwe) // Store in user mode not enabled
|
|| (dcpu_we_i & !supv & !dtlb_uwe) // Store in user mode not enabled
|
|| (dcpu_we_i & supv & !dtlb_swe) ); // Store in supv mode not enabled
|
|| (dcpu_we_i & supv & !dtlb_swe) ); // Store in supv mode not enabled
|
|
|
//
|
//
|
// TLB Miss exception logic
|
// TLB Miss exception logic
|
//
|
//
|
assign miss = dtlb_en & dtlb_done & !dtlb_hit;
|
assign miss = dtlb_done & !dtlb_hit;
|
|
|
//
|
//
|
// DTLB Enable
|
// DTLB Enable
|
//
|
//
|
assign dtlb_en = dmmu_en & dcpu_cyc_i & dcpu_stb_i;
|
assign dtlb_en = dmmu_en & dcpu_cyc_i & dcpu_stb_i;
|
Line 280... |
Line 278... |
.uwe(dtlb_uwe),
|
.uwe(dtlb_uwe),
|
.ure(dtlb_ure),
|
.ure(dtlb_ure),
|
.swe(dtlb_swe),
|
.swe(dtlb_swe),
|
.sre(dtlb_sre),
|
.sre(dtlb_sre),
|
.ci(dtlb_ci),
|
.ci(dtlb_ci),
|
.done(dtlb_done),
|
|
|
|
// SPR access
|
// SPR access
|
.spr_cs(dtlb_spr_access),
|
.spr_cs(dtlb_spr_access),
|
.spr_write(spr_write),
|
.spr_write(spr_write),
|
.spr_addr(spr_addr),
|
.spr_addr(spr_addr),
|