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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64/] [rtl/] [bench/] [soc/] [scratchmem.v] - Blame information for rev 46

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 46 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2012-2018  Robert Finch, Waterloo
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
//
9
// This source file is free software: you can redistribute it and/or modify 
10
// it under the terms of the GNU Lesser General Public License as published 
11
// by the Free Software Foundation, either version 3 of the License, or     
12
// (at your option) any later version.                                      
13
//                                                                          
14
// This source file is distributed in the hope that it will be useful,      
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
17
// GNU General Public License for more details.                             
18
//                                                                          
19
// You should have received a copy of the GNU General Public License        
20
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
21
//                                                                          
22
// ============================================================================
23
//
24
module scratchmem(rst_i, clk_i, cti_i, cs_i, cyc_i, stb_i, ack_o, we_i, sel_i, adr_i, dat_i, dat_o);
25
input rst_i;
26
input clk_i;
27
input [2:0] cti_i;
28
input cs_i;
29
input cyc_i;
30
input stb_i;
31
output ack_o;
32
input we_i;
33
input [7:0] sel_i;
34
input [14:0] adr_i;
35
input [63:0] dat_i;
36
output [63:0] dat_o;
37
reg [63:0] dat_o;
38
 
39
integer n;
40
 
41
reg [7:0] smemA [4095:0];
42
reg [7:0] smemB [4095:0];
43
reg [7:0] smemC [4095:0];
44
reg [7:0] smemD [4095:0];
45
reg [7:0] smemE [4095:0];
46
reg [7:0] smemF [4095:0];
47
reg [7:0] smemG [4095:0];
48
reg [7:0] smemH [4095:0];
49
reg [14:2] radr;
50
 
51
 
52
initial begin
53
for (n = 0; n < 4096; n = n + 1)
54
begin
55
        smemA[n] = 0;
56
        smemB[n] = 0;
57
        smemC[n] = 0;
58
        smemD[n] = 0;
59
        smemE[n] = 0;
60
        smemF[n] = 0;
61
        smemG[n] = 0;
62
        smemH[n] = 0;
63
end
64
end
65
 
66
wire cs = cs_i && cyc_i && stb_i;
67
 
68
reg [2:0] cnt;
69
reg rdy,rdy1;
70
always @(posedge clk_i)
71
begin
72
        rdy1 <= cs;
73
        rdy <= rdy1 & cs && cnt!=3'b100;
74
end
75
assign ack_o = cs ? (we_i ? 1'b1 : rdy) : 1'b0;
76
 
77
 
78
always @(posedge clk_i)
79
        if (cs & we_i) begin
80
                $display ("wrote to scratchmem: %h=%h:%h", adr_i, dat_i, sel_i);
81
                if (adr_i==15'h1ff50 && dat_i==64'h20) begin
82
                  $display("1f50=20");
83
                  $finish;
84
                end
85
        end
86
always @(posedge clk_i)
87
if (cs & we_i & sel_i[0])
88
        smemA[adr_i[14:3]] <= dat_i[7:0];
89
always @(posedge clk_i)
90
if (cs & we_i & sel_i[1])
91
        smemB[adr_i[14:3]] <= dat_i[15:8];
92
always @(posedge clk_i)
93
    if (cs & we_i & sel_i[2])
94
        smemC[adr_i[14:3]] <= dat_i[23:16];
95
always @(posedge clk_i)
96
    if (cs & we_i & sel_i[3])
97
        smemD[adr_i[14:3]] <= dat_i[31:24];
98
always @(posedge clk_i)
99
    if (cs & we_i & sel_i[4])
100
        smemE[adr_i[14:3]] <= dat_i[39:32];
101
always @(posedge clk_i)
102
    if (cs & we_i & sel_i[5])
103
        smemF[adr_i[14:3]] <= dat_i[47:40];
104
always @(posedge clk_i)
105
    if (cs & we_i & sel_i[6])
106
        smemG[adr_i[14:3]] <= dat_i[55:48];
107
always @(posedge clk_i)
108
    if (cs & we_i & sel_i[7])
109
        smemH[adr_i[14:3]] <= dat_i[63:56];
110
 
111
wire pe_cs;
112
edge_det u1(.rst(rst_i), .clk(clk_i), .ce(1'b1), .i(cs), .pe(pe_cs), .ne(), .ee() );
113
 
114
reg [12:0] ctr;
115
always @(posedge clk_i)
116
        if (pe_cs) begin
117
                if (cti_i==3'b000)
118
                        ctr <= adr_i[14:3];
119
                else
120
                        ctr <= adr_i[14:3] + 12'd1;
121
                cnt <= 3'b000;
122
        end
123
        else if (cs && cnt[2:0]!=3'b011 && cti_i!=3'b000) begin
124
                ctr[1:0] <= ctr[1:0] + 2'd1;
125
                cnt <= cnt + 3'd1;
126
        end
127
 
128
always @(posedge clk_i)
129
        radr <= pe_cs ? adr_i[14:3] : ctr;
130
 
131
//assign dat_o = cs ? {smemH[radr],smemG[radr],smemF[radr],smemE[radr],
132
//                              smemD[radr],smemC[radr],smemB[radr],smemA[radr]} : 64'd0;
133
 
134
always @(posedge clk_i)
135
begin
136
        dat_o <= {smemH[radr],smemG[radr],smemF[radr],smemE[radr],smemD[radr],smemC[radr],smemB[radr],smemA[radr]};
137
        if (!we_i)
138
                $display("read from scratchmem: %h=%h", radr, {smemB[radr],smemA[radr]});
139
end
140
 
141
endmodule

powered by: WebSVN 2.1.0

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