Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.58 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/vpu3_IP_REL/amc_vip/amc_vip_v0p0_y19ww34_0008/amc_vip/TESTBENCH/amc_ifs.inc"
  12. `include "/nfs/iir/disks/mvds_ip_release_disk001/vpu3_IP_REL/mvds_sipp_legacy_tb/mvds_sipp_legacy_tb_v0p0_y19ww33_0011/mvds_sipp_legacy_tb/TESTBENCH/pixel_ifs.inc"
  13.  
  14.  
  15.  
  16.  
  17. module tb_fft();
  18. integer seed;
  19. integer initialseed;
  20. int N;
  21. int MODE;
  22. int cbits = 15;
  23. int thresh=35000;
  24. logic [1:0]transftype;
  25. integer args1 = $value$plusargs("SEED=%d",seed);
  26. integer args2 = $value$plusargs("N=%d",N);
  27. integer args3 = $value$plusargs("MODE=%d",MODE);
  28. integer fwr;
  29. integer fwr_py_out = $fopen("dut_output_fft_for_python.txt","w");
  30. integer logs;
  31. integer fwrinp_py;
  32. integer fwrinp;
  33. integer ifftinp;
  34. integer modelout;
  35. int ignoreme = 0;
  36. int matcherrors = 0;
  37. logic [31:0] ignoremedata;
  38. logic [31:0] oldpixdata;
  39.  
  40. import upa_cmx_constants_pkg::*;
  41. import "DPI-C" function void go_fft(input string filename, input int n);
  42. import "DPI-C" function void go_fft_butterfly(input string filename, input int n, input int nrb);
  43. import "DPI-C" function void go_ifft(input string filename, input int n);
  44. import "DPI-C" function real mysin(input real x);
  45.  
  46. `include "/nfs/iir/disks/mvds_ip_release_disk001/vpu3_IP_REL/amc_vip/amc_vip_v0p0_y19ww33_0007/amc_vip/TESTBENCH/amc_base_classes.inc"
  47.  
  48. parameter DRAM_BASE_ADR = 32'h8000_0000;
  49.  
  50. //defparam AMC_DW = 32;
  51.  
  52. localparam NUM_OF_MEMS = 4;
  53. localparam PRDATA_WIDTH = 32;
  54. localparam PWDATA_WIDTH = 32;
  55. localparam PADDR_WIDTH = 32;
  56.  
  57. // -----------------------------------------------------------------------------
  58. // Input and output declarations
  59. // -----------------------------------------------------------------------------
  60. // Clock and reset
  61.  
  62. logic clk;
  63. logic rst_n;
  64. int readerrors;
  65. initial begin
  66. clk = 0;
  67. forever begin
  68. #50;
  69. clk = ~clk;
  70. end
  71. end
  72.  
  73.  
  74. // --------------------------------------------
  75. // DFx
  76. // --------------------------------------------
  77.  
  78. logic fscan_clkungate;
  79. logic [NUM_OF_MEMS-1:0] test_enable;
  80. //input ctrl_mem_struct [NUM_OF_MEMS-1:0] cfg_mem_ctrl;
  81.  
  82. // --------------------------------------------
  83. // Interrupt
  84. // --------------------------------------------
  85.  
  86. logic fft_irq;
  87.  
  88.  
  89. // --------------------------------------------
  90. // APB3 INTERFACE
  91. // --------------------------------------------
  92.  
  93. logic [PADDR_WIDTH-1:0] paddr;
  94. logic penable;
  95. logic pwrite;
  96. logic [PWDATA_WIDTH-1:0] pwdata;
  97. logic psel;
  98. logic [PRDATA_WIDTH-1:0] prdata;
  99. logic pslverr;
  100. logic pready;
  101.  
  102. logic [31:0] tc_addr;
  103.  
  104. sipp_lbc_cfg cfg;
  105. logic en;
  106. logic [SIPP_FRM_WIDTH_W-1:0] img_width;
  107. logic [SIPP_FRM_HEIGHT_W-1:0] img_height;
  108. logic bfl_dec, bfl_inc;
  109. logic [SIPP_NLW-1:0] bfl;
  110.  
  111.  
  112. pix_if my_pi(clk);
  113.  
  114. amc_wif parent_wif(clk);//Parent interface
  115.  
  116. amc_rif fft_rif(clk);
  117. amc_wif fft_wif(clk);
  118.  
  119. virtual amc_wif vwif;//Virtual interface of the writing object
  120. virtual amc_rif vrif;//Virtual interface of the reading object
  121.  
  122. AMCIWrIf AmcWr;//Writing object
  123. AMCIRdIf AmcRd;//Reading object
  124.  
  125. event e_trans_done;
  126. event e_trans_done2;
  127. initial begin
  128. vwif = parent_wif;
  129. vrif = fft_rif;
  130. AmcWr = new (/* AmcWr */, 1, MXI_CMX_BASE_ADR, 'h20000, vwif, e_trans_done);
  131. AmcRd = new (/* AmcRd */, 2, MXI_CMX_BASE_ADR, 'h20000, vrif, e_trans_done);
  132. end
  133.  
  134. logic [31:0] regdata;
  135. tb_sipp_parent #(.DW(32),.NC(1), .NP(1))
  136. tb_sipp_parent_i(
  137. .clk(clk),
  138. .rst_n(rst_n),
  139. .cfg(cfg),
  140. .img_width(img_width),
  141. .img_height(img_height),
  142. .en(en),
  143. .bfl_dec(bfl_dec),
  144. .bfl_inc(bfl_inc),
  145. .bfl(bfl),
  146. .pi(my_pi),
  147. .wc(parent_wif)
  148. );
  149.  
  150. cv_fft cv_fft_i(
  151. .clk(clk),
  152. .rst_n(rst_n),
  153. .fscan_clkungate(fscan_clkungate),
  154. .test_enable(1'b0),
  155. .fft_irq(fft_irq),
  156. .paddr(paddr),
  157. .penable(penable),
  158. .pwrite(pwrite),
  159. .pwdata(pwdata),
  160. .psel(psel),
  161. .prdata(prdata),
  162. .pslverr(pslverr),
  163. .pready(pready),
  164. .rd_client_o(fft_rif.o),
  165. .rd_client_i(fft_rif.i),
  166. .wr_client_o(fft_wif.o),
  167. .wr_client_i(fft_wif.i)
  168. );
  169.  
  170. always @(posedge fft_wif.o.req)begin
  171. while(fft_wif.o.req == 1'b1)begin
  172. #1;
  173. $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]);
  174. if(transftype == 0) begin
  175. $fwrite(fwr_py_out,"%f +%fj, %f +%fj, %f +%fj, %f +%fj, ",trans_fp16(fft_wif.o.data[31:16]),trans_fp16(fft_wif.o.data[15:0]),trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]),trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]),trans_fp16(fft_wif.o.data[127:112]),trans_fp16(fft_wif.o.data[111:96]));
  176. end
  177.  
  178. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
  179. if(ignoremedata == fft_wif.o.data[31:0])
  180. $write("\033[1;32mRTL OUTPUT: %f,%f\033[0m",trans_fp16(fft_wif.o.data[31:16]),trans_fp16(fft_wif.o.data[15:0]));
  181. else begin
  182. 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))
  183. $write("\033[1;33mRTL OUTPUT: %f,%f\033[0m",trans_fp16(fft_wif.o.data[31:16]),trans_fp16(fft_wif.o.data[15:0]));
  184. else
  185. 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))
  186. $write("\033[1;35mRTL OUTPUT: %f,%f\033[0m",trans_fp16(fft_wif.o.data[31:16]),trans_fp16(fft_wif.o.data[15:0]));
  187. else
  188. $write("\033[1;31mRTL OUTPUT: %f,%f\033[0m",trans_fp16(fft_wif.o.data[31:16]),trans_fp16(fft_wif.o.data[15:0]));
  189. matcherrors+=1;
  190. end
  191.  
  192. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
  193. if(ignoremedata == fft_wif.o.data[63:32])
  194. $write("\033[1;32m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
  195. else begin
  196. 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))
  197. $write("\033[1;33m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
  198. else
  199. 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))
  200. $write("\033[1;35m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
  201. else
  202. $write("\033[1;31m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
  203. matcherrors+=1;
  204. end
  205.  
  206. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
  207. if(ignoremedata == fft_wif.o.data[95:64])
  208. $write("\033[1;32m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
  209. else begin
  210. 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))
  211. $write("\033[1;33m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
  212. else
  213. 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))
  214. $write("\033[1;35m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
  215. else
  216. $write("\033[1;31m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
  217. matcherrors+=1;
  218. end
  219.  
  220. $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
  221. if(ignoremedata == fft_wif.o.data[127:96])
  222. $write("\033[1;32m %f,%f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),trans_fp16(fft_wif.o.data[111:96]));
  223.  
  224. else begin
  225. 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))
  226. $write("\033[1;33m %f,%f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),trans_fp16(fft_wif.o.data[111:96]));
  227. else
  228. 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))
  229. $write("\033[1;35m %f,%f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),trans_fp16(fft_wif.o.data[111:96]));
  230. else
  231. $write("\033[1;31m %f,%f\033[0m\n",trans_fp16(fft_wif.o.data[127:112]),trans_fp16(fft_wif.o.data[111:96]));
  232. matcherrors+=1;
  233. end
  234. @(posedge clk);
  235. #1;
  236. end
  237.  
  238. end
  239.  
  240. int fftreadsdone;
  241. always @(posedge fft_rif.i.strb)begin
  242. logic[127:0]olddata;
  243. int cN = 2 ** N;
  244. olddata = 'b0;
  245. while(fft_rif.i.strb == 1'b1)begin
  246. if(olddata != fft_rif.i.data) begin
  247. olddata = fft_rif.i.data;
  248. #1;
  249. @(posedge clk); #1;
  250. fftreadsdone++;
  251. if(fftreadsdone == (cN/4))begin
  252. if(transftype == 0) begin
  253. $fclose(fwrinp);
  254. $fclose(fwrinp_py);
  255. go_fft_butterfly("input.txt",cN,cbits);
  256. modelout = $fopen("fft.txt","r");
  257.  
  258. end
  259. else begin
  260. go_ifft("dut_output_fft.txt",cN);
  261. modelout = $fopen("ifft.txt","r");
  262. end
  263. end
  264. end
  265. else begin @(posedge clk); #1; end
  266. end
  267. end
  268. int auxpix;
  269. initial begin
  270. if($isunknown(seed)) seed = 43041;
  271. initialseed = seed;
  272. if($isunknown(initialseed)) initialseed = 43041;
  273. if($isunknown(MODE)) MODE = 0;
  274. if($isunknown(N)) N = 4;
  275. logs = $fopen("log.txt","a");
  276. if (MODE == 1 || MODE == 2) begin
  277. thresh = 1;
  278. end
  279. else begin
  280. thresh = 64408/(2 ** (N+1));
  281. end
  282.  
  283. if(MODE == 1) begin
  284. cbits = 24;
  285. end
  286. else if(MODE == 2) begin
  287. cbits = 20;
  288. end
  289. else if(MODE == 0)begin
  290. cbits = 15;
  291. end
  292.  
  293. /* $fwrite(logs," and thresh is %0d", thresh); */
  294. repeat(2)@(posedge clk);
  295. transftype = 2'b00;
  296. start_fft();
  297.  
  298. //AmcWr = new (/* AmcWr */, 1, MXI_CMX_BASE_ADR, 'h20000, vwif, e_trans_done);
  299. //AmcRd = new (/* AmcRd */, 2, MXI_CMX_BASE_ADR, 'h20000, vrif, e_trans_done);
  300.  
  301. AmcWr.reset(1);
  302. AmcRd.reset(1);
  303.  
  304. rst_n = 1'b0;
  305. repeat(10)@(posedge clk);
  306. rst_n = 1'b1;
  307.  
  308. ifftinp = $fopen("dut_output_fft.txt","r");
  309. transftype = 2'b01;
  310. $fclose(modelout);
  311. //start_fft();
  312.  
  313. if(regdata[28] == 1'b1)
  314. $display("-------------------------->REORDER BYPASS ENABLED<-----------------------");
  315. else
  316. $display("-------------------------->REORDER BYPASS DISABLED<-----------------------");
  317. $fclose(modelout);
  318.  
  319. if(matcherrors != 0)
  320. $fwrite(logs,"MODE=%0d N=%0d SEED=%0d and it finished with %0d errors\n",MODE,N,initialseed, matcherrors);
  321. /* $fwrite(logs," and it finished with %0d errors\n",matcherrors); */
  322. $fclose(logs);
  323. $finish(2);
  324. end
  325.  
  326. task automatic start_fft;
  327. int contorpix = 0;
  328. $display("\n------------>STARTED FFT <-----------------\n");
  329. if(transftype == 0) begin
  330. fwr = $fopen("dut_output_fft.txt","w");
  331. fwrinp_py = $fopen("input_for_python.txt","w");
  332. fwrinp = $fopen("input.txt","w");
  333. end
  334. else if(transftype == 1)begin
  335. fwr = $fopen("dut_output_ifft.txt","w");
  336. end
  337. fftreadsdone = 0;
  338. ignoreme = 0;
  339. /* AmcWr.b.verbose =4;
  340. AmcRd.b.verbose =4; */
  341. AmcWr.run();
  342. AmcRd.run();
  343.  
  344. my_pi.d.line_start = 1'b1;
  345. my_pi.d.frame_start = 1'b1;
  346. send_pix();
  347. my_pi.d.line_start = 1'b0;
  348. my_pi.d.frame_start = 1'b0;
  349.  
  350. regdata = 0;
  351. regdata[3:0] = N;//N
  352. regdata[9:8] = transftype; //FFT/IFFT/DCT/IDCT
  353. regdata[21:10] = 1;//Numberr of lines
  354. regdata[28] = 1'b1;//Bypass enable
  355. regdata[7] = 1'b0;//1D / 2D
  356. write_to_reg(cv_fft_regs_pkg::CV_FFT_CTRL0_CR_ADDR,regdata);
  357. write_to_reg(cv_fft_regs_pkg::CV_FFT_INT_EN_CR_ADDR,1);
  358. write_to_reg(cv_fft_regs_pkg::CV_FFT_CTRL1_CR_ADDR,MODE);//17/15 8/24 12/20
  359. write_to_reg(cv_fft_regs_pkg::CV_FFT_INPUT_ADDR_CR_ADDR,0);//Input adress
  360. write_to_reg(cv_fft_regs_pkg::CV_FFT_OUTPUT_ADDR_CR_ADDR,0);//Output adress
  361. write_to_reg(cv_fft_regs_pkg::CV_FFT_MEMSETUP_CR_ADDR,{6'd0,22'd0,4'd0});//idk
  362. write_to_reg(cv_fft_regs_pkg::CV_FFT_INT_CR_ADDR,{6'd0,22'd0,4'd0});
  363.  
  364. repeat(2**N)
  365. begin
  366. send_pix();
  367. send_write();
  368. repeat(15) @(posedge clk);
  369. contorpix++;
  370. if(contorpix % ((2**N)/10) == 0) begin
  371. $display("Sent %d points",contorpix);
  372. end
  373. end
  374. write_to_reg(cv_fft_regs_pkg::CV_FFT_START_CR_ADDR,1'b1);
  375. $display("Started FFT! at time %d",$time());
  376. @(posedge clk) penable = 1'b0;
  377. wait(fft_wif.o.req == 1'b1);
  378. wait(fft_wif.o.req == 1'b0);
  379. repeat(500)@(posedge clk);
  380.  
  381. $fclose(fwr);
  382. if(transftype == 1) begin
  383. $fclose(ifftinp);
  384. end
  385.  
  386. endtask
  387.  
  388. task automatic write_to_reg;
  389. input [31:0] addr;
  390. input [31:0] data;
  391.  
  392. penable = 1'b1;
  393. pwrite = 1'b1;
  394.  
  395. pwdata = data;
  396. psel = 1'b1;
  397. paddr = addr;
  398. @(posedge clk);
  399.  
  400. penable = 1'b0;
  401. pwrite = '0;
  402. psel = 1'b0;
  403. endtask
  404.  
  405. initial begin
  406. rst_n = 0;
  407. fscan_clkungate = 1'b0;//No clue what this is
  408. fft_wif.i.gnt = 1'b1;
  409.  
  410. en = 1;
  411. img_width = 2048;
  412. img_height = 2048;
  413.  
  414. vwif.o.req = 1'b0;
  415. vrif.o.req = 1'b0;
  416.  
  417. paddr = 0;
  418. penable = 1'b0;
  419. pwrite = 1'b0;
  420. pwdata = 1'b1;
  421. psel = 1'b1;
  422.  
  423. cfg.base = 0;//MXI_CMX_BASE_ADR;
  424. cfg.page = 0;
  425. cfg.offset = 0;
  426. cfg.nl = 0;
  427. cfg.ls = 0;//cica nu conteaza
  428. cfg.np = 0;
  429. cfg.ps = 0;
  430. cfg.nps = 0;
  431. cfg.kl = 1;
  432. cfg.ss = 0;
  433. cfg.first = 0;
  434. cfg.burst = 0;
  435. cfg.last = 0;
  436. cfg.start = 0;
  437. cfg.lcen = 0;
  438. cfg.lcs = 0;
  439. cfg.format = 4;//so this should be 16
  440. cfg.p010 = 0;
  441. cfg.llb_byp = 0;
  442. cfg.irq = 0;
  443. cfg.rate = 0;
  444. cfg.auto = 1;
  445. cfg.se = 0;
  446. cfg.x2 = 0;
  447. cfg.x4 = 0;
  448. cfg.nlextra = 0;
  449. cfg.nlextra_ovrd = 0;
  450. cfg.rc = 0;
  451. cfg.wc = 0;
  452.  
  453. repeat(2)@(posedge clk);
  454. rst_n = 1'b1;
  455. end
  456.  
  457. function shortreal trans_fp16;
  458. input [DW-1:0] A;
  459. int sign, mantisa_norm, exp;
  460. shortreal rl;
  461. shortreal aux,m;
  462.  
  463. /* $display("I get %0h",A); */
  464. sign = A[15];
  465. A = A & 16'h7fff;
  466. mantisa_norm = A % 1024;
  467. exp = (A / 1024);
  468. m = 1024 + mantisa_norm;
  469. exp -= 15;
  470. if(exp - 10 > 0)
  471. rl = m * (2 **( exp - 10));
  472. else begin
  473. aux = 1.0/(2.0 **( 10 - exp));
  474. rl = m * aux;
  475. end
  476.  
  477. if (sign) begin
  478. trans_fp16 = -1 * rl;
  479. /* $display(" and I give %f", -1 * rl); */
  480. end
  481. else begin
  482. trans_fp16 = rl;
  483. /* $display(" and I give %f", rl); */
  484. end
  485. endfunction
  486.  
  487. task automatic send_write;
  488. #1;
  489. while(!vwif.i.gnt) @(posedge clk);
  490. //$display("INFO : (%9d.00 ns) Sending write request for addr: %0h data: %0h", $time, vwif.o.addr, parent_wif.o.data[31:0]);
  491.  
  492. /* while(vwif.i.gnt) @(posedge clk); */
  493. //$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]);
  494. endtask
  495.  
  496. task automatic send_read;
  497. input [31:0] addr;
  498.  
  499. if(addr[31:28] == 4'h7 ) begin
  500. while(!fft_rif.i.gnt) @(posedge clk);
  501. //$display("INFO : (%9d.00 ns) Sending read request for addr: %0h", $time, addr);
  502. fft_rif.o.burst = 4'b0000;
  503. fft_rif.o.page = 1'b0;
  504. fft_rif.o.addr = addr;
  505. fft_rif.o.req = 1'b1;
  506.  
  507. /* while(fft_rif.i.gnt) @(posedge clk);
  508. fft_rif.o.req = 1'b0; */
  509.  
  510. while(!vrif.i.strb) @(posedge clk);
  511. //$display("INFO : (%9d.00 ns) \033[1;49mGot data:%0h at addr: %0h\033[0m", $time, fft_rif.i.data[31:0], addr);
  512. fft_rif.o.req = 1'b0;
  513. end
  514. else
  515. $display("ERROR : (%9d.00 ns) \033[1;31mRead addr doesn't match base addr\033[0m", $time);
  516. endtask
  517.  
  518. //datele sa le generez ca un sine wave: incep de la o valoare(intre -10 si 10, random), si apoi am un delta (intre 0 si 30, random), si adun/scad random da' sa
  519. //nu fie mai mult de 3 adunari/scaderi consecutive. Pot sa folosesc chestia lui Vasile din python
  520.  
  521. task automatic send_pix;
  522. logic [31:0] data;
  523. int negthresh = -1 * thresh;
  524. if(ignoreme == 1) begin
  525. if(transftype == 0) begin
  526. data = $urandom($random(seed));
  527. //$display("data is %h=%f",data[15:0],data[15:0]);
  528. while((trans_fp16(data[15:0]) > thresh) || (trans_fp16(data[15:0]) <negthresh) )begin
  529. data[15:0] = $urandom($random(seed));
  530. //$display("data is %h=%f IN WHILE",data[15:0],data[15:0]);
  531. end
  532.  
  533. //$display("data is %h=%f",data[31:16],data[31:16]);
  534. while((trans_fp16(data[31:16]) > thresh) || (trans_fp16(data[31:16]) <negthresh) )begin
  535. data[31:16] = $urandom($random(seed));
  536. //$display("data is %h=%f IN WHILE",data[31:16],data[31:16]);
  537. end
  538. $fwrite(fwrinp,"%h %h ", data[31:16], data[15:0]);
  539. $fwrite(fwrinp_py,"%f + %fj, ", trans_fp16(data[31:16]), trans_fp16(data[15:0]));
  540. end
  541. else if(transftype == 1)begin
  542. $fscanf(ifftinp,"%h %h",data[31:16],data[15:0]);
  543. /* $display("I read from file %h %h",data[15:0], data[31:16]); */
  544. end
  545. end
  546. else begin
  547. ignoreme = 1;
  548. oldpixdata=$urandom($random(seed));
  549. end
  550. while(my_pi.c.ready == 1'b0) @(posedge clk);
  551. bfl_dec = 1'b1;
  552. my_pi.d.data = data;
  553. my_pi.d.valid = 1'b1;
  554.  
  555. my_pi.d.line_end = 1'b0;
  556. my_pi.d.frame_end = 1'b0;
  557.  
  558. repeat(1)@(posedge clk);
  559. my_pi.d.valid = 1'b0;
  560.  
  561. /* $display("I generated pixel %0h.\n",my_pi.d.data); */
  562. endtask
  563. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement