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

Subversion Repositories robust_reg

[/] [robust_reg/] [trunk/] [src/] [base/] [regfile.v] - Blame information for rev 16

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 16 eyalhoc
<##//////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  Author: Eyal Hochberg                                      ////
4
////          eyal@provartec.com                                 ////
5
////                                                             ////
6
////  Downloaded from: http://www.opencores.org                  ////
7
/////////////////////////////////////////////////////////////////////
8
////                                                             ////
9
//// Copyright (C) 2010 Provartec LTD                            ////
10
//// www.provartec.com                                           ////
11
//// info@provartec.com                                          ////
12
////                                                             ////
13
//// This source file may be used and distributed without        ////
14
//// restriction provided that this copyright statement is not   ////
15
//// removed from the file and that any derivative work contains ////
16
//// the original copyright notice and the associated disclaimer.////
17
////                                                             ////
18
//// This source file is free software; you can redistribute it  ////
19
//// and/or modify it under the terms of the GNU Lesser General  ////
20
//// Public License as published by the Free Software Foundation.////
21
////                                                             ////
22
//// This source is distributed in the hope that it will be      ////
23
//// useful, but WITHOUT ANY WARRANTY; without even the implied  ////
24
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     ////
25
//// PURPOSE.  See the GNU Lesser General Public License for more////
26
//// details. http://www.gnu.org/licenses/lgpl.html              ////
27
////                                                             ////
28
//////////////////////////////////////////////////////////////////##>
29 9 eyalhoc
 
30 16 eyalhoc
OUTFILE PREFIX_regfile.v
31 9 eyalhoc
INCLUDE def_regfile.txt
32
 
33 14 eyalhoc
ITER RX GROUP_REGS.NUM
34 9 eyalhoc
 
35 16 eyalhoc
module PREFIX_regfile (PORTS);
36 9 eyalhoc
 
37
   parameter            ADDR_BITS = 16;
38
 
39
   input                clk;
40
   input                reset;
41
   port                 GROUP_APB;
42
 
43
 
44
   input                GROUP_REGRX.SON(TYPE == TYPE_RO);
45
   output               GROUP_REGRX.SON(TYPE == TYPE_RW);
46
   output               wr_GROUP_REGRX.SON(TYPE == TYPE_WO);
47
   output               GROUP_REGRX.SON(TYPE == TYPE_IW);
48
 
49
 
50
   wire                 gpwrite;
51
   wire                 gpread;
52
   reg [31:0]           prdata_pre;
53
   reg                  pslverr_pre;
54
   reg [31:0]           prdata;
55
   reg                  pslverr;
56
   reg                  pready;
57
 
58
   wire
59
   STOMP NEWLINE ;;     GONCAT(wr_regGROUP_REGS.SON(TYPE != TYPE_RO).IDX ,);
60
   reg [31:0]
61
   STOMP NEWLINE ;;     GONCAT(rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX ,);
62
 
63
   reg                  GROUP_REGRX.SON(TYPE == TYPE_IW);
64
   reg                  GROUP_REGRX.SON(TYPE == TYPE_RW);
65
 
66
   wire                 wr_GROUP_REGRX.SON(TYPE == TYPE_WO);
67
   wire                 wr_GROUP_REGRX.SON(TYPE == TYPE_IW);
68
 
69
 
70
   //---------------------- addresses-----------------------------------
71
   parameter            GROUP_REGS = 'hGROUP_REGS.ADDR;     //GROUP_REGS.DESC
72
 
73
   //---------------------- gating -------------------------------------
74
   assign               gpwrite     = psel & (~penable) & pwrite;
75
   assign               gpread      = psel & (~penable) & (~pwrite);
76
 
77
 
78
   //---------------------- Write Operations ---------------------------
79
   assign            wr_regGROUP_REGS.SON(TYPE != TYPE_RO).IDX = gpwrite & (paddr == GROUP_REGS);
80
 
81 14 eyalhoc
   LOOP RX GROUP_REGS.NUM
82 9 eyalhoc
   IFDEF TRUE(GROUP_REGS[RX].TYPE == TYPE_RW)
83
   //GROUP_REGS[RX].DESC
84
   always @(posedge clk or posedge reset)
85
     if (reset)
86
           begin
87
             GROUP_REGRX.SON(TYPE==TYPE_RW) <= #FFD GROUP_REGRX.WIDTH'dGROUP_REGRX.DEFAULT;     //GROUP_REGRX.DESC
88
           end
89
     else if (wr_regRX)
90
           begin
91 16 eyalhoc
             GROUP_REGRX.SON(TYPE==TYPE_RW) <= #FFD pwdata[EXPR(GROUP_REGRX.WIDTH+GROUP_REGRX.FIRST_BIT-1):GROUP_REGRX.FIRST_BIT];
92 9 eyalhoc
           end
93
 
94
   ENDIF TRUE(GROUP_REGS[RX].TYPE == TYPE_RW)
95
        assign  wr_GROUP_REGRX.SON(TYPE==TYPE_WO) = {GROUP_REGRX.WIDTH{wr_regRX}} & pwdata[EXPR(GROUP_REGRX.WIDTH-1):0];
96
        assign  wr_GROUP_REGRX.SON(TYPE==TYPE_IW) = {GROUP_REGRX.WIDTH{wr_regRX}} & pwdata[EXPR(GROUP_REGRX.WIDTH-1):0];
97
    ENDLOOP RX
98
 
99
        //---------------------- Read Operations ----------------------------
100
     always @(*)
101
     begin
102
           rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX  = {32{1'b0}};
103
 
104 16 eyalhoc
           rd_regRX[EXPR(GROUP_REGRX.WIDTH+GROUP_REGRX.FIRST_BIT-1):GROUP_REGRX.FIRST_BIT] = GROUP_REGRX.SON(TYPE != TYPE_WO);     //GROUP_REGRX.DESC
105 9 eyalhoc
     end
106
 
107
   always @(*)
108
     begin
109
          prdata_pre  = {32{1'b0}};
110
 
111
          case (paddr)
112
           GROUP_REGS : prdata_pre = rd_regGROUP_REGS.SON(TYPE != TYPE_WO).IDX;
113
 
114
           default : prdata_pre  = {32{1'b0}};
115
          endcase
116
     end
117
 
118
 
119
 always @(paddr or gpread or gpwrite or psel)
120
     begin
121
          pslverr_pre = 1'b0;
122
 
123
          case (paddr)
124
            GROUP_REGS.SON(TYPE==TYPE_RW) : pslverr_pre = 1'b0; //read and write
125
            GROUP_REGS.SON(TYPE==TYPE_RO) : pslverr_pre = gpwrite; //read only
126
            GROUP_REGS.SON(TYPE==TYPE_WO) : pslverr_pre = gpread; //write only
127
 
128
           default : pslverr_pre = psel;    //decode error
129
          endcase
130
     end
131
 
132
 
133
        //---------------------- Sample outputs -----------------------------
134
   always @(posedge clk or posedge reset)
135
     if (reset)
136
       prdata <= #FFD {32{1'b0}};
137
     else if (gpread & pclken)
138
       prdata <= #FFD prdata_pre;
139
     else if (pclken)
140
       prdata <= #FFD {32{1'b0}};
141
 
142
   always @(posedge clk or posedge reset)
143
     if (reset)
144
          begin
145
       pslverr <= #FFD 1'b0;
146
       pready <= #FFD 1'b0;
147
          end
148
     else if ((gpread | gpwrite) & pclken)
149
          begin
150
       pslverr <= #FFD pslverr_pre;
151
       pready <= #FFD 1'b1;
152
          end
153
     else if (pclken)
154
          begin
155
       pslverr <= #FFD 1'b0;
156
       pready <= #FFD 1'b0;
157
          end
158
 
159
 
160
endmodule
161
 
162
 

powered by: WebSVN 2.1.0

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