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

Subversion Repositories unconfuser

[/] [unconfuser/] [trunk/] [ctb.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 protik
//
2
// This is a simple test bench for the confuser
3
//
4
// Author: Morris Jones
5
// San Jose State University
6
//
7
//
8
 
9
//`timescale 1ns/100ps
10
 
11
module ctb(clk,reset,push,din,Caddr,Cdata,Cpush,pushout,stopout,dout,sid0,sid1,
12
                sid2,sid3,sid4);
13
input clk;
14
output reset;
15
output push;
16
output [7:0] din;
17
input [7:0] dout;
18
input [31:0] sid0,sid1,sid2,sid3,sid4;
19
output [6:0] Caddr;
20
output [7:0] Cdata;
21
input pushout;
22
output stopout;
23
output Cpush;
24
 
25
reg [6:0] Caddr_raw;
26
reg [7:0] Cdata_raw;
27
reg Cpush_raw;
28
reg push_raw;
29
reg reset_raw;
30
reg [7:0] din_raw;
31
reg stopout_raw;
32
 
33
reg [7:0] fifo[0:65536*2];
34
reg [16:0] rp,wp;
35
reg [7:0] fifout[0:65536*2];
36
reg [17:0] rpo,wpo;
37
 
38
 
39
reg [160:0] crc[0:3];
40
//
41
// This is the pad registers
42
//
43
reg [159:0] pad0;
44
reg [160:0] pad1;
45
reg [161:0] pad2;
46
reg [162:0] pad3;
47
reg [31:0] injector;
48
reg [39:0] padsel;
49
reg [31:0] cdata;
50
 
51
//
52
// X^160+X^139+X^119+X^98+X^79+X^40+X^20+1
53
//
54
//                                     1        9              6               3        0
55
//                                     2        6        4        2
56
//                                     8
57
//
58
parameter [159:0] poly0=   160'H00000800_00800004_00008000_00000100_00100001;
59
//
60
//  X161+X140+X121+X100+X80+X60+X40+X20+1
61
//
62
parameter [160:0] poly1= 161'H0_00001000_02000010_00010000_10000100_00100001;
63
//
64
//  X162+X141+X121+X100 +X80+X60+X40+X20+1
65
//
66
//                                     1        9              6               3        0
67
//                                     2        6        4        2
68
//                                     8
69
//
70
 
71
parameter [161:0] poly2= 162'H0_00002000_02000010_00010000_10000100_00100001;
72
//
73
//  X163+X142+X122+X102+X82+X61+X41+X20+1
74
//
75
//                                     1        9              6               3        0
76
//                                     2        6        4        2
77
//                                     8
78
//
79
parameter [162:0] poly3= 162'H0_00004000_04000040_00040000_20000200_00100001;
80
 
81
//
82
// X32+X27+X21+X16+X10+X5+1
83
//
84
parameter [31:0] pinjector=32'H0821_0421;
85
 
86
//
87
// X40+X34+X27+X19+X12+X6+1
88
//
89
parameter [39:0] ppadsel = 40'H04_0808_1041;
90
 
91
//
92
// X32+X31+X29+X28+X26+X25+X24+X22+X21+X13+X11+X9+X8+X5+1
93
//
94
parameter [31:0] pcdata= 32'HB760_2B21;
95
 
96
integer fbt[0:3];
97
 
98
integer i;
99
integer data_out=0;
100
 
101
task per;
102
input [7:0] data;
103
begin
104
        fifo[wp]=data;
105
        wp=wp+1;
106
        data_out=data_out+1;
107
        if(wp==rp) $display("Come on Morris, FIFO overflow");
108
end
109
endtask
110
 
111
task pod;
112
input [7:0] data;
113
begin
114
        fifout[wpo]=data;
115
        wpo=wpo+1;
116
        if(wpo==rpo) $display("You overan the output fifo Morris");
117
end
118
endtask
119
 
120
task setpad;
121
input [6:0] regsel;
122
input [7:0] regval;
123
begin
124
//$display("Setting %d to %h",regsel,regval);
125
        case (regsel)
126
        // pad0
127
         0:  pad0[  7:  0]=regval;
128
         1:  pad0[ 15:  8]=regval;
129
         2:  pad0[ 23: 16]=regval;
130
         3:  pad0[ 31: 24]=regval;
131
         4:  pad0[ 39: 32]=regval;
132
         5:  pad0[ 47: 40]=regval;
133
         6:  pad0[ 55: 48]=regval;
134
         7:  pad0[ 63: 56]=regval;
135
         8:  pad0[ 71: 64]=regval;
136
         9:  pad0[ 79: 72]=regval;
137
         10: pad0[ 87: 80]=regval;
138
         11: pad0[ 95: 88]=regval;
139
         12: pad0[103: 96]=regval;
140
         13: pad0[111:104]=regval;
141
         14: pad0[119:112]=regval;
142
         15: pad0[127:120]=regval;
143
         16: pad0[135:128]=regval;
144
         17: pad0[143:136]=regval;
145
         18: pad0[151:144]=regval;
146
         19: pad0[159:152]=regval;
147
         20: ;
148
         // pad1
149
         21: pad1[  7:  0]=regval;
150
         22: pad1[ 15:  8]=regval;
151
         23: pad1[ 23: 16]=regval;
152
         24: pad1[ 31: 24]=regval;
153
         25: pad1[ 39: 32]=regval;
154
         26: pad1[ 47: 40]=regval;
155
         27: pad1[ 55: 48]=regval;
156
         28: pad1[ 63: 56]=regval;
157
         29: pad1[ 71: 64]=regval;
158
         30: pad1[ 79: 72]=regval;
159
         31: pad1[ 87: 80]=regval;
160
         32: pad1[ 95: 88]=regval;
161
         33: pad1[103: 96]=regval;
162
         34: pad1[111:104]=regval;
163
         35: pad1[119:112]=regval;
164
         36: pad1[127:120]=regval;
165
         37: pad1[135:128]=regval;
166
         38: pad1[143:136]=regval;
167
         39: pad1[151:144]=regval;
168
         40: pad1[159:152]=regval;
169
         41: pad1[160]=regval[0];
170
         // pad2
171
         42: pad2[  7:  0]=regval;
172
         43: pad2[ 15:  8]=regval;
173
         44: pad2[ 23: 16]=regval;
174
         45: pad2[ 31: 24]=regval;
175
         46: pad2[ 39: 32]=regval;
176
         47: pad2[ 47: 40]=regval;
177
         48: pad2[ 55: 48]=regval;
178
         49: pad2[ 63: 56]=regval;
179
         50: pad2[ 71: 64]=regval;
180
         51: pad2[ 79: 72]=regval;
181
         52: pad2[ 87: 80]=regval;
182
         53: pad2[ 95: 88]=regval;
183
         54: pad2[103: 96]=regval;
184
         55: pad2[111:104]=regval;
185
         56: pad2[119:112]=regval;
186
         57: pad2[127:120]=regval;
187
         58: pad2[135:128]=regval;
188
         59: pad2[143:136]=regval;
189
         60: pad2[151:144]=regval;
190
         61: pad2[159:152]=regval;
191
         62: pad2[161:160]=regval[1:0];
192
        // pad3
193
         63: pad3[  7:  0]=regval;
194
         64: pad3[ 15:  8]=regval;
195
         65: pad3[ 23: 16]=regval;
196
         66: pad3[ 31: 24]=regval;
197
         67: pad3[ 39: 32]=regval;
198
         68: pad3[ 47: 40]=regval;
199
         69: pad3[ 55: 48]=regval;
200
         70: pad3[ 63: 56]=regval;
201
         71: pad3[ 71: 64]=regval;
202
         72: pad3[ 79: 72]=regval;
203
         73: pad3[ 87: 80]=regval;
204
         74: pad3[ 95: 88]=regval;
205
         75: pad3[103: 96]=regval;
206
         76: pad3[111:104]=regval;
207
         77: pad3[119:112]=regval;
208
         78: pad3[127:120]=regval;
209
         79: pad3[135:128]=regval;
210
         80: pad3[143:136]=regval;
211
         81: pad3[151:144]=regval;
212
         82: pad3[159:152]=regval;
213
         83: pad3[162:160]=regval[2:0];
214
         // injector
215
         84: injector[ 7: 0]=regval;
216
         85: injector[15: 8]=regval;
217
         86: injector[23:16]=regval;
218
         87: injector[31:24]=regval;
219
         // padsel
220
         88: padsel[ 7: 0]=regval;
221
         89: padsel[15: 8]=regval;
222
         90: padsel[23:16]=regval;
223
         91: padsel[31:24]=regval;
224
         92: padsel[39:32]=regval;
225
 
226
         default: ;
227
        endcase
228
        Cdata_raw=regval;
229
        Caddr_raw=regsel;
230
        Cpush_raw=1;
231
        @(posedge(clk));
232
        #0.1;
233
        Cdata_raw=R8(3);
234
        Caddr_raw=R8(3);
235
        Cpush_raw=0;
236
        #0.1;
237
        if(R8(3) > 125) begin
238
          @(posedge(clk));
239
          #0.2;
240
        end
241
 
242
end
243
endtask
244
 
245
assign Cdata=Cdata_raw;
246
assign Caddr=Caddr_raw;
247
assign Cpush=Cpush_raw;
248
assign push=push_raw;
249
assign stopout=stopout_raw;
250
//
251
// loads up a set of data for the routine...
252
//
253
task loadkey;
254
integer i;
255
reg [7:0] rr;
256
begin
257
  @(posedge(clk));
258
  #0.1;
259
  for(i=0; i < 95; i=i+1) begin
260
        rr=R8(i&4);
261
        setpad(i,rr);
262
  end
263
end
264
 
265
endtask
266
//
267
//
268
//
269
 
270
//
271
function [31:0] scrc;
272
input [1:0] wh;
273
reg [160:0] wcrc;
274
reg top;
275
integer i;
276
begin
277
        wcrc=crc[wh];
278
        for(i=0; i < 67; i=i+1) begin
279
          top=wcrc[160];
280
          wcrc= { wcrc[159:0],top };
281
          if(top) begin
282
            wcrc[fbt[wh]]=~wcrc[fbt[wh]];
283
          end
284
        end
285
//$display("scrc wh %d scrcval %h",wh,wcrc[63:32]);
286
        crc[wh]=wcrc;
287
        scrc=wcrc[63:32];
288
end
289
 
290
endfunction
291
//
292
//
293
//
294
function [7:0] R8;
295
input [1:0] wh;
296
reg[31:0] wr;
297
begin
298
        wr = scrc(wh);
299
        wr=wr >> wr[31:29];
300
        R8=wr[7:0];
301
end
302
endfunction
303
 
304
task stepPad0;
305
reg hob;
306
begin
307
        hob=pad0[159];
308
        pad0={pad0[158:0],1'B0};
309
        if(hob) pad0 = pad0 ^ poly0;
310
end
311
endtask
312
 
313
task stepPad1;
314
reg hob;
315
begin
316
        hob=pad1[160];
317
        pad1={pad1[159:0],1'B0};
318
        if(hob) pad1 = pad1 ^ poly1;
319
end
320
endtask
321
 
322
task waitempty;
323
integer ix;
324
integer wt;
325
begin
326
        wt=data_out*150;
327
        while(data_out > 0) begin
328
                @(posedge(clk));
329
                wt=wt-1;
330
                if(wt <= 0) begin
331
                        $display("Ran out of time waiting for you to send back all the answers");
332
                        $finish;
333
                end
334
        end
335
        for(ix=0; ix < 300; ix=ix+1) @(posedge(clk));
336
end
337
endtask
338
 
339
 
340
task stepPad2;
341
reg hob;
342
begin
343
        hob=pad2[161];
344
        pad2={pad2[160:0],1'B0};
345
        if(hob) pad2 = pad2 ^ poly2;
346
end
347
endtask
348
 
349
task stepPad3;
350
reg hob;
351
begin
352
        hob=pad3[162];
353
        pad3={pad3[161:0],1'B0};
354
        if(hob) pad3 = pad3 ^ poly3;
355
end
356
endtask
357
//
358
// Move all 4 pads forward one
359
//
360
task stepPads;
361
begin
362
        stepPad0;
363
        stepPad1;
364
        stepPad2;
365
        stepPad3;
366
end
367
endtask
368
//
369
// steps the injector forward one...
370
//
371
task stepinjector;
372
reg hob;
373
begin
374
        hob=injector[31];
375
        injector={injector[30:0],1'B0};
376
        if(hob) injector=injector ^ pinjector;
377
//  $display(" si %h",injector);
378
end
379
endtask
380
//
381
// This steps the pad selector
382
//
383
task steppadsel;
384
reg hob;
385
begin
386
        hob=padsel[39];
387
        padsel={padsel[38:0],1'B0};
388
        if(hob) padsel=padsel ^ ppadsel;
389
end
390
endtask
391
//
392
// Steps the bit provided as bitin into the cdata register
393
//
394
task stepcdata;
395
input bitin;
396
reg hob;
397
begin
398
//  $display("pad3 %h ps %d padsel %h pad %b crc %h",pad3,
399
//  {padsel[31],padsel[3],padsel[5],padsel[19],padsel[8]}
400
//  ,padsel,bitin,cdata);
401
        hob=cdata[31];
402
        cdata={cdata[30:0],bitin};
403
        if(hob) cdata = cdata ^ pcdata;
404
end
405
endtask
406
function selpad;
407
input [1:0] dummy;
408
integer ps;
409
begin
410
        ps={padsel[31],padsel[3],padsel[5],padsel[19],padsel[8]};
411
        case(ps)
412
          0: selpad=pad1[15];
413
          1: selpad=pad0[37];
414
          2: selpad=pad2[73];
415
          3: selpad=pad3[99];
416
          4: selpad=pad0[121];
417
          5: selpad=pad1[130];
418
          6: selpad=pad3[15];
419
          7: selpad=pad2[9];
420
          8: selpad=pad3[97];
421
          9: selpad=pad2[140];
422
          10: selpad=pad1[4];
423
          11: selpad=pad0[88];
424
          12: selpad=pad0[33];
425
          13: selpad=pad1[75];
426
          14: selpad=pad2[35];
427
          15: selpad=pad3[155];
428
          16: selpad=pad2[28];
429
          17: selpad=pad1[150];
430
          18: selpad=pad3[29];
431
          19: selpad=pad0[144];
432
          20: selpad=pad0[127];
433
          21: selpad=pad1[125];
434
          22: selpad=pad2[0];
435
          23: selpad=pad3[5];
436
          24: selpad=pad0[110];
437
          25: selpad=pad3[87];
438
          26: selpad=pad1[19];
439
          27: selpad=pad2[82];
440
          28: selpad=pad0[48];
441
          29: selpad=pad1[47];
442
          30: selpad=pad2[46];
443
          31: selpad=pad3[51];
444
        endcase
445
end
446
endfunction
447
//
448
// confuse 4 bytes of information
449
//
450
integer pamt;
451
 
452
task conf4;
453
input [7:0] b3,b2,b1,b0;
454
integer ix;
455
begin
456
        while(data_out > 60000) @(posedge(clk));
457
        @(posedge(clk));
458
        cdata[31:24]=b3;
459
        cdata[23:16]=b2;
460
        cdata[15: 8]=b1;
461
        cdata[ 7: 0]=b0;
462
        per(b3);
463
        per(b2);
464
        per(b1);
465
        per(b0);
466
        pamt={1'b1,injector[30],injector[5],injector[9],injector[2],injector[27]};
467
        for(ix=0; ix < 39; ix=ix+1) stepinjector;
468
// $display("Stepped");
469
        for(ix=0; ix < pamt; ix=ix+1) begin
470
                stepcdata(selpad(0));
471
                stepPads;
472
                steppadsel;
473
        end
474
//$display("send CRC results %h",cdata);
475
        pod(cdata[31:24]);
476
        pod(cdata[23:16]);
477
        pod(cdata[15: 8]);
478
        pod(cdata[ 7: 0]);
479
        #40000;
480
end
481
endtask
482
 
483
//
484
// Set up the random number generator
485
//
486
integer ixw;
487
integer ixs;
488
initial begin
489
        Cpush_raw=0;
490
        push_raw=0;
491
        rp=0;
492
        wp=0;
493
        rpo=0;
494
        wpo=0;
495
        din_raw=8'Ha5;
496
        stopout_raw=0;
497
        #0.1;
498
//        $dumpfile("unconfuser.dump");
499
//        $dumpvars(0,ctb);
500
        $display("Starting up the test bench");
501
//      for(i=0; i < 32; i=i+1) begin
502
//              if(pcdata[i]==1) begin
503
//                      $display("cdata[%d]=1",i);
504
//              end
505
//      end
506
        crc[0]={sid0,sid1,sid2,sid3,sid4,1'b1};
507
        crc[1]={sid1,sid0,sid3,1'b1,sid2,sid4};
508
        crc[2]={sid3,sid2,sid4,sid1,1'b1,sid1};
509
        crc[3]={sid4,1'b1,sid3,sid2,sid1,sid0};
510
        fbt[0]=18;
511
        fbt[1]=39;
512
        fbt[2]=60;
513
        fbt[3]=101;
514
        reset_raw=1;
515
        #55;
516
        reset_raw=0;
517
        loadkey;
518
        for(ixw=0; ixw<25; ixw=ixw+1) begin
519
                conf4(0,0,0,0);
520
        end
521
        for(ixw=0; ixw < 25; ixw=ixw+1) begin
522
                conf4(8'Hff,8'Hff,8'Hff,8'Hff);
523
        end
524
        for(ixs=0; ixs < 5; ixs=ixs+1) begin
525
          $display("starting set %d",ixs);
526
          waitempty;
527
          loadkey;
528
          for(ixw=0; ixw<2500; ixw=ixw+1) begin
529
                while(data_out > 65500) begin
530
                        @(posedge(clk));
531
                        #0.4;
532
                end
533
                conf4(R8(0),R8(0),R8(2),R8(1));
534
          end
535
        end
536
        waitempty;
537
        $display("Run completed sucessfully");
538
        $finish;
539
end
540
 
541
assign reset=reset_raw;
542
//
543
// Check the data coming back...
544
//
545
always @(posedge(clk)) begin
546
        #0.1;
547
        if((pushout===1) && (stopout===0)) begin
548
          if(rp==wp) begin
549
            $display("Error --- You pushed something, and I'm not expecting anything");
550
            $finish;
551
          end
552
          if(fifo[rp]===dout) begin
553
            rp=rp+1;
554
            data_out=data_out-1;
555
          end
556
          else begin
557
            $display("Error --- Received %h expected %h",dout,fifo[rp]);
558
            $finish;
559
          end
560
        end
561
        stopout_raw=(R8(2)<66);
562
 
563
end
564
 
565
//
566
// Push data out to the fifo
567
//
568
always @(posedge(clk)) begin
569
        #1;
570
        push_raw=0;
571
        din_raw=R8(2);
572
        if(data_out < 56000) begin
573
          if(rpo != wpo) begin
574
            if(R8(3) < 150) begin
575
                push_raw=1;
576
                din_raw=fifout[rpo];
577
                rpo=rpo+1;
578
 
579
            end
580
          end
581
        end
582
end
583
assign din=din_raw;
584
 
585
 
586
endmodule
587
 
588
 
589
 

powered by: WebSVN 2.1.0

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