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

Subversion Repositories srdydrdy_lib

[/] [srdydrdy_lib/] [trunk/] [rtl/] [verilog/] [utility/] [llmanager_refcount.v] - Blame information for rev 30

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 ghutchis
module llmanager_refcount
2
  #(parameter     lpsz = 8,
3
    parameter     refsz = 3)
4
  (
5
   input clk,
6
   input reset,
7
 
8
   input            drq_srdy,
9
   output reg       drq_drdy,
10
   input [lpsz-1:0]         drq_start_page,
11
   input [lpsz-1:0]         drq_end_page,
12
 
13
   output reg reclaim_srdy,
14
   input      reclaim_drdy,
15
   output reg [lpsz-1:0] reclaim_start_page,
16
   output reg [lpsz-1:0] reclaim_end_page,
17
 
18
   // reference count update interface
19
   input                  refup_srdy,
20
   output reg             refup_drdy,
21
   input [lpsz-1:0]       refup_page,
22
   input [refsz-1:0]      refup_count,
23
 
24
   // reference count memory interface
25
   output reg                ref_wr_en,
26
   output reg [lpsz-1:0]     ref_wr_addr,
27
   output reg [refsz-1:0]    ref_wr_data,
28
   output reg [lpsz-1:0]     ref_rd_addr,
29
   output reg                ref_rd_en,
30
   input [refsz-1:0]         ref_rd_data
31
   );
32
 
33
  reg [lpsz-1:0]          dref_start_addr, nxt_dref_start_addr;
34
  reg [lpsz-1:0]          dref_end_addr, nxt_dref_end_addr;
35
  reg [2:0]               state, nxt_state;
36
 
37
  localparam s_idle = 0, s_dreq = 1, s_reclaim = 2;
38
 
39
  always @*
40
    begin
41
      reclaim_srdy = 0;
42
      reclaim_start_page = 0;
43
      reclaim_end_page = 0;
44
      ref_wr_en = 0;
45
      ref_wr_addr = 0;
46
      ref_wr_data = 0;
47
      ref_rd_addr = 0;
48
      ref_rd_en = 0;
49
      drq_drdy = 0;
50
      refup_drdy = 0;
51
      nxt_state = state;
52
      nxt_dref_start_addr = dref_start_addr;
53
      nxt_dref_end_addr   = dref_end_addr;
54
 
55
      case (1'b1)
56
        state[s_idle] :
57
          begin
58
            refup_drdy = 1;
59
            if (refup_srdy)
60
              begin
61
                ref_wr_en = 1;
62
                ref_wr_addr = refup_page;
63
                ref_wr_data = refup_count;
64
              end
65
            else if (drq_srdy)
66
              begin
67
                ref_rd_en = 1;
68
                ref_rd_addr = drq_start_page;
69
                nxt_state = 1 << s_dreq;
70
                nxt_dref_start_addr = drq_start_page;
71
                nxt_dref_end_addr   = drq_end_page;
72
              end
73
          end // case: s_idle
74
 
75
        state[s_dreq] :
76
          begin
77
            drq_drdy = 1;
78
            ref_wr_en = 1;
79
            ref_wr_addr = dref_start_addr;
80
            ref_wr_data = ref_rd_data - 1;
81
            if (ref_rd_data == 1)
82
              nxt_state = 1 << s_reclaim;
83
            else
84
              nxt_state = 1 << s_idle;
85
          end
86
 
87
        state[s_reclaim] :
88
          begin
89
            reclaim_srdy = 1;
90
            reclaim_start_page = dref_start_addr;
91
            reclaim_end_page = dref_end_addr;
92
            if (reclaim_drdy)
93
              nxt_state = 1 << s_idle;
94
          end
95
      endcase // case (1'b1)
96
    end // always @ *
97
 
98
  always @(posedge clk)
99
    begin
100
      if (reset)
101
        begin
102
          state <= 1 << s_idle;
103
        end
104
      else
105
        begin
106
          state <= nxt_state;
107
        end
108
    end
109
 
110
  always @(posedge clk)
111
    begin
112
      dref_start_addr <= nxt_dref_start_addr;
113
      dref_end_addr   <= nxt_dref_end_addr;
114
    end
115
 
116
endmodule // llmanager_refcount

powered by: WebSVN 2.1.0

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