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

Subversion Repositories bch_configurable

[/] [bch_configurable/] [trunk/] [testbench/] [sim_top.v] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 Success105
`timescale 1ns/100ps
2
module sim_top;
3
 
4
 
5
reg I_clk;
6
reg I_rst;
7
 
8
reg [31:0] S_data_random1 = 0;
9
reg [31:0] S_data_random2 = 0;
10
reg [31:0] S_data_random3 = 0;
11
reg [31:0] S_data_random4 = 0;
12
 
13
reg S_start_id = 0;
14
wire [127:0] S_data_random;
15
initial
16
begin
17
    I_clk = 0;
18
        forever #5 I_clk = !I_clk;
19
end
20
 
21
initial
22
begin
23
        I_rst = 0;
24
        #100
25
        forever
26
        begin
27
            @(posedge I_clk);
28
                T_random_gen;
29
        end
30
end
31
 
32
initial
33
begin
34
        S_start_id = 0;
35
    #120
36
        @(posedge I_clk);
37
        S_start_id = 1;
38
        @(posedge I_clk);
39
        S_start_id = 0;
40
end
41
 
42
task T_random_gen;
43
begin
44
        S_data_random1 = $random;
45
        S_data_random2 = $random;
46
        S_data_random3 = $random;
47
        S_data_random4 = $random;
48
end
49
endtask
50
 
51
 
52
assign S_data_random = {S_data_random4,S_data_random3,S_data_random2,S_data_random1};
53
localparam C_FRAME_LEN = 64;
54
genvar S_i;
55
generate
56
for(S_i=0;S_i<1;S_i=S_i+1)
57
begin:test
58
 
59
localparam C_DWIDTH_THREAD = 2**(S_i+1);
60
localparam C_INPUT_NUM = C_DWIDTH_THREAD*C_FRAME_LEN;
61
localparam C_COEF_NUM = (S_i<3) ? 15 : 4*(S_i+4);
62
localparam C_TOTALBIT_NUM = C_INPUT_NUM + C_COEF_NUM*(S_i+8);
63
//localparam C_TOTALBIT_NUM = C_INPUT_NUM + C_COEF_NUM*(S_i+8) - 4; //primpoly8 is not all 8 in genpoly,one in the middle is 4
64
localparam C_PRIMPOLY_ORDER = S_i + 8;
65
localparam C_GENPOLY = (S_i == 0) ? 'h11d : ((S_i == 1) ? 'h211 : ((S_i == 2) ? 'h409 : ((S_i == 3) ? 'h805 : ((S_i == 4) ? 'h1053 : ((S_i == 5) ? 'h201b : 'h4443)))));
66
localparam C_SEARCH_THREAD_NUM = 2**S_i;
67
localparam C_BYTE_NUM = C_TOTALBIT_NUM/C_DWIDTH_THREAD;
68
localparam C_COEF_NUM2 = C_COEF_NUM;
69
 
70
wire [C_DWIDTH_THREAD-1:0] S_data;
71
reg [C_DWIDTH_THREAD-1:0] S_data_d;
72
wire S_data_v;
73
wire S_data_sof;
74
wire S_data_eof;
75
reg S_data_v_d;
76
reg S_data_sof_d;
77
reg S_data_eof_d;
78
wire [1:0] S_result;
79
reg I_data_v;
80
reg I_data_sof;
81
reg I_data_eof;
82
integer S_err_byte [C_COEF_NUM2-1 : 0];
83
reg [C_DWIDTH_THREAD-1:0] S_err_bit [C_COEF_NUM2-1 : 0] ;
84
integer S_err_num;
85
 
86
reg [7:0] S_encode_cnt = 0;
87
reg [7:0] S_cnt = 0;
88
reg S_data_v_2d = 0;
89
 
90
test_bch_encode
91
#(
92
.C_DWIDTH         (C_DWIDTH_THREAD        ),
93
.C_COEF_NUM       (C_COEF_NUM      ),
94
.C_PRIMPOLY_ORDER (C_PRIMPOLY_ORDER),
95
.C_PRIM_POLY      (C_GENPOLY       )
96
)
97
test_bch_encode_inst
98
(
99
.I_clk       (I_clk      ),
100
.I_rst       (I_rst      ),
101
.I_data      (S_data_random[C_DWIDTH_THREAD-1:0]),
102
.I_data_v    (I_data_v   ),
103
.I_data_sof  (I_data_sof ),
104
.I_data_eof  (I_data_eof ),
105
.O_data      (S_data     ),
106
.O_data_v    (S_data_v   ),
107
.O_data_sof  (S_data_sof ),
108
.O_data_eof  (S_data_eof )
109
);
110
 
111
always @(posedge I_clk)
112
begin
113
    if(S_start_id || S_result[1] || S_cnt != 0)
114
        begin
115
            if(S_cnt == C_FRAME_LEN)
116
                    S_cnt <= 'd0;
117
                else
118
                    S_cnt <= S_cnt + 'd1;
119
        end
120
end
121
 
122
always @(posedge I_clk)
123
begin
124
    I_data_v <= (S_cnt != 'd0);
125
        I_data_sof <= S_cnt == 'd1;
126
        I_data_eof <= S_cnt == C_FRAME_LEN;
127
end
128
 
129
integer ii;
130
 
131
initial
132
begin
133
        forever
134
        begin
135
    wait(I_data_sof || S_result[1]);
136
        S_err_num = {$random}%C_COEF_NUM;
137
        for(ii=0;ii<C_COEF_NUM2;ii=ii+1)
138
        begin
139
        S_err_byte[ii] = {$random}%C_BYTE_NUM;
140
        S_err_bit[ii] = 1<<({$random}%C_DWIDTH_THREAD);
141
        end
142
        @(posedge I_clk);
143
        end
144
end
145
 
146
integer jj;
147
 
148
always @(posedge I_clk)
149
begin
150
    if(S_data_v)
151
                S_encode_cnt <= S_encode_cnt + 'd1;
152
        else
153
            S_encode_cnt <= 'd0;
154
end
155
 
156
always @(posedge I_clk)
157
begin
158
    if(S_data_v)
159
        begin
160
                S_data_d = S_data;
161
            for(jj=0;jj<C_COEF_NUM2;jj=jj+1)
162
                begin
163
                        if(S_encode_cnt==S_err_byte[jj])
164
                                S_data_d = S_data ^ S_err_bit[jj];
165
                end
166
        end
167
end
168
 
169
always @(posedge I_clk)
170
begin
171
    S_data_sof_d <= S_data_sof;
172
        S_data_eof_d <= S_data_eof;
173
        S_data_v_d <= S_data_v;
174
        S_data_v_2d <= S_data_v_d;
175
end
176
 
177
tb_encode
178
#(
179
.C_DWIDTH            (C_DWIDTH_THREAD),
180
.C_COEF_NUM          (C_COEF_NUM),
181
.C_PRIMPOLY_ORDER    (C_PRIMPOLY_ORDER),
182
.C_GENPOLY           (C_GENPOLY),
183
.C_INPUT_NUM         (C_INPUT_NUM),
184
.C_SEARCH_THREAD_NUM (C_SEARCH_THREAD_NUM),
185
.C_TOTALBIT_NUM      (C_TOTALBIT_NUM)
186
)
187
tb_encode_inst
188
(
189
.I_clk                     (I_clk),
190
.I_rst                     (I_rst),
191
.I_data                    (S_data_d),
192
.I_data_v                  (S_data_v_d),
193
.I_data_sof                (S_data_sof_d),
194
.I_data_eof                (S_data_eof_d),
195
.I_data_ori                (S_data_random[C_DWIDTH_THREAD-1:0]),
196
.I_data_v_ori              (I_data_v),
197
.I_data_sof_ori            (I_data_sof),
198
.I_data_eof_ori            (I_data_eof),
199
.O_result                  (S_result)
200
);
201
integer fid1;
202
integer fid2;
203
initial
204
begin
205
    fid1 = $fopen("data1.txt");
206
        fid2 = $fopen("data2.txt");
207
end
208
always @(posedge I_clk)
209
begin
210
    if(S_data_v_2d)
211
                $fdisplay(fid1,"%d",S_data_d);
212
        if(I_data_v)
213
            $fdisplay(fid2,"%d",S_data_random[C_DWIDTH_THREAD-1:0]);
214
end
215
 
216
always @(posedge I_clk)
217
begin
218
    if(S_result[1])
219
        begin
220
                $display("width is %d,input number is %d,C_COEF_NUM is %d,total number is %d,prime order is %d,search thread is %d",C_DWIDTH_THREAD,C_INPUT_NUM,C_COEF_NUM,C_TOTALBIT_NUM,C_PRIMPOLY_ORDER,C_SEARCH_THREAD_NUM);
221
            if(S_result[0])
222
                        begin
223
                                $display("bch is right");
224
                        end
225
                else
226
                        begin
227
                                $display("bch is wrong");
228
                                $stop();
229
                        end
230
        end
231
end
232
 
233
end
234
endgenerate
235
 
236
 
237
 
238
endmodule

powered by: WebSVN 2.1.0

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