OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [mor1kx-3.1/] [rtl/] [verilog/] [mor1kx_rf_espresso.v] - Blame information for rev 38

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 alirezamon
/* ****************************************************************************
2
  This Source Code Form is subject to the terms of the
3
  Open Hardware Description License, v. 1.0. If a copy
4
  of the OHDL was not distributed with this file, You
5
  can obtain one at http://juliusbaxter.net/ohdl/ohdl.txt
6
 
7
  Description: Register file for espresso pipeline
8
 
9
  We get addresses for A and B read directly in from the instruction bus
10
 
11
  Copyright (C) 2012 Authors
12
 
13
  Author(s): Julius Baxter <juliusbaxter@gmail.com>
14
 
15
***************************************************************************** */
16
 
17
`include "mor1kx-defines.v"
18
 
19
module mor1kx_rf_espresso
20
  (/*AUTOARG*/
21
   // Outputs
22
   rfa_o, rfb_o,
23
   // Inputs
24
   clk, rst, rfd_adr_i, rfa_adr_i, rfb_adr_i, rf_we_i, rf_re_i,
25
   result_i
26
   );
27
 
28
   parameter OPTION_RF_ADDR_WIDTH = 5;
29
   parameter OPTION_RF_WORDS = 32;
30
 
31
   parameter OPTION_OPERAND_WIDTH = 32;
32
 
33
   input clk, rst;
34
 
35
 
36
   // GPR addresses
37
   // These two directly from insn bus
38
   input [OPTION_RF_ADDR_WIDTH-1:0]      rfd_adr_i;
39
   input [OPTION_RF_ADDR_WIDTH-1:0]      rfa_adr_i;
40
   // This one from the decode stage
41
   input [OPTION_RF_ADDR_WIDTH-1:0]      rfb_adr_i;
42
 
43
   // WE strobe from control stage
44
   input                                 rf_we_i;
45
 
46
   // Read enable strobe
47
   input                                 rf_re_i;
48
 
49
   input [OPTION_OPERAND_WIDTH-1:0]       result_i;
50
 
51
 
52
   output [OPTION_OPERAND_WIDTH-1:0] rfa_o;
53
   output [OPTION_OPERAND_WIDTH-1:0] rfb_o;
54
 
55
   wire [OPTION_OPERAND_WIDTH-1:0]   rfa_o_mux;
56
   wire [OPTION_OPERAND_WIDTH-1:0]   rfb_o_mux;
57
 
58
 
59
   wire [OPTION_OPERAND_WIDTH-1:0]   rfa_ram_o;
60
   wire [OPTION_OPERAND_WIDTH-1:0]   rfb_ram_o;
61
 
62
   reg [OPTION_OPERAND_WIDTH-1:0]    result_last;
63
   reg [OPTION_RF_ADDR_WIDTH-1:0]    rfd_last;
64
   reg [OPTION_RF_ADDR_WIDTH-1:0]    rfd_r;
65
   reg [OPTION_RF_ADDR_WIDTH-1:0]    rfa_r;
66
   reg [OPTION_RF_ADDR_WIDTH-1:0]    rfb_r;
67
 
68
   wire                               rfa_o_use_last;
69
   wire                               rfb_o_use_last;
70
   reg                                rfa_o_using_last;
71
   reg                                rfb_o_using_last;
72
 
73
   wire                               rfa_rden;
74
   wire                               rfb_rden;
75
 
76
   wire                               rf_wren;
77
 
78
   // Read enables to make sure the last write-while-read propagates through
79
   // once the use_last signal goes away (we might rely on the value remaining
80
   // what it was, but the last registered result might get written again) so
81
   // this forces a read to get that value out.
82
   wire                               rfa_rden_for_last;
83
   wire                               rfb_rden_for_last;
84
 
85
   // Avoid read-write
86
   // Use when this instruction actually will write to its destination
87
   // register.
88
   assign rfa_o_use_last = (rfd_last == rfa_r);
89
   assign rfb_o_use_last = (rfd_last == rfb_r);
90
 
91
   assign rfa_o = rfa_o_use_last ? result_last : rfa_ram_o;
92
 
93
   assign rfb_o = rfb_o_use_last ? result_last : rfb_ram_o;
94
 
95
   assign rfa_rden_for_last = (rfa_o_use_last & !rf_re_i);
96
   assign rfb_rden_for_last = (rfb_o_use_last & !rf_re_i);
97
 
98
   assign rfa_rden = rf_re_i | rfa_rden_for_last;
99
   assign rfb_rden = rf_re_i | rfb_rden_for_last;
100
 
101
   assign rf_wren = rf_we_i;
102
 
103
 
104
   always @(posedge clk `OR_ASYNC_RST)
105
     if (rst) begin
106
        rfa_r <= 0;
107
        rfb_r <= 0;
108
        rfd_r <= 0;
109
     end
110
     else if (rf_re_i)
111
       begin
112
          rfa_r <= rfa_adr_i;
113
          rfb_r <= rfb_adr_i;
114
          rfd_r <= rfd_adr_i;
115
       end
116
 
117
   always @(posedge clk `OR_ASYNC_RST)
118
     if (rst)
119
       rfd_last <= 0;
120
     else if (rf_wren)
121
       rfd_last <= rfd_adr_i;
122
 
123
   always @(posedge clk `OR_ASYNC_RST)
124
     if (rst)
125
       result_last <= 0;
126
     else if (rf_wren)
127
       result_last <= result_i;
128
 
129
   always @(posedge clk `OR_ASYNC_RST)
130
     if (rst) begin
131
        rfa_o_using_last <= 0;
132
        rfb_o_using_last <= 0;
133
     end
134
     else begin
135
        if (!rfa_o_using_last)
136
          rfa_o_using_last <= rfa_o_use_last & !rfa_rden;
137
        else if (rfa_rden)
138
          rfa_o_using_last <= 0;
139
 
140
        if (!rfb_o_using_last)
141
          rfb_o_using_last <= rfb_o_use_last & !rfb_rden;
142
        else if (rfb_rden)
143
          rfb_o_using_last <= 0;
144
     end
145
 
146
   mor1kx_simple_dpram_sclk
147
     #(
148
       .ADDR_WIDTH      (OPTION_RF_ADDR_WIDTH),
149
       .DATA_WIDTH      (OPTION_OPERAND_WIDTH),
150
       .ENABLE_BYPASS   (0)
151
       )
152
   rfa
153
     (
154
      .clk              (clk),
155
      .dout             (rfa_ram_o),
156
      .raddr            (rfa_adr_i),
157
      .re               (rfa_rden),
158
      .waddr            (rfd_adr_i),
159
      .we               (rf_wren),
160
      .din              (result_i)
161
      );
162
 
163
   mor1kx_simple_dpram_sclk
164
     #(
165
       .ADDR_WIDTH      (OPTION_RF_ADDR_WIDTH),
166
       .DATA_WIDTH      (OPTION_OPERAND_WIDTH),
167
       .ENABLE_BYPASS   (0)
168
       )
169
   rfb
170
     (
171
      .clk              (clk),
172
      .dout             (rfb_ram_o),
173
      .raddr            (rfb_adr_i),
174
      .re               (rfb_rden),
175
      .waddr            (rfd_adr_i),
176
      .we               (rf_wren),
177
      .din              (result_i)
178
      );
179
 
180
endmodule // mor1kx_execute_alu

powered by: WebSVN 2.1.0

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