Advertisement
Guest User

Untitled

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