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

Subversion Repositories btc_dsha256

[/] [btc_dsha256/] [trunk/] [rtl/] [vhdl/] [TestBench/] [btc_dsha_TB.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 nuxi1209
------------------------------------------------------------------- 
2
--                                                               --
3
--  Copyright (C) 2013 Author and VariStream Studio              --
4
--  Author : Yu Peng                                             --
5
--                                                               -- 
6
--  This source file may be used and distributed without         -- 
7
--  restriction provided that this copyright statement is not    -- 
8
--  removed from the file and that any derivative work contains  -- 
9
--  the original copyright notice and the associated disclaimer. -- 
10
--                                                               -- 
11
--  This source file is free software; you can redistribute it   -- 
12
--  and/or modify it under the terms of the GNU Lesser General   -- 
13
--  Public License as published by the Free Software Foundation; -- 
14
--  either version 2.1 of the License, or (at your option) any   -- 
15
--  later version.                                               -- 
16
--                                                               -- 
17
--  This source is distributed in the hope that it will be       -- 
18
--  useful, but WITHOUT ANY WARRANTY; without even the implied   -- 
19
--  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      -- 
20
--  PURPOSE.  See the GNU Lesser General Public License for more -- 
21
--  details.                                                     -- 
22
--                                                               -- 
23
--  You should have received a copy of the GNU Lesser General    -- 
24
--  Public License along with this source; if not, download it   -- 
25
--  from http://www.opencores.org/lgpl.shtml                     -- 
26
--                                                               -- 
27
-------------------------------------------------------------------
28
 
29 6 nuxi1209
 
30 2 nuxi1209
library ieee;
31
use ieee.NUMERIC_STD.all;
32
use ieee.STD_LOGIC_UNSIGNED.all;
33
use ieee.std_logic_1164.all;
34
use ieee.std_logic_arith.all;
35
 
36 6 nuxi1209
use work.sha_256_pkg.all;
37
 
38 2 nuxi1209
        -- Add your library and packages declaration here ...
39
 
40
entity btc_dsha_tb is
41
        -- Generic declarations of the tested unit
42
                generic(
43
                gBASE_DELAY : INTEGER := 1 );
44
end btc_dsha_tb;
45
 
46
architecture TB_ARCHITECTURE of btc_dsha_tb is
47
        -- Component declaration of the tested unit
48
        component btc_dsha
49
                generic(
50
                gBASE_DELAY : INTEGER := 1 );
51
        port(
52
                iClkReg : in STD_LOGIC;
53
                iClkProcess : in STD_LOGIC;
54
                iRst_async : in STD_LOGIC;
55
                iValid_p : in STD_LOGIC;
56
                ivAddr : in STD_LOGIC_VECTOR(3 downto 0);
57
                ivData : in STD_LOGIC_VECTOR(31 downto 0);
58 3 nuxi1209
                oReachEnd_p : out STD_LOGIC;
59
                oFoundNonce_p : out STD_LOGIC;
60 2 nuxi1209
                ovNonce : out STD_LOGIC_VECTOR(31 downto 0);
61
                ovDigest : out tDwordArray(0 to 7) );
62
        end component;
63
 
64
        component sha_256_chunk
65
        generic(
66
                gMSG_IS_CONSTANT : std_logic_vector(0 to 15) := (others=>'1');
67
                gH_IS_CONST : std_logic_vector(0 to 7) := (others=>'1');
68 3 nuxi1209
                gBASE_DELAY : integer := 3;
69
                gOUT_VALID_GEN : boolean := false;
70
                gUSE_BRAM_AS_LARGE_SHIFTREG : boolean := false
71 2 nuxi1209
        );
72
        port(
73
                iClk : in STD_LOGIC;
74
                iRst_async : in STD_LOGIC;
75
                iValid : in STD_LOGIC;
76
                ivMsgDword : in tDwordArray(0 to 15);
77
                ivH0 : in STD_LOGIC_VECTOR(31 downto 0);
78
                ivH1 : in STD_LOGIC_VECTOR(31 downto 0);
79
                ivH2 : in STD_LOGIC_VECTOR(31 downto 0);
80
                ivH3 : in STD_LOGIC_VECTOR(31 downto 0);
81
                ivH4 : in STD_LOGIC_VECTOR(31 downto 0);
82
                ivH5 : in STD_LOGIC_VECTOR(31 downto 0);
83
                ivH6 : in STD_LOGIC_VECTOR(31 downto 0);
84
                ivH7 : in STD_LOGIC_VECTOR(31 downto 0);
85
                ovH0 : out STD_LOGIC_VECTOR(31 downto 0);
86
                ovH1 : out STD_LOGIC_VECTOR(31 downto 0);
87
                ovH2 : out STD_LOGIC_VECTOR(31 downto 0);
88
                ovH3 : out STD_LOGIC_VECTOR(31 downto 0);
89
                ovH4 : out STD_LOGIC_VECTOR(31 downto 0);
90
                ovH5 : out STD_LOGIC_VECTOR(31 downto 0);
91
                ovH6 : out STD_LOGIC_VECTOR(31 downto 0);
92 3 nuxi1209
                ovH7 : out STD_LOGIC_VECTOR(31 downto 0);
93
                oValid : out std_logic);
94 2 nuxi1209
        end component;
95
 
96
        component pipelines_without_reset IS
97
                GENERIC (gBUS_WIDTH : integer := 1; gNB_PIPELINES: integer range 1 to 255 := 2);
98
                PORT(
99
                        iClk                            : IN            STD_LOGIC;
100
                        iInput                          : IN            STD_LOGIC;
101
                        ivInput                         : IN            STD_LOGIC_VECTOR(gBUS_WIDTH-1 downto 0);
102
                        oDelayed_output         : OUT           STD_LOGIC;
103
                        ovDelayed_output        : OUT           STD_LOGIC_VECTOR(gBUS_WIDTH-1 downto 0)
104
                );
105
        end component;
106
 
107
        -- Stimulus signals - signals mapped to the input and inout ports of tested entity
108
        signal iClkReg : STD_LOGIC := '1';
109
        signal iClkProcess : STD_LOGIC := '1';
110
        signal iRst_async : STD_LOGIC := '1';
111
        signal iValid_p : STD_LOGIC := '0';
112
        signal ivAddr : STD_LOGIC_VECTOR(3 downto 0) := (others=>'0');
113
        signal ivData : STD_LOGIC_VECTOR(31 downto 0) := (others=>'0');
114
        -- Observed signals - signals mapped to the output ports of tested entity
115 3 nuxi1209
        signal oReachEnd_p : STD_LOGIC := '0';
116
        signal oFoundNonce_p : STD_LOGIC := '0';
117 2 nuxi1209
        signal ovNonce : STD_LOGIC_VECTOR(31 downto 0) := (others=>'0');
118
        signal ovDigest : tDwordArray(0 to 7) := (others=>(others=>'0'));
119
 
120
        -- Add your code here ...
121 5 nuxi1209
        constant cREG_CLK_PERIOD : time := 10 ns; -- 100M Register Clock
122
        constant cPROC_CLK_PERIOD : time := 5 ns; -- 200M Processing Clock
123 3 nuxi1209
        constant cRESET_INTERVAL : time := 71 ns;
124
        constant cSTRAT_TEST : integer := 25;
125
 
126 2 nuxi1209
        constant cCMD_ADDR : std_logic_vector(3 downto 0) := X"D";
127 3 nuxi1209
        constant cCMD_NOP : std_logic_vector(15 downto 0) := X"0000";
128 2 nuxi1209
        constant cCMD_START : std_logic_vector(15 downto 0) := X"0001";
129
 
130
        signal svWork : tDwordArray(0 to 31) := (others=>(others=>'0'));
131
 
132 3 nuxi1209
        signal svWriteCnt : std_logic_vector(31 downto 0) := (others => '0');
133 2 nuxi1209
 
134
        signal sHashMidStateValidIn : std_logic := '0';
135
        signal sHashMidStateValidOut : std_logic := '0';
136
        signal svHashMidStateDataOut : tDwordArray(0 to 7) := (others=>(others=>'0'));
137
        signal svMidState : tDwordArray(0 to 7) := (others=>(others=>'0'));
138
        signal sMidStateValid : std_logic := '0';
139
 
140
begin
141
 
142
        -- Unit Under Test port map
143
        UUT : btc_dsha
144
                generic map (
145
                        gBASE_DELAY => gBASE_DELAY
146
                )
147
 
148
                port map (
149
                        iClkReg => iClkReg,
150
                        iClkProcess => iClkProcess,
151
                        iRst_async => iRst_async,
152
                        iValid_p => iValid_p,
153
                        ivAddr => ivAddr,
154
                        ivData => ivData,
155 3 nuxi1209
                        oReachEnd_p => oReachEnd_p,
156
                        oFoundNonce_p => oFoundNonce_p,
157 2 nuxi1209
                        ovNonce => ovNonce,
158
                        ovDigest => ovDigest
159
                );
160
 
161
        -- Add your stimulus here ...
162
 
163 3 nuxi1209
        iClkReg <= not iClkReg after (cREG_CLK_PERIOD / 2);
164
        iClkProcess <= not iClkProcess after (cPROC_CLK_PERIOD / 2);
165
        iRst_async <= '0' after cRESET_INTERVAL;
166 2 nuxi1209
 
167 3 nuxi1209
        -- This test vector is derive from block 266243, notice the endianess changment of converting JSON data to test vector
168
        -- blockId: 266243
169
        -- blockHash: 000000000000000399572203a6035acb2d68944c9c047435a5e9f11d40daa4ee
170
        -- merkleroot: 0e4cdeacdeaee092dcbb702887e323a036f6bd60d003448e965528adb5ffdf11
171
        -- nonce: 3064385291
172
        -- previousblockhash: 0000000000000005f2c7bd05ca9092ca041cdb85a4f8e5b2360d8b2a594014ea
173
        -- hash: 000000000000000399572203a6035acb2d68944c9c047435a5e9f11d40daa4ee
174
        -- version: 2
175
        -- height: 266243
176
        -- difficulty: 390928787.63808584
177
        -- confirmations: 1
178
        -- time: 1382820355
179
        -- bits: 190afc85
180
        -- size: 227682
181
        svWork(0) <= X"02000000" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
182
        svWork(1) <= X"ea144059" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
183
        svWork(2) <= X"2a8b0d36" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
184
        svWork(3) <= X"b2e5f8a4" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
185
        svWork(4) <= X"85db1c04" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
186
        svWork(5) <= X"ca9290ca" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
187
        svWork(6) <= X"05bdc7f2" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
188
        svWork(7) <= X"05000000" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
189
        svWork(8) <= X"00000000" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
190
        svWork(9) <= X"11dfffb5" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
191
        svWork(10) <= X"ad285596" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
192
        svWork(11) <= X"8e4403d0" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
193
        svWork(12) <= X"60bdf636" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
194
        svWork(13) <= X"a023e387" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
195
        svWork(14) <= X"2870bbdc" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
196
        svWork(15) <= X"92e0aede" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
197 2 nuxi1209
 
198 3 nuxi1209
        svWork(16) <= X"acde4c0e" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
199
        svWork(17) <= X"032A6C52" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
200
        svWork(18) <= X"85fc0a19" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
201
        svWork(19) <= X"0BCFA6B6" after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns);
202
 
203 2 nuxi1209
 
204
        process(iClkReg, iRst_async)
205
        begin
206
                if iRst_async = '1' then
207 3 nuxi1209
                        svWriteCnt <= (others => '0');
208 2 nuxi1209
                        iValid_p <= '0';
209
                elsif rising_edge(iClkReg) then
210
                        if sMidStateValid = '1' then
211 3 nuxi1209
                                svWriteCnt <= svWriteCnt + '1';
212 2 nuxi1209
                        end if;
213
 
214 5 nuxi1209
                        if svWriteCnt(1 downto 0) = "11" and svWriteCnt(13 downto 2) <= conv_std_logic_vector(13, 12) then
215 2 nuxi1209
                                iValid_p <= '1';
216
                        else
217
                                iValid_p <= '0';
218
                        end if;
219
                end if;
220
        end process;
221
 
222
        process(iClkReg, iRst_async)
223
        begin
224
                if iRst_async = '1' then
225
                        ivAddr <= (others=>'0');
226
                        ivData <= (others=>'0');
227
                elsif rising_edge(iClkReg) then
228 5 nuxi1209
                        if svWriteCnt(1 downto 0) = "11" then
229
                                case svWriteCnt(13 downto 2) is
230 2 nuxi1209
                                        when X"000" =>
231
                                        ivAddr <= X"0";
232
                                        ivData <= svMidState(0);
233
 
234
                                        when X"001" =>
235
                                        ivAddr <= X"1";
236
                                        ivData <= svMidState(1);
237
 
238
                                        when X"002" =>
239
                                        ivAddr <= X"2";
240
                                        ivData <= svMidState(2);
241
 
242
                                        when X"003" =>
243
                                        ivAddr <= X"3";
244
                                        ivData <= svMidState(3);
245
 
246
                                        when X"004" =>
247
                                        ivAddr <= X"4";
248
                                        ivData <= svMidState(4);
249
 
250
                                        when X"005" =>
251
                                        ivAddr <= X"5";
252
                                        ivData <= svMidState(5);
253
 
254
                                        when X"006" =>
255
                                        ivAddr <= X"6";
256
                                        ivData <= svMidState(6);
257
 
258
                                        when X"007" =>
259
                                        ivAddr <= X"7";
260
                                        ivData <= svMidState(7);
261
 
262
                                        when X"008" =>
263
                                        ivAddr <= X"8";
264
                                        ivData <= svWork(16);
265
 
266
                                        when X"009" =>
267
                                        ivAddr <= X"9";
268
                                        ivData <= svWork(17);
269
 
270
                                        when X"00A" =>
271
                                        ivAddr <= X"A";
272
                                        ivData <= svWork(18);
273
 
274
                                        when X"00B" =>
275
                                        ivAddr <= X"B";
276 5 nuxi1209
                                        ivData <= svWork(19) - X"02";
277 2 nuxi1209
 
278
                                        when X"00C" =>
279
                                        ivAddr <= X"C";
280 5 nuxi1209
                                        ivData <= svWork(19) + X"02";
281 2 nuxi1209
 
282
                                        when X"00D" =>
283
                                        ivAddr <= cCMD_ADDR;
284
                                        ivData <= X"0000" & cCMD_START;
285
 
286
                                        when others =>
287
                                        ivAddr <= cCMD_ADDR;
288 3 nuxi1209
                                        ivData <= X"0000" & cCMD_NOP;
289 2 nuxi1209
                                end case;
290
                        end if;
291
                end if;
292
        end process;
293
 
294
 
295 3 nuxi1209
        sHashMidStateValidIn <= '1' after (cSTRAT_TEST * cPROC_CLK_PERIOD + 1 ns), '0' after (cSTRAT_TEST * cPROC_CLK_PERIOD + cPROC_CLK_PERIOD + 1 ns);
296 2 nuxi1209
 
297
        sha_256_chunk_inst_HashMidState : sha_256_chunk
298
                generic map(
299
                        gMSG_IS_CONSTANT => (others=>'0'),
300
                        gH_IS_CONST => (others=>'1'),
301 3 nuxi1209
                        gBASE_DELAY => gBASE_DELAY,
302
                        gOUT_VALID_GEN => true
303 2 nuxi1209
                )
304
                port map (
305
                        iClk => iClkProcess,
306
                        iRst_async => iRst_async,
307
                        iValid => sHashMidStateValidIn,
308
 
309
                        ivMsgDword => svWork(0 to 15),
310
 
311
                        ivH0 => X"6a09e667",
312
                        ivH1 => X"bb67ae85",
313
                        ivH2 => X"3c6ef372",
314
                        ivH3 => X"a54ff53a",
315
                        ivH4 => X"510e527f",
316
                        ivH5 => X"9b05688c",
317
                        ivH6 => X"1f83d9ab",
318
                        ivH7 => X"5be0cd19",
319
 
320
                        ovH0 => svHashMidStateDataOut(0),
321
                        ovH1 => svHashMidStateDataOut(1),
322
                        ovH2 => svHashMidStateDataOut(2),
323
                        ovH3 => svHashMidStateDataOut(3),
324
                        ovH4 => svHashMidStateDataOut(4),
325
                        ovH5 => svHashMidStateDataOut(5),
326
                        ovH6 => svHashMidStateDataOut(6),
327 3 nuxi1209
                        ovH7 => svHashMidStateDataOut(7),
328
 
329
                        oValid => sHashMidStateValidOut
330 2 nuxi1209
                );
331
 
332 3 nuxi1209
--      pipelines_without_reset_Valid : pipelines_without_reset
333
--              GENERIC map(gBUS_WIDTH => 1, gNB_PIPELINES => (64 * gBASE_DELAY + 1))
334
--              PORT map(
335
--                      iClk => iClkProcess,
336
--                      iInput => sHashMidStateValidIn,
337
--                      ivInput => (others=>'0'),
338
--                      oDelayed_output => sHashMidStateValidOut,
339
--                      ovDelayed_output => open
340
--              );
341 2 nuxi1209
 
342
        process(iClkProcess)
343
        begin
344
                if rising_edge(iClkProcess) then
345
                        if sHashMidStateValidOut = '1' then
346
                                svMidState <= svHashMidStateDataOut;
347
                                sMidStateValid <= '1';
348
                        end if;
349
                end if;
350
        end process;
351
 
352
end TB_ARCHITECTURE;
353
 
354
configuration TESTBENCH_FOR_btc_dsha of btc_dsha_tb is
355
        for TB_ARCHITECTURE
356
                for UUT : btc_dsha
357
                        use entity work.btc_dsha(behavioral);
358
                end for;
359
        end for;
360
end TESTBENCH_FOR_btc_dsha;
361
 

powered by: WebSVN 2.1.0

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