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

Subversion Repositories zap

[/] [zap/] [trunk/] [src/] [rtl/] [cpu/] [zap_register_file.v] - Blame information for rev 51

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 26 Revanth
// -----------------------------------------------------------------------------
2
// --                                                                         --
3
// --                   (C) 2016-2018 Revanth Kamaraj.                        --
4
// --                                                                         -- 
5
// -- --------------------------------------------------------------------------
6
// --                                                                         --
7
// -- This program is free software; you can redistribute it and/or           --
8
// -- modify it under the terms of the GNU General Public License             --
9
// -- as published by the Free Software Foundation; either version 2          --
10
// -- of the License, or (at your option) any later version.                  --
11
// --                                                                         --
12
// -- This program is distributed in the hope that it will be useful,         --
13
// -- but WITHOUT ANY WARRANTY; without even the implied warranty of          --
14
// -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           --
15
// -- GNU General Public License for more details.                            --
16
// --                                                                         --
17
// -- You should have received a copy of the GNU General Public License       --
18
// -- along with this program; if not, write to the Free Software             --
19
// -- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA           --
20
// -- 02110-1301, USA.                                                        --
21
// --                                                                         --
22
// -----------------------------------------------------------------------------
23
// --                                                                         -- 
24
// --  ZAP register file implemented using flip-flops which makes sense for an--
25
// --  FPGA implementation where flip-flops are plentiful.                    --
26
// --                                                                         --
27
// -----------------------------------------------------------------------------
28
 
29
`default_nettype none
30
 
31
module zap_register_file
32
(
33
        input wire              i_clk,
34
 
35
        input wire              i_reset,
36
 
37
        input wire              i_wen,
38
 
39
        input wire  [5:0]       i_wr_addr_a,
40
                                i_wr_addr_b,       // 2 write addresses.
41
 
42
        input wire  [31:0]      i_wr_data_a,
43
                                i_wr_data_b,       // 2 write data.
44
 
45
        input wire  [5:0]       i_rd_addr_a,
46
                                i_rd_addr_b,
47
                                i_rd_addr_c,
48
                                i_rd_addr_d,
49
 
50
        output reg  [31:0]      o_rd_data_a,
51
                                o_rd_data_b,
52
                                o_rd_data_c,
53
                                o_rd_data_d
54
);
55
 
56
// Dual distributed RAM setup.
57
reg [31:0] mem [39:0];
58
reg [31:0] MEM [39:0];
59
 
60
initial
61
begin: blk1
62
        integer i;
63
 
64
        for(i=0;i<40;i=i+1)
65
        begin
66
                mem[i] = 0;
67
                MEM[i] = 0;
68
        end
69
end
70
 
71
reg [39:0] sel;
72
 
73 51 Revanth
wire [31:0] r0;  assign r0 =  sel[0]  ? MEM[0] : mem[0];
74
wire [31:0] r1;  assign r1 =  sel[1]  ? MEM[1] : mem[1];
75
wire [31:0] r2;  assign r2 =  sel[2]  ? MEM[2] : mem[2];
76
wire [31:0] r3;  assign r3 =  sel[3]  ? MEM[3] : mem[3];
77
wire [31:0] r4;  assign r4 =  sel[4]  ? MEM[4] : mem[4];
78
wire [31:0] r5;  assign r5 =  sel[5]  ? MEM[5] : mem[5];
79
wire [31:0] r6;  assign r6 =  sel[6]  ? MEM[6] : mem[6];
80
wire [31:0] r7;  assign r7 =  sel[7]  ? MEM[7] : mem[7];
81
wire [31:0] r8;  assign r8 =  sel[8]  ? MEM[8] : mem[8];
82
wire [31:0] r9;  assign r9 =  sel[9]  ? MEM[9] : mem[9];
83
wire [31:0] r10; assign r10 = sel[10] ? MEM[10] : mem[10];
84
wire [31:0] r11; assign r11 = sel[11] ? MEM[11] : mem[11];
85
wire [31:0] r12; assign r12 = sel[12] ? MEM[12] : mem[12];
86
wire [31:0] r13; assign r13 = sel[13] ? MEM[13] : mem[13];
87
wire [31:0] r14; assign r14 = sel[14] ? MEM[14] : mem[14];
88
wire [31:0] r15; assign r15 = sel[15] ? MEM[15] : mem[15];
89
wire [31:0] r16; assign r16 = sel[16] ? MEM[16] : mem[16];
90
wire [31:0] r17; assign r17 = sel[17] ? MEM[17] : mem[17];
91
wire [31:0] r18; assign r18 = sel[18] ? MEM[18] : mem[18];
92
wire [31:0] r19; assign r19 = sel[19] ? MEM[19] : mem[19];
93
wire [31:0] r20; assign r20 = sel[20] ? MEM[20] : mem[20];
94
wire [31:0] r21; assign r21 = sel[21] ? MEM[21] : mem[21];
95
wire [31:0] r22; assign r22 = sel[22] ? MEM[22] : mem[22];
96
wire [31:0] r23; assign r23 = sel[23] ? MEM[23] : mem[23];
97
wire [31:0] r24; assign r24 = sel[24] ? MEM[24] : mem[24];
98
wire [31:0] r25; assign r25 = sel[25] ? MEM[25] : mem[25];
99
wire [31:0] r26; assign r26 = sel[26] ? MEM[26] : mem[26];
100
wire [31:0] r27; assign r27 = sel[27] ? MEM[27] : mem[27];
101
wire [31:0] r28; assign r28 = sel[28] ? MEM[28] : mem[28];
102
wire [31:0] r29; assign r29 = sel[29] ? MEM[29] : mem[29];
103
wire [31:0] r30; assign r30 = sel[30] ? MEM[30] : mem[30];
104
wire [31:0] r31; assign r31 = sel[31] ? MEM[31] : mem[31];
105
wire [31:0] r32; assign r32 = sel[32] ? MEM[32] : mem[32];
106
wire [31:0] r33; assign r33 = sel[33] ? MEM[33] : mem[33];
107
wire [31:0] r34; assign r34 = sel[34] ? MEM[34] : mem[34];
108
wire [31:0] r35; assign r35 = sel[35] ? MEM[35] : mem[35];
109
wire [31:0] r36; assign r36 = sel[36] ? MEM[36] : mem[36];
110
wire [31:0] r37; assign r37 = sel[37] ? MEM[37] : mem[37];
111
wire [31:0] r38; assign r38 = sel[38] ? MEM[38] : mem[38];
112
wire [31:0] r39; assign r39 = sel[39] ? MEM[39] : mem[39];
113 26 Revanth
 
114
always @ (posedge i_clk)
115
begin
116
        if ( i_reset )
117
        begin
118
                sel <= 40'd0;
119
        end
120
        else
121
        begin
122
                sel [ i_wr_addr_a ] <= 1'd0;
123
                sel [ i_wr_addr_b ] <= 1'd1;
124
        end
125
end
126
 
127
always @ (posedge i_clk)
128
begin
129
        if ( i_wen )
130
        begin
131
                mem [ i_wr_addr_a ] <= i_wr_data_a;
132
                MEM [ i_wr_addr_b ] <= i_wr_data_b;
133
        end
134
end
135
 
136
always @*
137
begin
138
        o_rd_data_a = sel[i_rd_addr_a] ? MEM [ i_rd_addr_a ] : mem [ i_rd_addr_a ];
139
        o_rd_data_b = sel[i_rd_addr_b] ? MEM [ i_rd_addr_b ] : mem [ i_rd_addr_b ];
140
        o_rd_data_c = sel[i_rd_addr_c] ? MEM [ i_rd_addr_c ] : mem [ i_rd_addr_c ];
141
        o_rd_data_d = sel[i_rd_addr_d] ? MEM [ i_rd_addr_d ] : mem [ i_rd_addr_d ];
142
end
143
 
144
endmodule // bram_wrapper.v
145 51 Revanth
 
146 26 Revanth
`default_nettype wire
147 51 Revanth
 
148
// ----------------------------------------------------------------------------
149
// EOF
150
// ----------------------------------------------------------------------------

powered by: WebSVN 2.1.0

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