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

Subversion Repositories oops

[/] [oops/] [trunk/] [rtl/] [if_buffer.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 smjoshua
//////////////////////////////////////////////////////////////////
2
//                                                              //
3
//  OoOPs Core Instruction Fetch Buffer module                  //
4
//                                                              //
5
//  This file is part of the OoOPs project                      //
6
//  http://www.opencores.org/project,oops                       //
7
//                                                              //
8
//  Description:                                                //
9
//  Buffer for fetched instructions to help reduce penalty of   //
10
//  cache misses during stall cycles.                           //
11
//                                                              //
12
//  Author(s):                                                  //
13
//      - Joshua Smith, smjoshua@umich.edu                      //
14
//                                                              //
15
//////////////////////////////////////////////////////////////////
16
//                                                              //
17
// Copyright (C) 2012 Authors and OPENCORES.ORG                 //
18
//                                                              //
19
// This source file may be used and distributed without         //
20
// restriction provided that this copyright statement is not    //
21
// removed from the file and that any derivative work contains  //
22
// the original copyright notice and the associated disclaimer. //
23
//                                                              //
24
// This source file is free software; you can redistribute it   //
25
// and/or modify it under the terms of the GNU Lesser General   //
26
// Public License as published by the Free Software Foundation; //
27
// either version 2.1 of the License, or (at your option) any   //
28
// later version.                                               //
29
//                                                              //
30
// This source is distributed in the hope that it will be       //
31
// useful, but WITHOUT ANY WARRANTY; without even the implied   //
32
// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
33
// PURPOSE.  See the GNU Lesser General Public License for more //
34
// details.                                                     //
35
//                                                              //
36
// You should have received a copy of the GNU Lesser General    //
37
// Public License along with this source; if not, download it   //
38
// from http://www.opencores.org/lgpl.shtml                     //
39
//                                                              //
40
//////////////////////////////////////////////////////////////////
41
`include "ooops_defs.v"
42
 
43
module if_buffer (
44
  input wire                    clk,
45
  input wire                    rst,
46
  input wire                    flush,
47
 
48
  // Write interface
49
  input wire                    if_valid,
50
  input wire  [`INSTR_SZ-1:0]   if_instr,
51
  input wire  [`ADDR_SZ-1:0]    if_fpc,
52
  input wire  [`BP_SZ-1:0]      if_bprd_info,
53
 
54
  // Read interface
55
  input wire                    if_ifb_pop_en,
56
  output wire                   ifb_full,
57
  output wire                   if_id_valid,
58
  output wire [`INSTR_SZ-1:0]   if_id_instr,
59
  output wire [`ADDR_SZ-1:0]    if_id_fpc,
60
  output wire [`BP_SZ-1:0]      if_id_bprd_info
61
  );
62
 
63
  // Local wires
64
  wire [`IFB_PTR_SZ:0]      ifb_rd_ptr, ifb_rd_ptr_in;
65
  wire [`IFB_PTR_SZ:0]      ifb_wr_ptr, ifb_wr_ptr_in;
66
  wire [`IFB_ENTRIES-1:0]   ifb_rd_ptr_vec;             // 1-hot vector for reading
67
  wire                      ifb_empty;
68
  wire                      ifb_push;
69
  wire                      ifb_pop;
70
  wire [`IFB_PTR_SZ:0]      ifb_valid_counter, ifb_valid_counter_in;
71
  wire                      ifb_valid_counter_ld;
72
 
73
  wire [`IFB_ENTRY_SZ-1:0]  ifb_entry    [`IFB_ENTRIES-1:0];
74
  wire [`IFB_ENTRY_SZ-1:0]  ifb_entry_in;
75
  wire [`IFB_ENTRIES-1:0]   ifb_entry_ld;
76
  reg  [`IFB_ENTRY_SZ-1:0]  ifb_rd_entry;
77
 
78
  // Handle muxing outputs
79
  integer i;
80
  always @* begin
81
    ifb_rd_entry = {`IFB_ENTRY_SZ{1'b0}};
82
    for (i=0; i<`IFB_ENTRIES; i=i+1) begin
83
      ifb_rd_entry = ifb_rd_entry | ({`IFB_ENTRY_SZ{ifb_rd_ptr_vec[i]}} & ifb_entry[i]);
84
    end
85
  end
86
  assign if_id_valid = !ifb_empty;
87
  assign {if_id_instr,if_id_fpc,if_id_bprd_info} = ifb_rd_entry;
88
 
89
  // Handle updating the read and write pointers
90
  assign ifb_push       = if_valid & !ifb_full;
91
  assign ifb_pop        = if_ifb_pop_en & !ifb_empty;
92
  assign ifb_wr_ptr_in  = ((ifb_wr_ptr==`IFB_ENTRIES) | flush) ? {`IFB_PTR_SZ+1{1'b0}} : ifb_wr_ptr + 1;
93
  assign ifb_rd_ptr_in  = ((ifb_rd_ptr==`IFB_ENTRIES) | flush) ? {`IFB_PTR_SZ+1{1'b0}} : ifb_rd_ptr + 1;
94
 
95
  wire [`IFB_ENTRIES-1:0] ifb_rd_ptr_vec_in = (`IFB_ENTRIES'h1 << ifb_rd_ptr_in);
96
 
97
  wire ifb_wr_ptr_ld = ifb_push | flush;
98
  wire ifb_rd_ptr_ld = ifb_pop | flush;
99
  MDFFLR #(`IFB_PTR_SZ+1) ifb_wr_ptr_ff (clk, rst, ifb_wr_ptr_ld, {`IFB_PTR_SZ+1{1'b0}}, ifb_wr_ptr_in, ifb_wr_ptr);
100
  MDFFLR #(`IFB_PTR_SZ+1) ifb_rd_ptr_ff (clk, rst, ifb_rd_ptr_ld, {`IFB_PTR_SZ+1{1'b0}}, ifb_rd_ptr_in, ifb_rd_ptr);
101
  MDFFLR #(`IFB_ENTRIES)  ifb_rd_ptr_vec_ff (clk, rst, ifb_rd_ptr_ld, `IFB_ENTRIES'h1, ifb_rd_ptr_vec_in, ifb_rd_ptr_vec);
102
 
103
  // Handle occupancy detection
104
  wire ifb_full_in = (ifb_wr_ptr_in[`IFB_PTR_SZ] ^ ifb_rd_ptr_in[`IFB_PTR_SZ])   & (ifb_wr_ptr_in[`IFB_PTR_SZ-1:0]==ifb_rd_ptr_in[`IFB_PTR_SZ-1:0]);
105
  wire ifb_empty_in = (ifb_wr_ptr_in[`IFB_PTR_SZ] ~^ ifb_rd_ptr_in[`IFB_PTR_SZ]) & (ifb_wr_ptr_in[`IFB_PTR_SZ-1:0]==ifb_rd_ptr_in[`IFB_PTR_SZ-1:0]);
106
  MDFFR #(1) ifb_full_ff (clk, rst, 1'b0, ifb_full_in, ifb_full);
107
  MDFFR #(1) ifb_empty_ff (clk, rst, 1'b1, ifb_empty_in, ifb_empty);
108
 
109
  // Instantiate flops for entries
110
  assign ifb_entry_in = {if_valid,if_instr, if_fpc, if_bprd_info};
111
  genvar g;
112
  generate
113
    for (g=0; g<`IFB_ENTRIES; g=g+1)
114
    begin : ifb_entry_gen
115
      MDFFL #(`IFB_ENTRY_SZ) entry_ff (clk, ifb_entry_ld[g], ifb_entry_in, ifb_entry[g]);
116
    end
117
  endgenerate
118
 
119
endmodule

powered by: WebSVN 2.1.0

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