-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdouble2b_testbench.v
130 lines (105 loc) · 2.68 KB
/
double2b_testbench.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
`timescale 1ns / 1ns
`include "double2binary.v"
module double2b_testbench ();
reg clk,rst;
reg i_ready;
reg [63:0] i_double;
wire o_valid;
wire [13:0] integer_part;//取出来的整数部分
wire [3:0] fraction_part;//取出来的小数部分
wire [2:0] output_type;
parameter PERIOD = 10;
//internal
parameter NUMBER = 46;
reg [63:0] i_input[0:NUMBER-1];
//reg [63:0] i_output[0:NUMBER-1];
//reg [63:0] float_o_valid[0:NUMBER-1];
reg [13:0] i_integer_part[0:NUMBER-1];
reg [3:0] i_fraction_part[0:NUMBER-1];
reg [2:0] i_output_type[0:NUMBER-1];
integer i;
initial
begin
clk = 0;
forever
#(PERIOD/2) clk = ~clk;
end
double2binary double2binary_inst(
.clk(clk),
.rst(rst),
.i_ready(i_ready),
.i_double(i_double),
.o_valid(o_valid),
.sign(sign),
.integer_part(integer_part),
.fraction_part(fraction_part),
.output_type(output_type)
);
//读取输入输出
task read_input_output;
begin
$readmemh("float_input.txt",i_input);
//$readmemh("float_output.txt",i_output);
end
endtask
task initialization;
begin
rst = 1'b0;
#PERIOD;
rst = 1'b1;
#PERIOD;
end
endtask
task calculate;
begin
for(i=0;i<=NUMBER-1;i=i+1)
begin
/*rst = 1'b0;
#PERIOD;
rst = 1'b1;
#PERIOD;*/
$display("%t i=%d",$time,i);
//$display("%t o_valid=%b",$time,o_valid);
i_double=i_input[i];
#PERIOD;
i_ready =1'b1;
#50;
//$display("%t i_double=%h",$time,i_double);
//$display("%t integer_part=%h",$time,integer_part);
//$display("%t fraction_part=%h",$time,fraction_part);
//$display("%t output_type=%h",$time,output_type);
/*integer_part=i_integer_part[i];
$display("%t integer_part=%h",$time,integer_part);
fraction_part=i_fraction_part[i];
$display("%t fraction_part=%h",$time,fraction_part);
output_type=i_output_type[i];
$display("%t output_type=%h",$time,output_type);*/
$display("------------------------------------------------------------");
i_ready =1'b0;
end
end
endtask
initial
begin
$monitor("%t %m MON0 input:%h o_valid: %b sign: %b integer_part: %b fraction_part: %b output_type: %d",$time,i_double,o_valid,sign,integer_part,fraction_part,output_type);
//i_double = 64'h4000_0000_0000_0000;
////2 inte_part:10 frac_part:0000 output_type:0
//i_double = 64'h3FF0000000000000;
////1 inte_part:1 frac_part:0000 output_type:0
//i_double = 64'h3FE0000000000000;
////0.5 inte_part:0 frac_part:1000 output_type:0
//i_double = 64'h7FF8000000000000;
////NAN inte_part:0 frac_part:1000 output_type:1
//i_double = 64'h7FF0000000000000;
////+INF inte_part:0 frac_part:1000 output_type:2
//i_double = 64'hFFF0000000000000;
////+INF inte_part:0 frac_part:1000 output_type:3
//i_ready = 1'b1;
$display("Begin calculation:");
read_input_output;
initialization;
calculate;
#5000
$finish;
end
endmodule