Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 34.20 KB | None | 0 0
  1. `timescale 1ns/1ns
  2. `define SIPP_UVM_TEST
  3.  
  4. `include "../rtl/cv_fft_reg_gen/cv_fft_regs_pkg.vh"
  5. `include "mvds_sipp_llb_params.inc"
  6. `include "sipp_func.inc"
  7. `include "sipp_lbc_types.inc"
  8. `include "sipp_lbc_func.inc"
  9. `include "sipp_fp_func.inc"
  10. //`include "cv_fft_dct_rom_values.inc"
  11. `include "/nfs/iir/disks/mvds_ip_release_disk001/vpu2p6_IP_REL/amc_vip/amc_vip_v0p0_y19ww34_0008/amc_vip/TESTBENCH/amc_ifs.inc"
  12. `include "/nfs/iir/disks/mvds_ip_release_disk001/vpu2p6_IP_REL/mvds_sipp_legacy_tb/mvds_sipp_legacy_tb_v0p0_y19ww33_0011/mvds_sipp_legacy_tb/TESTBENCH/pixel_ifs.inc"
  13.  
  14.  
  15. module tb_fft();
  16. integer seed;
  17. integer initialseed;
  18. int N, MODE, LINES;
  19. int nrpoints, nrlines, pixels_sent;
  20. int cbits = 15, thresh = 35000, input_addr = 0, cN;
  21. string TYPE, INTYPE, OUTTYPE, REORDER_BYPASS, INFORMAT, OUTFORMAT, DIMENSION;
  22.  
  23. integer args1 = $value$plusargs("SEED=%d",seed);
  24. integer args2 = $value$plusargs("N=%d",N);
  25. integer args3 = $value$plusargs("MODE=%d",MODE);
  26. integer args4 = $value$plusargs("TYPE=%s",TYPE);
  27. integer args5 = $value$plusargs("INTYPE=%s",INTYPE);
  28. integer args6 = $value$plusargs("OUTTYPE=%s",OUTTYPE);
  29. integer args7 = $value$plusargs("REORDER_BYPASS=%s",REORDER_BYPASS);
  30. integer args8 = $value$plusargs("INFORMAT=%s",INFORMAT);
  31. integer args9 = $value$plusargs("OUTFORMAT=%s",OUTFORMAT);
  32. integer args10 = $value$plusargs("DIMENSION=%s",DIMENSION);
  33. integer args11 = $value$plusargs("LINES=%d",LINES);
  34.  
  35. //FILE POINTERS
  36. integer fwr;
  37. integer logs, fwrinp_py, fwrinp, modelout;
  38. logic [1:0]transftype;//FFT -- IFFT -- DCT --IDCT
  39. logic ffttype;//1D -- 2D
  40. string stringformatter;
  41. int ignoreme = 0, matcherrors = 0, onebitmatcherrors = 0, readstotal = 0, run_number = 0;
  42.  
  43. logic [1:0]inptype;//COMPLEX -- REALPLANE -- CONJUGATE
  44. logic [1:0]inpformat;//FP16 U16
  45. logic outtype;
  46. logic [1:0]outformat;
  47. logic reorder_bypass;
  48.  
  49. logic [31:0] ignoremedata;
  50. logic [31:0] regdata;
  51. logic [31:0] regdata2;
  52. logic [31:0] regdata3;
  53. logic [31:0] model_data_out;
  54.  
  55. import upa_cmx_constants_pkg::*;
  56. import "DPI-C" function void start_model(input string filename, input int n, input int mode, input int nrb, input int input_type, input int output_type, input int reorder_bypass,input int input_format, input int output_format, input int lines, input int dimension);
  57.  
  58. `include "/nfs/iir/disks/mvds_ip_release_disk001/vpu2p6_IP_REL/amc_vip/amc_vip_v0p0_y19ww33_0007/amc_vip/TESTBENCH/amc_base_classes.inc"
  59.  
  60. parameter DRAM_BASE_ADR = 32'h8000_0000;
  61.  
  62. //defparam AMC_DW = 32;
  63.  
  64. localparam NUM_OF_MEMS = 4;
  65. localparam PRDATA_WIDTH = 32;
  66. localparam PWDATA_WIDTH = 32;
  67. localparam PADDR_WIDTH = 32;
  68.  
  69. // -----------------------------------------------------------------------------
  70. // Input and output declarations
  71. // -----------------------------------------------------------------------------
  72. // Clock and reset
  73.  
  74. logic clk;
  75. logic rst_n;
  76. int readerrors;
  77. initial begin
  78. clk = 0;
  79. forever begin
  80. #50;
  81. clk = ~clk;
  82. end
  83. end
  84.  
  85.  
  86. // --------------------------------------------
  87. // DFx
  88. // --------------------------------------------
  89.  
  90. logic fscan_clkungate;
  91. logic [NUM_OF_MEMS-1:0] test_enable;
  92. //input ctrl_mem_struct [NUM_OF_MEMS-1:0] cfg_mem_ctrl;
  93.  
  94. // --------------------------------------------
  95. // Interrupt
  96. // --------------------------------------------
  97.  
  98. logic fft_irq;
  99.  
  100.  
  101. // --------------------------------------------
  102. // APB3 INTERFACE
  103. // --------------------------------------------
  104.  
  105. logic [PADDR_WIDTH-1:0] paddr;
  106. logic penable;
  107. logic pwrite;
  108. logic [PWDATA_WIDTH-1:0] pwdata;
  109. logic psel;
  110. logic [PRDATA_WIDTH-1:0] prdata;
  111. logic pslverr;
  112. logic pready;
  113.  
  114. logic [31:0] tc_addr;
  115.  
  116. sipp_lbc_cfg cfg;
  117. logic en;
  118. logic [SIPP_FRM_WIDTH_W-1:0] img_width;
  119. logic [SIPP_FRM_HEIGHT_W-1:0] img_height;
  120. logic bfl_dec, bfl_inc;
  121. logic [SIPP_NLW-1:0] bfl;
  122.  
  123.  
  124. pix_if my_pi(clk);
  125.  
  126. amc_wif parent_wif(clk);//Parent interface
  127.  
  128. amc_rif fft_rif(clk);
  129. amc_wif fft_wif(clk);
  130.  
  131. virtual amc_wif vwif;//Virtual interface of the writing object
  132. virtual amc_rif vrif;//Virtual interface of the reading object
  133.  
  134. AMCIWrIf AmcWr;//Writing object
  135. AMCIRdIf AmcRd;//Reading object
  136.  
  137. event e_trans_done;
  138. event e_trans_done2;
  139. initial begin
  140. vwif = parent_wif;
  141. vrif = fft_rif;
  142. AmcWr = new (/* AmcWr */, 1, MXI_CMX_BASE_ADR, 'h20000, vwif, e_trans_done);
  143. AmcRd = new (/* AmcRd */, 2, MXI_CMX_BASE_ADR, 'h20000, vrif, e_trans_done);
  144. end
  145.  
  146.  
  147. tb_sipp_parent #(.DW(32),.NC(1), .NP(1))
  148. tb_sipp_parent_i(
  149. .clk(clk),
  150. .rst_n(rst_n),
  151. .cfg(cfg),
  152. .img_width(img_width),
  153. .img_height(img_height),
  154. .en(en),
  155. .bfl_dec(bfl_dec),
  156. .bfl_inc(bfl_inc),
  157. .bfl(bfl),
  158. .pi(my_pi),
  159. .wc(parent_wif)
  160. );
  161.  
  162. cv_fft_wrap cv_fft_wrap_i(
  163. .clk(clk),
  164. .rst_n(rst_n),
  165. .fscan_clkungate(fscan_clkungate),
  166. .test_enable(1'b0),
  167. .fft_irq(fft_irq),
  168. .cfg_mem_ctrl(23'd0),
  169. .paddr(paddr),
  170. .penable(penable),
  171. .pwrite(pwrite),
  172. .pwdata(pwdata),
  173. .psel(psel),
  174. .prdata(prdata),
  175. .pslverr(pslverr),
  176. .pready(pready),
  177. .rd_client_o(fft_rif.o),
  178. .rd_client_i(fft_rif.i),
  179. .wr_client_o(fft_wif.o),
  180. .wr_client_i(fft_wif.i)
  181. );
  182.  
  183. always @(posedge fft_wif.o.req)begin
  184. if(ffttype == 1'b0 ) begin //|| run_number == 1
  185. $write("RTL OUTPUT:\n");
  186. while(fft_wif.o.req == 1'b1)begin
  187. #1;
  188. if(transftype < 2) begin
  189. $fwrite(fwr,"%h %h %h %h %h %h %h %h ",fft_wif.o.data[31:16],fft_wif.o.data[15:0],fft_wif.o.data[63:48],fft_wif.o.data[47:32],fft_wif.o.data[95:80],fft_wif.o.data[79:64],fft_wif.o.data[127:112],fft_wif.o.data[111:96]);
  190. end
  191. else begin
  192. $fwrite(fwr,"%h %h %h %h %h %h %h %h ",fft_wif.o.data[15:0],fft_wif.o.data[31:16],fft_wif.o.data[47:32],fft_wif.o.data[63:48],fft_wif.o.data[79:64],fft_wif.o.data[95:80],fft_wif.o.data[111:96],fft_wif.o.data[127:112]);
  193. end
  194.  
  195. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);//--------------------------------------------1
  196. if(ignoremedata == fft_wif.o.data[31:0])
  197. $write("\033[1;32m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[31:16]),stringformatter,trans_fp16(fft_wif.o.data[15:0]));
  198. else begin
  199. if((ignoremedata[31:16] - fft_wif.o.data[31:16] == 1) || (ignoremedata[15:0] - fft_wif.o.data[15:0] == 1) || (ignoremedata[31:16] - fft_wif.o.data[31:16] == -1)||(ignoremedata[15:0] - fft_wif.o.data[15:0] == -1)) begin
  200. $write("\033[1;33m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[31:16]),stringformatter,trans_fp16(fft_wif.o.data[15:0]));
  201. onebitmatcherrors+=1;
  202. end
  203. else begin
  204. if((ignoremedata[31:16] - fft_wif.o.data[31:16] == 2) || (ignoremedata[15:0] - fft_wif.o.data[15:0] == 2) || (ignoremedata[31:16] - fft_wif.o.data[31:16] == -2) ||(ignoremedata[15:0] - fft_wif.o.data[15:0] == -2))
  205. $write("\033[1;35m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[31:16]),stringformatter,trans_fp16(fft_wif.o.data[15:0]));
  206. else
  207. $write("\033[1;31m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[31:16]),stringformatter,trans_fp16(fft_wif.o.data[15:0]));
  208. matcherrors+=1;
  209. end
  210. end
  211.  
  212. if (((TYPE == "FFT" || TYPE == "IFFT") && (outtype == 2'b01 || inptype == 2'b10) && N == 1) || ((TYPE == "DCT" || TYPE == "IDCT") && N == 1))begin
  213. $display("");
  214. break;
  215. end
  216.  
  217. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);//--------------------------------------------2
  218. if(ignoremedata == fft_wif.o.data[63:32])
  219. $write("\033[1;32m\t\t%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[63:48]),stringformatter,trans_fp16(fft_wif.o.data[47:32]));
  220. else begin
  221. if((ignoremedata[31:16] - fft_wif.o.data[63:48]== 1) || (ignoremedata[15:0] - fft_wif.o.data[47:32]== 1) ||(ignoremedata[31:16] - fft_wif.o.data[63:48]== -1)||(ignoremedata[15:0] - fft_wif.o.data[47:32]== -1)) begin
  222. $write("\033[1;33m\t\t%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[63:48]),stringformatter,trans_fp16(fft_wif.o.data[47:32]));
  223. onebitmatcherrors+=1;
  224. end
  225. else begin
  226. if((ignoremedata[31:16] - fft_wif.o.data[63:48]== 2) || (ignoremedata[15:0] - fft_wif.o.data[47:32]== 2) ||(ignoremedata[31:16] - fft_wif.o.data[63:48]== -2) ||(ignoremedata[15:0] - fft_wif.o.data[47:32]== -2))
  227. $write("\033[1;35m\t\t%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[63:48]),stringformatter,trans_fp16(fft_wif.o.data[47:32]));
  228. else
  229. $write("\033[1;31m\t\t%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[63:48]),stringformatter,trans_fp16(fft_wif.o.data[47:32]));
  230. matcherrors+=1;
  231. end
  232. end
  233.  
  234. if(transftype == 2'b10 || transftype == 2'b11)
  235. $write("\n");
  236. else
  237. $write("\t\t");
  238.  
  239. if (((TYPE == "FFT" || TYPE == "IFFT") && ((outtype == 2'b00 && N == 1) || (outtype == 2'b01 && N == 2))) || ((TYPE == "DCT" || TYPE == "IDCT") && N == 2))begin
  240. $display("");
  241. break;
  242. end
  243.  
  244. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);//-------------------------------------------3
  245. if(ignoremedata == fft_wif.o.data[95:64])
  246. $write("\033[1;32m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[95:80]),stringformatter,trans_fp16(fft_wif.o.data[79:64]));
  247. else begin
  248. if((ignoremedata[31:16] - fft_wif.o.data[95:80] == 1) || (ignoremedata[15:0] - fft_wif.o.data[79:64] == 1) || (ignoremedata[31:16] - fft_wif.o.data[95:80] == -1) ||(ignoremedata[15:0] - fft_wif.o.data[79:64] == -1)) begin
  249. $write("\033[1;33m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[95:80]),stringformatter,trans_fp16(fft_wif.o.data[79:64]));
  250. onebitmatcherrors+=1;
  251. end
  252. else begin
  253. if((ignoremedata[31:16] - fft_wif.o.data[95:80] == 2) || (ignoremedata[15:0] - fft_wif.o.data[79:64] == 2) || (ignoremedata[31:16] - fft_wif.o.data[95:80] == -2) ||(ignoremedata[15:0] - fft_wif.o.data[79:64] == -2))
  254. $write("\033[1;35m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[95:80]),stringformatter,trans_fp16(fft_wif.o.data[79:64]));
  255. else
  256. $write("\033[1;31m%8.5f%s%8.5f\033[0m",trans_fp16(fft_wif.o.data[95:80]),stringformatter,trans_fp16(fft_wif.o.data[79:64]));
  257. matcherrors+=1;
  258. end
  259. end
  260.  
  261. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);//-------------------------------------------4
  262. if(ignoremedata == fft_wif.o.data[127:96])
  263. $write("\033[1;32m\t\t%8f%s%8f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),stringformatter,trans_fp16(fft_wif.o.data[111:96]));
  264. else begin
  265. if((ignoremedata[31:16] - fft_wif.o.data[127:112]== 1) || (ignoremedata[15:0] - fft_wif.o.data[111:96]== 1) || (ignoremedata[31:16] - fft_wif.o.data[127:112]== -1)||(ignoremedata[15:0] - fft_wif.o.data[111:96]== -1)) begin
  266. $write("\033[1;33m\t\t%8.5f%s%8.5f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),stringformatter,trans_fp16(fft_wif.o.data[111:96]));
  267. onebitmatcherrors+=1;
  268. end
  269. else begin
  270. if((ignoremedata[31:16] - fft_wif.o.data[127:112]== 2) || (ignoremedata[15:0] - fft_wif.o.data[111:96]== 2) || (ignoremedata[31:16] - fft_wif.o.data[127:112]== -2) ||(ignoremedata[15:0] - fft_wif.o.data[111:96]== -2))
  271. $write("\033[1;35m\t\t%8.5f%s%8.5f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),stringformatter,trans_fp16(fft_wif.o.data[111:96]));
  272. else
  273. $write("\033[1;31m\t\t%8.5f%s%8.5f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),stringformatter,trans_fp16(fft_wif.o.data[111:96]));
  274. matcherrors+=1;
  275. end
  276. end
  277.  
  278. @(posedge clk);
  279. #1;
  280. end
  281. $fwrite(fwr,"\n");
  282. end
  283. end
  284.  
  285. int i_2D, j_2D, i_2D_2;
  286. logic [31:0] out_point_2D;
  287. logic [31:0] matrix_2D[0:4095][0:2047];
  288. always @(posedge fft_wif.o.req)begin
  289. if (ffttype == 1'b1) begin // && run_number == 0
  290. //if(run_number == 0)
  291. j_2D = 0;
  292. while(fft_wif.o.req == 1'b1)begin
  293. if(run_number == 0) begin
  294. out_point_2D = fft_wif.o.data >> ((i_2D%4)*32);
  295. matrix_2D[j_2D][i_2D] = out_point_2D;
  296. end
  297. else if(run_number == 1) begin
  298. out_point_2D = fft_wif.o.data >> (((i_2D_2)%4)*32);
  299. end
  300.  
  301. $fwrite(fwr,"%h %h ",out_point_2D[31:16], out_point_2D[15:0]);
  302. j_2D++;
  303.  
  304. @(posedge clk); #1;
  305. end
  306. if(run_number == 0)
  307. i_2D++;
  308. else if (run_number == 1)
  309. i_2D_2++;
  310. end
  311. end
  312.  
  313. int fftreadsdone;
  314. always @(posedge fft_rif.i.strb)begin
  315. logic[127:0]olddata;
  316. olddata = 'bx;
  317. if(ffttype == 0) begin
  318. while((fft_rif.i.strb == 1'b1) || (N == 1 && fftreadsdone == 0))begin
  319. if(olddata !== fft_rif.i.data) begin
  320. olddata = fft_rif.i.data;
  321. #1;
  322. @(posedge clk); #1;
  323. fftreadsdone++;
  324. //$display("------->FFTREADSDONE=%0d--------<%d>------\n",fftreadsdone,$time);
  325. if(fftreadsdone == readstotal || (N == 1 && fftreadsdone == 1))begin
  326. $fclose(fwrinp);
  327. fftreadsdone = 0;
  328. start_model("input.txt",cN,transftype,cbits,inptype,outtype,reorder_bypass,inpformat,outformat, LINES, ffttype);
  329. modelout = $fopen("model_output.txt","r");
  330. end
  331. end
  332. else begin @(posedge clk); #1; end
  333. end
  334. end
  335. end
  336. int aux;
  337. logic [31:0] elem;
  338. initial begin
  339. if($isunknown(seed)) seed = 43041;
  340. initialseed = seed;
  341. if($isunknown(initialseed)) initialseed = 43041;
  342. if($isunknown(MODE)) MODE = 0;//17/15
  343. if($isunknown(N)) N = 4;//16 points
  344. if($isunknown(TYPE)) transftype = 2'b00;//FFT
  345. if($isunknown(INTYPE)) inptype = 2'b00;//COMPLEX
  346. if($isunknown(OUTTYPE)) outtype = 1'b0;//COMPLEX
  347. if($isunknown(REORDER_BYPASS)) reorder_bypass = 1'b0;
  348. if($isunknown(INFORMAT)) inpformat = 2'b00;//FP16
  349. if($isunknown(OUTFORMAT)) outformat = 2'b00;//FP16
  350. if($isunknown(DIMENSION)) ffttype = 1'b0;//1D
  351. if($isunknown(LINES)) LINES = 0;//1 line
  352. fwrinp_py = $fopen("input_for_python.txt","w");
  353. //---------------------------------------------------------------------------------
  354.  
  355. start_fft();
  356. //<-------should be fine executia pana aici. next step sa trimit punctele din matrix_2Dl
  357. $fclose(modelout);
  358. my_pi.d.frame_end = 1'b0;
  359. repeat(100)@(posedge clk);
  360. if(ffttype == 1'b1) begin
  361. AmcWr.reset(1);
  362. AmcRd.reset(1);
  363.  
  364. /* for(i_2D=0;i_2D<(2**N);i_2D++)begin
  365. for(j_2D=0;j_2D<nrlines;j_2D++)begin
  366. elem = matrix_2D[i_2D][j_2D];
  367. $write("[%h]%8.5f%s[%h]%8.5f \t", elem[31:16], trans_fp16(elem[31:16]), stringformatter, elem[15:0], trans_fp16(elem[15:0]));
  368. end
  369. $display("");
  370. end */
  371. i_2D = 0;
  372. //start_fft();
  373.  
  374. end
  375. $display("%s INPUTMODE=%0d OUTPUTMODE=%0d INPUTFORMAT=%0d OUTPUTFORMAT=%0d MODE=%0d N=%0d SEED=%0d BYPASS=%0d and it finished with %0d errors and %0d one bit errors\n",TYPE, inptype, outtype, inpformat,outformat, MODE,N,initialseed, reorder_bypass, matcherrors, onebitmatcherrors);
  376. if(matcherrors != 0 || onebitmatcherrors > 1)begin
  377. $fwrite(logs,"%s INPUTMODE=%0d OUTPUTMODE=%0d INPUTFORMAT=%0d OUTPUTFORMAT=%0d MODE=%0d N=%0d SEED=%0d BYPASS=%0d and it finished with %0d errors and %0d one bit errors\n",TYPE, inptype, outtype, inpformat,outformat, MODE,N,initialseed, reorder_bypass, matcherrors, onebitmatcherrors);
  378. $display("\033[1;31m------------------------------------>TEST FAILED<---------------------------------------------\033[0m");
  379. end
  380. else
  381. $display("\033[1;32m------------------------------------>TEST PASSED<---------------------------------------------\033[0m");
  382.  
  383. if(reorder_bypass == 1'b1)
  384. $display("-------------------------->REORDER BYPASS ENABLED<-----------------------");
  385. else
  386. $display("-------------------------->REORDER BYPASS DISABLED<-----------------------");
  387. $fclose(logs);
  388. $fclose(fwrinp_py);
  389. $display("");
  390. $finish(2);
  391. end
  392.  
  393.  
  394. task automatic start_fft;
  395. if(run_number == 1) begin //Swap N and LINES in the second run of the 2D FFT, since the matrix is now transposed
  396. aux = LINES;
  397. LINES = N;
  398. N = aux;
  399. end
  400. check_N();
  401. type_config();
  402. input_type_config();
  403. output_type_config();
  404.  
  405. cN = 2 ** N;
  406. fftreadsdone = 0;
  407.  
  408. AmcWr.run();
  409. AmcRd.run();
  410.  
  411. nrpoints = (inptype == 2'b01 || inptype == 2'b10) ? (2**(N-1)) : (2 ** N); //If real plane or conjugate then we generate only half the points
  412. nrlines = (ffttype == 1'b1) ? (2 ** LINES) : 1;
  413.  
  414. img_width = nrpoints;
  415. img_height = nrlines;
  416.  
  417. cfg.nl = nrlines;
  418. cfg.ls = N; // "daca ai 64 puncte atunci 64 * 4 bytes" si trebe sa fie aliniat la 16B
  419.  
  420. if(run_number == 0) begin
  421. my_pi.d.frame_start = 1'b1;
  422. @(posedge clk);
  423. my_pi.d.frame_start = 1'b0;
  424. //my_pi.d.line_start = 1'b1;
  425. send_pix();
  426. @(posedge clk);
  427. //my_pi.d.line_start = 1'b0;
  428. my_pi.d.frame_start = 1'b0;
  429. end
  430.  
  431. regdata = 'd0;
  432. regdata[3:0] = N;//N
  433. regdata[9:8] = transftype; //FFT/IFFT/DCT/IDCT
  434. regdata[13:10] = LINES;//Number of lines
  435. regdata[15] = reorder_bypass;//Reorder Bypass
  436. regdata[7] = ffttype;//1D / 2D
  437. regdata[6] = outtype;//Output type
  438. regdata[5:4] = inptype;//Input type
  439.  
  440. regdata2 ='d0;
  441. regdata2[1:0] = MODE;//POINT FORMAT
  442. regdata2[3:2] = outformat;//OUTPUT FORMAT
  443. regdata2[5:4] = inpformat;//INPUT FORMAT
  444.  
  445.  
  446. regdata3='d0;
  447. regdata3[14:4]=N;//line stride -- inseamna de fapt n*16B
  448.  
  449. input_addr = (run_number == 1) ? ((2**N)*(2**LINES)*4) : 0;
  450.  
  451. write_to_reg(cv_fft_regs_pkg::CV_FFT_CTRL0_CR_ADDR,regdata);
  452. write_to_reg(cv_fft_regs_pkg::CV_FFT_INT_EN_CR_ADDR,'d3);
  453. write_to_reg(cv_fft_regs_pkg::CV_FFT_INT_CR_ADDR,'d3);
  454. write_to_reg(cv_fft_regs_pkg::CV_FFT_CTRL1_CR_ADDR,regdata2);
  455. write_to_reg(cv_fft_regs_pkg::CV_FFT_INPUT_ADDR_CR_ADDR,input_addr);//Input adress
  456. write_to_reg(cv_fft_regs_pkg::CV_FFT_OUTPUT_ADDR_CR_ADDR,'h70000);//Output adress
  457. write_to_reg(cv_fft_regs_pkg::CV_FFT_MEMSETUP_CR_ADDR,regdata3);//idk
  458.  
  459.  
  460.  
  461.  
  462. send_lines();
  463.  
  464. //repeat(100)@(posedge clk);
  465. write_to_reg(cv_fft_regs_pkg::CV_FFT_START_CR_ADDR,1'b1);
  466. $display("Started DUT transftype %d! at time %d",transftype,$time);
  467. @(posedge clk) penable = 1'b0;
  468.  
  469. if(ffttype == 1) begin
  470. wait(cv_fft_wrap_i.i_cv_fft.i_cv_fft_ctrl.mode_2D_int==1'b1);
  471. wait(cv_fft_wrap_i.i_cv_fft.i_cv_fft_ctrl.mode_2D_int==1'b0);
  472. end
  473. else if(ffttype == 0) begin
  474. wait(cv_fft_wrap_i.i_cv_fft.i_cv_fft_ctrl.mode_1D_int==1'b1);
  475. wait(cv_fft_wrap_i.i_cv_fft.i_cv_fft_ctrl.mode_1D_int==1'b0);
  476. end
  477.  
  478. repeat(500)@(posedge clk);
  479. if(run_number == 1) begin
  480. //my_pi.d.line_end = 1'b1;
  481. @(posedge clk);
  482. my_pi.d.frame_end = 1'b1;
  483. //my_pi.d.line_end = 1'b0;
  484. @(posedge clk);
  485. my_pi.d.frame_end = 1'b0;
  486. end
  487. $display("");
  488. run_number++;
  489.  
  490. $fclose(fwr);
  491. if(ffttype == 1) begin
  492. start_model("input.txt",cN,transftype,cbits,inptype,outtype,reorder_bypass,inpformat,outformat, nrlines, ffttype);
  493. verify_fft();
  494. end
  495. endtask
  496.  
  497. initial begin
  498. if(ffttype == 0)
  499. repeat(100000)@(posedge clk);
  500. else if(ffttype == 1)
  501. repeat(100000)@(posedge clk);
  502. $display("\033[1;31m----------------------------------------->TIMEBOMB<-----------------------------------------\033[0m");
  503. $finish(2);
  504. end
  505.  
  506. task automatic verify_fft;
  507. logic [31:0] dut, model;
  508. int i;
  509. fwr = $fopen("dut_output.txt","r");
  510. modelout = $fopen("model_output.txt","r");
  511.  
  512. $display("");
  513. repeat(nrlines) begin
  514. repeat(nrpoints) begin
  515. $fscanf(fwr,"%h %h",dut[31:16], dut[15:0]);
  516. $fscanf(modelout,"%h %h",model[31:16], model[15:0]);
  517.  
  518. if(model == dut)
  519. $write("\033[1;32m%8.5f%s%8.5f\t\033[0m",trans_fp16(dut[31:16]),stringformatter,trans_fp16(dut[15:0]));
  520. else begin
  521. if((model[31:16] - dut[31:16] == 1) || (model[15:0] - dut[15:0] == 1) || (model[31:16] - dut[31:16] == -1)||(model[15:0] - dut[15:0] == -1)) begin
  522. $write("\033[1;33m%8.5f%s%8.5f\t\033[0m",trans_fp16(dut[31:16]),stringformatter,trans_fp16(dut[15:0]));
  523. onebitmatcherrors+=1;
  524. end
  525. else begin
  526. if((model[31:16] - dut[31:16] == 2) || (model[15:0] - dut[15:0] == 2) || (model[31:16] - dut[31:16] == -2) ||(model[15:0] - dut[15:0] == -2))
  527. $write("\033[1;35m%8.5f%s%8.5f\t\033[0m",trans_fp16(dut[31:16]),stringformatter,trans_fp16(dut[15:0]));
  528. else
  529. $write("\033[1;31m%8.5f%s%8.5f\t\033[0m",trans_fp16(dut[31:16]),stringformatter,trans_fp16(dut[15:0]));
  530. matcherrors+=1;
  531. end
  532. end
  533. i++;
  534. if((i%4) == 0)
  535. $display("");
  536. end
  537. $display("");
  538. end
  539. $fclose(modelout);
  540. $fclose(fwr);
  541. endtask
  542.  
  543. task automatic send_lines;
  544. fft_wif.i.gnt = 1'b0;
  545. fwrinp = $fopen("input.txt","w");
  546. repeat(nrlines) begin
  547. if(run_number == 1)
  548. j_2D = 0;
  549. pixels_sent = 0;
  550. my_pi.d.line_start = 1'b1;
  551. @(posedge clk);
  552. my_pi.d.line_start = 1'b0;
  553.  
  554. repeat(nrpoints) begin
  555. send_pix();
  556. send_write();
  557. //$display("I sent the point for i_2D=%0d and j_2D=%0d\n",i_2D,j_2D);
  558. //repeat(1) @(posedge clk);
  559. if(run_number == 1)
  560. j_2D++;
  561. end
  562. if(inptype == 2'b00)begin
  563. if(N==1)
  564. repeat(2) begin
  565. send_pix();
  566. send_write();
  567. if(run_number == 1)
  568. j_2D++;
  569. end
  570. end
  571. else if(inptype == 2'b01 || inptype == 2'b10)begin
  572. if(N==1)
  573. repeat(4) begin
  574. send_pix();
  575. send_write();
  576. if(run_number == 1)
  577. j_2D++;
  578. end
  579. else if(N==2)
  580. repeat(2) begin
  581. send_pix();
  582. send_write();
  583. if(run_number == 1)
  584. j_2D++;
  585. end
  586. end
  587. /* $fwrite(fwrinp,"\n"); */
  588. $fwrite(fwrinp_py,"\n");
  589. if(run_number == 1)
  590. i_2D++;
  591.  
  592. end
  593. fft_wif.i.gnt = 1'b1;
  594.  
  595. $fclose(fwrinp);
  596. endtask
  597.  
  598.  
  599. task automatic write_to_reg;
  600. input [31:0] addr;
  601. input [31:0] data;
  602.  
  603. penable = 1'b1;
  604. pwrite = 1'b1;
  605.  
  606. pwdata = data;
  607. psel = 1'b1;
  608. paddr = addr;
  609. @(posedge clk);
  610.  
  611. penable = 1'b0;
  612. pwrite = '0;
  613. psel = 1'b0;
  614. endtask
  615.  
  616. initial begin
  617. rst_n = 0;
  618. fscan_clkungate = 1'b0;
  619. fft_wif.i.gnt = 1'b1;
  620.  
  621. i_2D = 0;
  622. i_2D_2 = 0;
  623. j_2D = 0;
  624. ignoreme = 0;
  625.  
  626. en = 1;
  627. img_width = (2 ** 16) - 1;
  628. img_height = 2048;
  629.  
  630. vwif.o.req = 1'b0;
  631. vrif.o.req = 1'b0;
  632.  
  633. paddr = 0;
  634. penable = 1'b0;
  635. pwrite = 1'b0;
  636. pwdata = 1'b1;
  637. psel = 1'b1;
  638.  
  639.  
  640. cfg = 'd0;
  641. cfg.kl = 1;
  642. cfg.format = 4;
  643. cfg.auto = 1;
  644.  
  645. my_pi.d.frame_start = 1'b0;
  646. my_pi.d.line_start = 1'b0;
  647. my_pi.d.line_end = 1'b0;
  648. my_pi.d.frame_end = 1'b0;
  649.  
  650. AmcWr.b.verbose =0;//4 for more prints
  651. AmcRd.b.verbose =0;//4 for more prints
  652. repeat(2)@(posedge clk);
  653. rst_n = 1'b1;
  654. end
  655.  
  656. function shortreal trans_fp16;
  657. input [DW-1:0] A;
  658. int sign, mantisa_norm, exp;
  659. shortreal rl;
  660. shortreal aux,m;
  661.  
  662. /* $display("I get %0h",A); */
  663. sign = A[15];
  664. A = A & 16'h7fff;
  665. mantisa_norm = A % 1024;
  666. exp = (A / 1024);
  667. m = 1024 + mantisa_norm;
  668. exp -= 15;
  669. if(exp - 10 > 0)
  670. rl = m * (2 **( exp - 10));
  671. else begin
  672. aux = 1.0/(2.0 **( 10 - exp));
  673. rl = m * aux;
  674. end
  675.  
  676. if(A==0)begin
  677. trans_fp16 = 0;
  678. end
  679. else
  680. if (sign) begin
  681. trans_fp16 = -1 * rl;
  682. /* $display(" and I give %f", -1 * rl); */
  683. end
  684. else begin
  685. trans_fp16 = rl;
  686. /* $display(" and I give %f", rl); */
  687. end
  688. endfunction
  689.  
  690. task automatic send_write;
  691. #1;
  692. while(!vwif.i.gnt) @(posedge clk);
  693. /* $display("INFO : (%9d.00 ns) Sending write request for addr: %0h data: %0h", $time, vwif.o.addr, parent_wif.o.data[31:0]); */
  694.  
  695. /* while(vwif.i.gnt) @(posedge clk);
  696. $display("INFO : (%9d.00 ns) \033[1;32mDone writing at addr: %0h data: %0h\033[0m", $time, vwif.o.addr, parent_wif.o.data[31:0]); */
  697. endtask
  698.  
  699. task automatic send_read;
  700. input [31:0] addr;
  701.  
  702. if(addr[31:28] == 4'h7 ) begin
  703. while(!fft_rif.i.gnt) @(posedge clk);
  704. /* $display("INFO : (%9d.00 ns) Sending read request for addr: %0h", $time, addr); */
  705. fft_rif.o.burst = 4'b0000;
  706. fft_rif.o.page = 1'b0;
  707. fft_rif.o.addr = addr;
  708. fft_rif.o.req = 1'b1;
  709.  
  710.  
  711. while(!vrif.i.strb) @(posedge clk);
  712. /* $display("INFO : (%9d.00 ns) \033[1;49mGot data:%0h at addr: %0h\033[0m", $time, fft_rif.i.data[31:0], addr); */
  713. fft_rif.o.req = 1'b0;
  714. end
  715. else
  716. $display("ERROR : (%9d.00 ns) \033[1;31mRead addr doesn't match base addr\033[0m", $time);
  717. endtask
  718.  
  719. task automatic send_pix;
  720. logic [31:0] data;
  721. int conj1, conj2;
  722. logic e1,e2;
  723. int negthresh = -1 * thresh;
  724. if(ignoreme == 1) begin
  725. if(run_number == 0) begin
  726. data = $urandom($random(seed));
  727. end
  728. else if (run_number == 1) begin
  729. data = matrix_2D[i_2D][j_2D];
  730. //$display("Choosing data from i=%d j=%d",i_2D, j_2D);
  731. end
  732. //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-->OUTPUT FROM FIRST RUN MIGHT BE BIGGER THAN THRESH, DATA MIGHT GET RANDOMISED THUS FAILED TEST<--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  733.  
  734. //----------------------------------------------------------------------------------------
  735. if(run_number == 0) begin
  736. if(inpformat==2'b00)begin // FP16
  737. while((trans_fp16(data[15:0]) > thresh) || (trans_fp16(data[15:0]) <negthresh))begin
  738. if(run_number == 1)
  739. $display("I randomize [15:0] %f AND I SHOULDN'T!",trans_fp16(data[15:0]));
  740. data[15:0] = $urandom($random(seed));
  741. end
  742. while((trans_fp16(data[31:16]) > thresh) || (trans_fp16(data[31:16]) <negthresh))begin
  743. if(run_number == 1)
  744. $display("I randomize [31:16] %f AND I SHOULDN'T!",trans_fp16(data[31:16]));
  745. data[31:16] = $urandom($random(seed));
  746. end
  747. end
  748. else if(inpformat==2'b10) begin // U16
  749. data[15:0] = data[15:0]%thresh;
  750. data[31:16] = data[31:16]%thresh;
  751. end
  752. end
  753. //----------------------------------------------------------------------------------------
  754.  
  755. if((transftype == 2 || transftype == 3) && inptype==2'b00)
  756. data[15:0] = 16'd0;
  757.  
  758. $fwrite(fwrinp,"%h %h ", data[31:16],data[15:0]);
  759.  
  760. if(inptype==2'b00)begin // INPUT COMPLEX
  761. if(inpformat == 2'b00)
  762. $fwrite(fwrinp_py,"%f + %fj, ", trans_fp16(data[31:16]), trans_fp16(data[15:0]));
  763. else if(inpformat == 2'b10)
  764. $fwrite(fwrinp_py,"%d + %dj, ", data[31:16], data[15:0]);
  765. end
  766. else if(inptype==2'b01)begin // INPUT REALPLANE
  767. if(inpformat == 2'b00)
  768. $fwrite(fwrinp_py,"%f, %f, ",trans_fp16(data[31:16]), trans_fp16(data[15:0]));
  769. else if(inpformat == 2'b10)
  770. $fwrite(fwrinp_py,"%d, %d, ",data[31:16], data[15:0]);
  771. end
  772. else if(inptype==2'b10)begin // INPUT CONJUGATE
  773. conj1 = (-1)*data[31:16];
  774. conj2 = (-1)*data[15:0];
  775. if(inpformat == 2'b00)
  776. $fwrite(fwrinp_py,"%f + %fj, %f + %fj, ",trans_fp16(data[31:16]), trans_fp16(data[31:16]^(1<<15)), trans_fp16(data[15:0]), trans_fp16(data[15:0]^(1<<15)));
  777. else if(inpformat == 2'b10)
  778. $fwrite(fwrinp_py,"%d + %dj, %d + %dj, ",data[31:16], conj1,data[15:0], conj2);
  779. end
  780. pixels_sent++;
  781. end
  782. else begin
  783. ignoreme = 1;
  784. end
  785. while(my_pi.c.ready == 1'b0) @(posedge clk);
  786. bfl_dec = 1'b1;
  787. my_pi.d.data = data;
  788. my_pi.d.valid = 1'b1;
  789.  
  790. if(pixels_sent == nrpoints) begin
  791. my_pi.d.line_end = 1'b1;
  792. end
  793.  
  794. @(posedge clk);
  795. my_pi.d.valid = 1'b0;
  796. my_pi.d.line_end = 1'b0;
  797. endtask
  798.  
  799.  
  800. task automatic output_type_config;//-------------------------------INPUT TYPE CONFIGURATION-------------------------------------
  801. if(OUTTYPE=="COMPLEX")begin
  802. outtype = 1'b0;
  803. end
  804. else if(OUTTYPE=="REALPLANE")begin
  805. outtype = 1'b1;
  806. end
  807.  
  808. if(OUTFORMAT=="FP16")begin
  809. outformat = 2'b00;
  810. end
  811. else if(OUTFORMAT=="U16")begin
  812. outformat = 2'b10;
  813. end
  814. endtask
  815.  
  816. task automatic input_type_config;//-------------------------------INPUT TYPE CONFIGURATION--------------------------------------
  817.  
  818. readstotal = 2 ** (N-2);
  819. repeat(2)@(posedge clk);
  820.  
  821. if(INTYPE=="COMPLEX")begin
  822. inptype = 2'b00;
  823. end
  824. else if(INTYPE=="REALPLANE")begin
  825. inptype = 2'b01;
  826. readstotal /=2;
  827. end
  828. else if(INTYPE=="CONJUGATE")begin
  829. inptype = 2'b10;
  830. readstotal /=2;
  831. end
  832. if(readstotal == 0)
  833. readstotal = 1;
  834.  
  835. if(INFORMAT=="FP16")begin
  836. inpformat = 2'b00;
  837. end
  838. else if(INFORMAT=="U16")begin
  839. inpformat = 2'b10;
  840. end
  841.  
  842. endtask
  843.  
  844. task automatic check_N;//----------------------------------------TYPE AND POINTS CHECK------------------------------------------
  845. logs = $fopen("log.txt","a");
  846. if(MODE == 1) begin
  847. cbits = 24;
  848. thresh = 1;
  849. if (N>6 && (TYPE=="DCT")) begin
  850. $display("\033[1;31mFOR <8/24> MODE AND <DCT or IDCT> THE MAXIMUM N IS 6! FINISHING SIMULATION WITHOUT RUNNING TESTBENCH!\033[0m");
  851. $finish(2);
  852. end
  853. else if (N>7 && (TYPE=="FFT" || TYPE=="IFFT" || TYPE=="IDCT")) begin
  854. $display("\033[1;31mFOR <8/24> MODE AND <FFT or IFFT> THE MAXIMUM N IS 7! FINISHING SIMULATION WITHOUT RUNNING TESTBENCH!\033[0m");
  855. $finish(2);
  856. end
  857. end
  858. else if(MODE == 2) begin
  859. cbits = 20;
  860. thresh = 1;
  861. if (N>9 && (TYPE=="DCT")) begin
  862. $display("\033[1;31mFOR <12/20> MODE AND <DCT or IDCT> THE MAXIMUM N IS 9! FINISHING SIMULATION WITHOUT RUNNING TESTBENCH!\033[0m");
  863. $finish(2);
  864. end
  865. else if (N>10 && (TYPE=="FFT" || TYPE=="IFFT" || TYPE=="IDCT")) begin
  866. $display("\033[1;31mFOR <12/20> MODE AND <FFT or IFFT> THE MAXIMUM N IS 10! FINISHING SIMULATION WITHOUT RUNNING TESTBENCH!\033[0m");
  867. $finish(2);
  868. end
  869. end
  870. else if(MODE == 0)begin
  871. cbits = 15;
  872. thresh = 65536/(2 ** (N+1));
  873. if (N>10 && (TYPE=="DCT" || TYPE=="IDCT")) begin
  874. $display("\033[1;31mFOR <17/15> MODE AND <DCT or IDCT> THE MAXIMUM N IS 10! FINISHING SIMULATION WITHOUT RUNNING TESTBENCH!\033[0m");
  875. $finish(2);
  876. end
  877. else if (N>11 && (TYPE=="FFT" || TYPE=="IFFT")) begin
  878. $display("\033[1;31mFOR <17/15> MODE AND <FFT or IFFT> THE MAXIMUM N IS 11! FINISHING SIMULATION WITHOUT RUNNING TESTBENCH!\033[0m");
  879. $finish(2);
  880. end
  881. end
  882. endtask
  883.  
  884. task automatic type_config;//---------------------------------------TYPE CONFIGURATION-----------------------------------------
  885. fwr = $fopen("dut_output.txt","w");
  886. if(TYPE=="DCT") begin
  887. transftype = 2'b10;
  888. stringformatter=" \t";
  889. if(MODE == 0)
  890. thresh = thresh/2;
  891. end
  892. else if(TYPE=="FFT") begin
  893. transftype = 2'b00;
  894. stringformatter=",";
  895. end
  896. else if(TYPE=="IDCT") begin
  897. transftype = 2'b11;
  898. stringformatter="\t";
  899. end
  900. else if(TYPE=="IFFT") begin
  901. transftype = 2'b01;
  902. stringformatter=",";
  903. end
  904. if (REORDER_BYPASS == "ENABLE")begin
  905. reorder_bypass = 1'b1;
  906. end
  907. else if (REORDER_BYPASS == "DISABLE")begin
  908. reorder_bypass = 1'b0;
  909. end
  910.  
  911. if(DIMENSION == "1D")begin
  912. ffttype = 1'b0;
  913. end
  914. else if(DIMENSION == "2D")begin
  915. ffttype = 1'b1;
  916. end
  917. endtask
  918. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement