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

Subversion Repositories thor

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 46 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2011-2017  Robert Finch, Waterloo
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@finitron.ca
6
//       ||
7
//
8
// random.v
9
//     Multi-stream random number generator.
10
//
11
//
12
// This source file is free software: you can redistribute it and/or modify 
13
// it under the terms of the GNU Lesser General Public License as published 
14
// by the Free Software Foundation, either version 3 of the License, or     
15
// (at your option) any later version.                                      
16
//                                                                          
17
// This source file is distributed in the hope that it will be useful,      
18
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
19
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
20
// GNU General Public License for more details.                             
21
//                                                                          
22
// You should have received a copy of the GNU General Public License        
23
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
24
//                      
25
//      Reg no.
26
//      0                        read: random output bits [31:0], write: gen next number 
27
//  1           random stream number
28
//  2           m_z seed setting bits [31:0]
29
//  3           m_w seed setting bits [31:0]
30
//
31
//  +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32
//      |WISHBONE Datasheet
33
//      |WISHBONE SoC Architecture Specification, Revision B.3
34
//      |
35
//      |Description:                                           Specifications:
36
//      +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
37
//      |General Description:                           random number generator
38
//      +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
39
//      |Supported Cycles:                                      SLAVE,READ/WRITE
40
//      |                                                                       SLAVE,BLOCK READ/WRITE
41
//      |                                                                       SLAVE,RMW
42
//      +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
43
//      |Data port, size:                                       16 bit
44
//      |Data port, granularity:                        16 bit
45
//      |Data port, maximum operand size:       16 bit
46
//      |Data transfer ordering:                        Undefined
47
//      |Data transfer sequencing:                      Undefined
48
//      +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
49
//      |Clock frequency constraints:           none
50
//      +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
51
//      |Supported signal list and                      Signal Name             WISHBONE equiv.
52
//      |cross reference to equivalent          ack_o                   ACK_O
53
//      |WISHBONE signals                                       adr_i[43:0]             ADR_I()
54
//      |                                                                       clk_i                   CLK_I
55
//      |                                   rst_i           RST_I()
56
//      |                                                                       dat_i(15:0)             DAT_I()
57
//      |                                                                       dat_o(15:0)             DAT_O()
58
//      |                                                                       cyc_i                   CYC_I
59
//      |                                                                       stb_i                   STB_I
60
//      |                                                                       we_i                    WE_I
61
//      |
62
//      +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
63
//      |Special requirements:
64
//      +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65
//
66
// ============================================================================
67
//
68
// Uses George Marsaglia's multiply method
69
//
70
// m_w = <choose-initializer>;    /* must not be zero */
71
// m_z = <choose-initializer>;    /* must not be zero */
72
//
73
// uint get_random()
74
// {
75
//     m_z = 36969 * (m_z & 65535) + (m_z >> 16);
76
//     m_w = 18000 * (m_w & 65535) + (m_w >> 16);
77
//     return (m_z << 16) + m_w;  /* 32-bit result */
78
// }
79
//
80
`define TRUE    1'b1
81
`define FALSE   1'b0
82
 
83
module random(rst_i, clk_i, cs_i, cyc_i, stb_i, ack_o, we_i, adr_i, dat_i, dat_o);
84
input rst_i;
85
input clk_i;
86
input cs_i;
87
input cyc_i;
88
input stb_i;
89
output reg ack_o;
90
input we_i;
91
input [3:0] adr_i;
92
input [31:0] dat_i;
93
output reg [31:0] dat_o;
94
parameter pAckStyle = 1'b0;
95
 
96
reg ack;
97
wire cs = cs_i && cyc_i && stb_i;
98
always @(posedge clk_i)
99
        ack_o <= cs;
100
//always @*
101
//      ack_o <= cs ? ack : pAckStyle;
102
 
103
reg [9:0] stream;
104
reg [31:0] next_m_z;
105
reg [31:0] next_m_w;
106
reg [31:0] out;
107
reg wrw, wrz;
108
reg [31:0] w,z;
109
wire [31:0] m_zs;
110
wire [31:0] m_ws;
111
 
112
rand_ram u1 (clk_i, wrw, stream, w, m_ws);
113
rand_ram u2 (clk_i, wrz, stream, z, m_zs);
114
 
115
always @*
116
begin
117
        next_m_z <= (18'h36969 * m_zs[15:0]) + m_zs[31:16];
118
        next_m_w <= (18'h18000 * m_ws[15:0]) + m_ws[31:16];
119
end
120
 
121
// Register read path
122
//
123
always @(posedge clk_i)
124
        case(adr_i[3:2])
125
        2'd0:   dat_o <= {m_zs[15:0],16'd0} + m_ws;
126
        2'd1:   dat_o <= {6'h0,stream};
127
// Uncomment these for register read-back
128
//              3'd4:   dat_o <= m_z[31:16];
129
//              3'd5:   dat_o <= m_z[15: 0];
130
//              3'd6:   dat_o <= m_w[31:16];
131
//              3'd7:   dat_o <= m_w[15: 0];
132
        default:        dat_o <= 32'h0000;
133
        endcase
134
 
135
// Register write path
136
//
137
always @(posedge clk_i)
138
begin
139
        wrw <= `FALSE;
140
        wrz <= `FALSE;
141
        if (cs) begin
142
                if (we_i)
143
                        case(adr_i[3:2])
144
                        2'd0:
145
                                begin
146
                                        z <= next_m_z;
147
                                        w <= next_m_w;
148
                                        wrw <= `TRUE;
149
                                        wrz <= `TRUE;
150
                                end
151
                        2'd1:   stream <= dat_i[9:0];
152
                        2'd2:   begin z <= dat_i; wrz <= `TRUE; end
153
                        2'd3:   begin w <= dat_i; wrw <= `TRUE; end
154
                        endcase
155
        end
156
end
157
 
158
endmodule
159
 
160
 
161
// Tools were inferring a massive distributed ram so we help them out a bit by
162
// creating an explicit ram definition.
163
 
164
module rand_ram(clk, wr, ad, i, o);
165
input clk;
166
input wr;
167
input [9:0] ad;
168
input [31:0] i;
169
output [31:0] o;
170
 
171
reg [31:0] ri;
172
reg [9:0] regadr;
173
reg regwr;
174
(* RAM_STYLE="BLOCK" *)
175
reg [31:0] mem [0:1023];
176
 
177
always @(posedge clk)
178
        regadr <= ad;
179
always @(posedge clk)
180
        regwr <= wr;
181
always @(posedge clk)
182
        ri <= i;
183
always @(posedge clk)
184
        if (regwr)
185
                mem[regadr] <= ri;
186
assign o = mem[regadr];
187
 
188
endmodule

powered by: WebSVN 2.1.0

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