OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v7/] [rtl/] [twoway/] [FT64_TLB.v] - Diff between revs 60 and 66

Show entire file | Details | Blame | View Log

Rev 60 Rev 66
Line 1... Line 1...
`include "FT64_defines.vh"
`include "FT64_defines.vh"
`include "FT64_config.vh"
`include "FT64_config.vh"
//=============================================================================
//=============================================================================
//        __
//        __
//   \\__/ o\    (C) 2011-2018  Robert Finch, Waterloo
//   \\__/ o\    (C) 2011-2019  Robert Finch, Waterloo
//    \  __ /    All rights reserved.
//    \  __ /    All rights reserved.
//     \/_//     robfinch<remove>@finitron.ca
//     \/_//     robfinch<remove>@finitron.ca
//       ||
//       ||
//  
//  
//      FT64_TLB.v
//      FT64_TLB.v
Line 25... Line 25...
//                                                                          
//                                                                          
//
//
// TLB
// TLB
// The TLB contains 256 entries, that are 16 way set associative.
// The TLB contains 256 entries, that are 16 way set associative.
// The TLB is shared between the instruction and data streams.
// The TLB is shared between the instruction and data streams.
 
// The code is carefully constructed to not require reset signals.
//
//
//=============================================================================
//=============================================================================
//
//
`define TLBMissPage             {DBW-13{1'b1}}
`define TLBMissPage             {DBW-13{1'b1}}
 
 
module FT64_TLB(rst, clk, ld, done, idle, ol,
module FT64_TLB(clk, ld, done, idle, ol,
        ASID, op, regno, dati, dato,
        ASID, op, regno, dati, dato,
        uncached,
        uncached,
        icl_i, cyc_i, we_i, vadr_i, cyc_o, we_o, padr_o,
        icl_i, cyc_i, we_i, vadr_i, cyc_o, we_o, padr_o,
        wrv_o, rdv_o, exv_o,
        wrv_o, rdv_o, exv_o,
        TLBMiss, HTLBVirtPageo);
        TLBMiss, HTLBVirtPageo);
Line 48... Line 49...
parameter INC1 = 4'd2;
parameter INC1 = 4'd2;
parameter INC2 = 4'd3;
parameter INC2 = 4'd3;
parameter INC3 = 4'd4;
parameter INC3 = 4'd4;
parameter AGE1 = 4'd5;
parameter AGE1 = 4'd5;
parameter AGE2 = 4'd6;
parameter AGE2 = 4'd6;
input rst;
 
input clk;
input clk;
input ld;
input ld;
output done;
output done;
output idle;
output idle;
input [1:0] ol;                                  // operating level
input [1:0] ol;                                  // operating level
input [ABW-1:0] vadr_i;
input [ABW-1:0] vadr_i;
output reg [ABW-1:0] padr_o;
output reg [ABW-1:0] padr_o = 64'hFFFFFFFFFFFC0100;
output uncached;
output uncached;
 
 
input icl_i;
input icl_i;
input cyc_i;
input cyc_i;
input we_i;
input we_i;
Line 76... Line 76...
output TLBMiss;
output TLBMiss;
output [DBW-1:0] HTLBVirtPageo;
output [DBW-1:0] HTLBVirtPageo;
 
 
integer n;
integer n;
 
 
reg [3:0] state;
reg [1:0] state = IDLE;
assign done = state==(IDLE && !ld) || state==TWO;
assign done = state==(IDLE && !ld) || state==TWO;
assign idle = state==IDLE && !ld;
assign idle = state==IDLE && !ld;
 
 
// Holding registers
// Holding registers
// These allow the TLB to updated in a single cycle as a unit
// These allow the TLB to updated in a single cycle as a unit
Line 95... Line 95...
reg [7:0] HTLBPL;
reg [7:0] HTLBPL;
reg [2:0] HTLBPageSize;
reg [2:0] HTLBPageSize;
reg HTLBValid;
reg HTLBValid;
reg [ABW-1:0] miss_addr;
reg [ABW-1:0] miss_addr;
 
 
reg TLBenabled;
reg TLBenabled = 1'b0;
reg [7:0] i;
reg [7:0] i = 8'h00;
reg [DBW-1:0] Index;
reg [DBW-1:0] Index;
reg [3:0] Random;
reg [3:0] Random = 4'hF;
reg [3:0] Wired;
reg [3:0] Wired = 4'd0;
reg [2:0] PageSize;
reg [2:0] PageSize;
reg [15:0] Match;
reg [15:0] Match;
 
 
reg [4:0] q;
reg [4:0] q;
wire doddpage;
wire doddpage;
Line 118... Line 118...
reg [7:0] TLBPL [ENTRIES-1:0];
reg [7:0] TLBPL [ENTRIES-1:0];
reg [2:0] TLBPageSize [255:0];
reg [2:0] TLBPageSize [255:0];
reg [ENTRIES-1:0] TLBValid;
reg [ENTRIES-1:0] TLBValid;
reg [DBW-1:0] imiss_addr;
reg [DBW-1:0] imiss_addr;
reg [DBW-1:0] dmiss_addr;
reg [DBW-1:0] dmiss_addr;
reg [DBW-1:0] PageTblAddr;
reg [DBW-1:0] PageTblAddr = {DBW{1'b0}};
reg [DBW-1:0] PageTblCtrl;
reg [DBW-1:0] PageTblCtrl = {DBW{1'b0}};
 
 
reg [23:0] age_lmt;
reg [23:0] age_lmt = 24'd20000;
reg [23:0] age_ctr;
reg [23:0] age_ctr = 24'd0;
wire age_tick = age_ctr < 24'd5;
wire age_tick = age_ctr < 24'd5;
reg cyc_en, age_en;
reg cyc_en = 1'b1, age_en = 1'b1;
reg [3:0] ar_state;
reg [3:0] ar_state = IDLE;
reg ar_wr;
reg ar_wr = 1'b0;
reg [7:0] age_adr, ar_adr;
reg [7:0] age_adr = 8'h00, ar_adr = 8'h00;
reg [32:0] count;
reg [32:0] count;
reg [31:0] ar_dati;
reg [31:0] ar_dati;
wire [31:0] ar_dato;
wire [31:0] ar_dato;
reg [31:0] ar_cdato;
reg [31:0] ar_cdato;
reg getset_age;
reg getset_age;
reg doLoad;
reg doLoad = 1'b0;
 
 
/*
/*
initial begin
initial begin
        for (n = 0; n < ENTRIES; n = n + 1)
        for (n = 0; n < ENTRIES; n = n + 1)
        begin
        begin
Line 223... Line 223...
  .o0(tlbXo0),
  .o0(tlbXo0),
  .o1(tlbXo1)
  .o1(tlbXo1)
);
);
 
 
always @(posedge clk)
always @(posedge clk)
if (rst) begin
begin
        age_ctr <= 24'd0;
        // age_ctr > age_lmt when counter hits -1, saves comparing to zero as well
end
        if (age_ctr > age_lmt)
else begin
 
        if (age_ctr==24'd0)
 
                age_ctr <= age_lmt;
                age_ctr <= age_lmt;
        else
        else
                age_ctr <= age_ctr - 4'd1;
                age_ctr <= age_ctr - 4'd1;
end
end
 
 
// Handle Random register
// Handle Random register
always @(posedge clk)
always @(posedge clk)
if (rst) begin
begin
        Random <= 4'hF;
 
end
 
else begin
 
        if (Random==Wired)
        if (Random==Wired)
    Random <= 4'hF;
    Random <= 4'hF;
  else
  else
    Random <= Random - 4'd1;
    Random <= Random - 4'd1;
  // Why would we want to update since random changes on the next clock
  // Why would we want to update since random changes on the next clock
Line 252... Line 247...
      Random <= dati[3:0];
      Random <= dati[3:0];
  end
  end
end
end
 
 
always @(posedge clk)
always @(posedge clk)
if (rst) begin
begin
        state <= IDLE;
 
end
 
else begin
 
case(state)
case(state)
IDLE:
IDLE:
        if (ld)
        if (ld)
                state <= ONE;
                state <= ONE;
ONE:
ONE:
Line 276... Line 268...
endcase
endcase
end
end
 
 
// Set index to page table
// Set index to page table
always @(posedge clk)
always @(posedge clk)
if (rst) begin
 
  i <= 8'd0;
 
end
 
else begin
 
        if (state==ONE) begin
        if (state==ONE) begin
    case(op)
    case(op)
    `TLB_RD,`TLB_WI:
    `TLB_RD,`TLB_WI:
      i <= {Index[7:4],(HTLBVirtPage >> {HTLBPageSize,1'b0}) & 4'hF};
      i <= {Index[7:4],(HTLBVirtPage >> {HTLBPageSize,1'b0}) & 4'hF};
    `TLB_WR:
    `TLB_WR:
      i <= {Random,(HTLBVirtPage >> {HTLBPageSize,1'b0}) & 4'hF};
      i <= {Random,(HTLBVirtPage >> {HTLBPageSize,1'b0}) & 4'hF};
    endcase
    endcase
  end
  end
end
 
 
 
always @(posedge clk)
always @(posedge clk)
if (rst) begin
begin
        TLBenabled <= 1'b0;
 
        Wired <= 4'd0;
 
        PageTblAddr <= {DBW{1'b0}};
 
        PageTblCtrl <= {DBW{1'b0}};
 
        age_lmt <= 24'd20000;
 
end
 
else begin
 
        if (miss_addr == {DBW{1'b0}} && TLBMiss)
        if (miss_addr == {DBW{1'b0}} && TLBMiss)
                miss_addr <= vadr_i;
                miss_addr <= vadr_i;
 
 
        if (state==ONE) begin
        if (state==ONE) begin
                case(op)
                case(op)
Line 425... Line 405...
        endcase
        endcase
 
 
TLBAgeRam uar1(clk,ar_wr,ar_adr,ar_dati,ar_dato);
TLBAgeRam uar1(clk,ar_wr,ar_adr,ar_dati,ar_dato);
 
 
always @(posedge clk)
always @(posedge clk)
if (rst) begin
begin
        age_adr <= 4'd0;
 
        ar_wr <= 1'b0;
 
        ar_adr <= 4'd0;
 
        ar_state <= IDLE;
 
        cyc_en <= 1'b1;
 
        age_en <= 1'b1;
 
        doLoad <= 1'b0;
 
end
 
else begin
 
ar_wr <= 1'b0;
ar_wr <= 1'b0;
getset_age <= 1'b0;
getset_age <= 1'b0;
if (ld)
if (ld)
        doLoad <= 1'b1;
        doLoad <= 1'b1;
case(ar_state)
case(ar_state)
Line 516... Line 487...
                if (Match[n]) q = n;
                if (Match[n]) q = n;
end
end
 
 
assign uncached = TLBC[{q[3:0],vadrs[3:0]}]==3'd1;// || unmappedDataArea;
assign uncached = TLBC[{q[3:0],vadrs[3:0]}]==3'd1;// || unmappedDataArea;
 
 
assign TLBMiss = TLBenabled & (!unmappedArea & (q[4] | ~TLBValid[{q[3:0],vadrs[3:0]}]) ||
assign TLBMiss = (ol!=2'b00) && TLBenabled && (!unmappedArea & (q[4] | ~TLBValid[{q[3:0],vadrs[3:0]}]) ||
                                        (ol!=2'b00 && hitIOPage));
                                        (ol!=2'b00 && hitIOPage));
 
 
always @(posedge clk)
always @(posedge clk)
        cyc_o <= cyc_i & (~TLBMiss | ~TLBenabled);
        cyc_o <= cyc_i && (!TLBMiss || !TLBenabled || (ol == 2'b00));
 
 
always @(posedge clk)
always @(posedge clk)
        we_o <= we_i & ((~TLBMiss & tlbWo1) | ~TLBenabled);
        we_o <= we_i & ((~TLBMiss & tlbWo1) | ~TLBenabled || (ol==2'b00));
 
 
always @(posedge clk)
always @(posedge clk)
        wrv_o <= we_i & ~TLBMiss & ~tlbWo1 & TLBenabled;
        wrv_o <= we_i & ~TLBMiss & ~tlbWo1 & TLBenabled && (ol != 2'b00);
 
 
always @(posedge clk)
always @(posedge clk)
        rdv_o <= ~we_i & ~TLBMiss & ~tlbRo1 & TLBenabled;
        rdv_o <= ~we_i & ~TLBMiss & ~tlbRo1 & TLBenabled && (ol != 2'b00);
 
 
always @(posedge clk)
always @(posedge clk)
        exv_o <= icl_i & ~TLBMiss & ~tlbXo1 & TLBenabled;
        exv_o <= icl_i & ~TLBMiss & ~tlbXo1 & TLBenabled && (ol != 2'b00);
 
 
always @(posedge clk)
always @(posedge clk)
if (rst)
 
        padr_o <= 32'hFFFC0100;
 
else begin
 
if (TLBenabled && ol != 2'b00) begin
if (TLBenabled && ol != 2'b00) begin
        case(PageSize)
        case(PageSize)
        3'd0:   padr_o[ABW-1:13] <=  unmappedArea ? vadr_i[ABW-1:13] : TLBMiss ? `TLBMissPage: PFN;
        3'd0:   padr_o[ABW-1:13] <=  unmappedArea ? vadr_i[ABW-1:13] : TLBMiss ? `TLBMissPage: PFN;
        3'd1:   padr_o[ABW-1:13] <= {unmappedArea ? vadr_i[ABW-1:15] : TLBMiss ? `TLBMissPage: PFN,vadr_i[14:13]};
        3'd1:   padr_o[ABW-1:13] <= {unmappedArea ? vadr_i[ABW-1:15] : TLBMiss ? `TLBMissPage: PFN,vadr_i[14:13]};
        3'd2:   padr_o[ABW-1:13] <= {unmappedArea ? vadr_i[ABW-1:17] : TLBMiss ? `TLBMissPage: PFN,vadr_i[16:13]};
        3'd2:   padr_o[ABW-1:13] <= {unmappedArea ? vadr_i[ABW-1:17] : TLBMiss ? `TLBMissPage: PFN,vadr_i[16:13]};
Line 552... Line 520...
        endcase
        endcase
        padr_o[12:0] <= vadr_i[12:0];
        padr_o[12:0] <= vadr_i[12:0];
end
end
else
else
        padr_o <= vadr_i;
        padr_o <= vadr_i;
end
 
 
 
endmodule
endmodule
 
 
module TLBRam(clk,we,wa,i,ra0,ra1,o0,o1);
module TLBRam(clk,we,wa,i,ra0,ra1,o0,o1);
parameter DBW=1;
parameter DBW=1;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.