n
80 @(posedge eth_tx_clk)
81 if(dout_vld)begin
82 if(dout_sop)begin
83 dout_buf[0] = dout;
84 j = 1;
85 end
86 else if(dout_eop)begin
87 dout_buf[j] = dout;
88 j = j+1;
89 packet_check;
90 end
91 else begin
92 dout_buf[j] = dout;
93 j = j+1;
94 end
95 end
96 end
97 end
98
99 /***********************************score board******************************************/
100 integer fid;
101 initial begin
102 fid = $fopen("test.txt");
103 $fdisplay(fid," Start testing \n");
104 #SIM_TIM;
105 if(err_flag)
106 $fdisplay(fid,"Check is failed\n");
107 else
108 $fdisplay(fid,"Check is successful\n");
109 $fdisplay(fid," Testing is finished \n");
110 $fclose(fid);
111 $stop;
112 end
113
114 /***********************************子任务******************************************/
115 //包生成子任务
116 task packet_gen;
117 input [16-1:0] length;
118 input [2-1:0] invalid_byte;
119 integer i;
120 begin
121 len[gen_time] = length;
122 mod[gen_time] = invalid_byte;
123
124 for(i = 1;i<=length;i=i+1)begin
125 if(rdy == 1)begin
126 din_vld = 1;
127 if(i==1)
128 din_sop = 1;
129 else if(i == length)begin
130 din_eop = 1;
131 din_mod = invalid_byte;
132 end
133 else begin
134 din_sop = 0;
135 din_eop = 0;
136 din_mod = 0;
137 end
138 din = i ;
139 end
140
141 else begin
142 din_sop = din_sop;
143 din_eop = din_eop;
144 din_vld = 0;
145 din_mod = din_mod;
146 din = din;
147 i = i - 1;
148 end
149
150 #(USER_CLK_CYC*1);
151 end
152 packet_initial;
153 gen_time = gen_time + 1;
154 end
155 endtask
156
157 task packet_initial;
158 begin
159 din_sop = 0;
160 din_eop = 0;
161 din_vld = 0;
162 din = 0;
163 din_mod = 0;
164 end
165 endtask
166
167 //包检测子任务
168 task packet_check;
169 integer k;
170 integer num,packet_len;
171 begin
172 num = 1;
173 $fdisplay(fid,"%dth:Packet checking...\n",chk_time);
174 packet_len = 4*len[chk_time]-mod[chk_time];
175 if(j != packet_len)begin
176 $fdisplay(fid,"Length of the packet is wrong.\n");
177 err_flag = 1;
178 disable packet_check;
179 end
180
181 for(k=0;k<packet_len;k=k+1)begin
182 if(k%4 == 3)begin
183 if(dout_buf[k] != num)begin
184 $fdisplay(fid,"Data of the packet is wrong!\n");
185 err_flag = 1;
186 end
187 num = num+1;
188 end
189 else if(dout_buf[k] != 0)begin
190 $fdisplay(fid,"Data of the packet is wrong,it should be zero!\n");
191 err_flag = 1;
192 end
193 end
194 chk_time = chk_time + 1;
195 end
196 endtask
197
198 endmodule
tx_buffer_tb
可见主要是task编写及文件读写操作帮了大忙,如果都用眼睛看波形来验证设计正确性,真的是要搞到眼瞎。为保证测试完备性,测试包生成task可通过输入接口产生不同长度和无效字节数的递增数据包。testbench中每检测到输出包尾指示信号eop即调用packet_check task对数值进行检测。本文的testbench结构较具通用性,可以用来验证任意对数据包进行处理的逻辑单元。
之前Modelsim独立仿真带有IP核的Vivado工程时经常报错,只好使用Vivado自带的仿真工具。一直很头痛这个问题,这次终于有了进展!首先按照常规流程使用Vivado调用Modelsim进行行为仿真,启动后会在工程目录下产生些有用的文件,帮助我们脱离Vivado进行独立仿真。
在新建Modelsim工程时,在红框内选择Vivado工程中<project>.sim -> sim_1 -> behav下的modelsim.ini文件。之后添加文件包括:待测试设计文件、testbench以及IP核可综合文件。第三个文件在<project>.srcs -> sources_1 -> ip -> <ip_name> -> synth下。
现在可以顺利启动仿真了。我们来看下仿真结果:
文件中信息打印情况:
从波形和打印信息的结果来看,基本可以证明数据缓存及位宽转换模块逻辑功能无误。为充分验证要进一步给出覆盖率较高的测试数据集,后期通过编写do文 |