Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 1ns/1ns
- `define SIPP_UVM_TEST
- `include "../rtl/cv_fft_reg_gen/cv_fft_regs_pkg.vh"
- `include "mvds_sipp_llb_params.inc"
- `include "sipp_func.inc"
- `include "sipp_lbc_types.inc"
- `include "sipp_lbc_func.inc"
- `include "sipp_fp_func.inc"
- //`include "cv_fft_dct_rom_values.inc"
- `include "/nfs/iir/disks/mvds_ip_release_disk001/vpu3_IP_REL/amc_vip/amc_vip_v0p0_y19ww34_0008/amc_vip/TESTBENCH/amc_ifs.inc"
- `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"
- module tb_fft();
- integer seed;
- integer initialseed;
- int N;
- int MODE;
- int cbits = 15;
- int thresh=35000;
- logic [1:0]transftype;
- integer args1 = $value$plusargs("SEED=%d",seed);
- integer args2 = $value$plusargs("N=%d",N);
- integer args3 = $value$plusargs("MODE=%d",MODE);
- integer fwr;
- integer fwr_py_out = $fopen("dut_output_fft_for_python.txt","w");
- integer logs;
- integer fwrinp_py;
- integer fwrinp;
- integer ifftinp;
- integer modelout;
- int ignoreme = 0;
- int matcherrors = 0;
- logic [31:0] ignoremedata;
- logic [31:0] oldpixdata;
- import upa_cmx_constants_pkg::*;
- import "DPI-C" function void go_fft(input string filename, input int n);
- import "DPI-C" function void go_fft_butterfly(input string filename, input int n, input int nrb);
- import "DPI-C" function void go_ifft(input string filename, input int n);
- import "DPI-C" function real mysin(input real x);
- `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"
- parameter DRAM_BASE_ADR = 32'h8000_0000;
- //defparam AMC_DW = 32;
- localparam NUM_OF_MEMS = 4;
- localparam PRDATA_WIDTH = 32;
- localparam PWDATA_WIDTH = 32;
- localparam PADDR_WIDTH = 32;
- // -----------------------------------------------------------------------------
- // Input and output declarations
- // -----------------------------------------------------------------------------
- // Clock and reset
- logic clk;
- logic rst_n;
- int readerrors;
- initial begin
- clk = 0;
- forever begin
- #50;
- clk = ~clk;
- end
- end
- // --------------------------------------------
- // DFx
- // --------------------------------------------
- logic fscan_clkungate;
- logic [NUM_OF_MEMS-1:0] test_enable;
- //input ctrl_mem_struct [NUM_OF_MEMS-1:0] cfg_mem_ctrl;
- // --------------------------------------------
- // Interrupt
- // --------------------------------------------
- logic fft_irq;
- // --------------------------------------------
- // APB3 INTERFACE
- // --------------------------------------------
- logic [PADDR_WIDTH-1:0] paddr;
- logic penable;
- logic pwrite;
- logic [PWDATA_WIDTH-1:0] pwdata;
- logic psel;
- logic [PRDATA_WIDTH-1:0] prdata;
- logic pslverr;
- logic pready;
- logic [31:0] tc_addr;
- sipp_lbc_cfg cfg;
- logic en;
- logic [SIPP_FRM_WIDTH_W-1:0] img_width;
- logic [SIPP_FRM_HEIGHT_W-1:0] img_height;
- logic bfl_dec, bfl_inc;
- logic [SIPP_NLW-1:0] bfl;
- pix_if my_pi(clk);
- amc_wif parent_wif(clk);//Parent interface
- amc_rif fft_rif(clk);
- amc_wif fft_wif(clk);
- virtual amc_wif vwif;//Virtual interface of the writing object
- virtual amc_rif vrif;//Virtual interface of the reading object
- AMCIWrIf AmcWr;//Writing object
- AMCIRdIf AmcRd;//Reading object
- event e_trans_done;
- event e_trans_done2;
- initial begin
- vwif = parent_wif;
- vrif = fft_rif;
- AmcWr = new (/* AmcWr */, 1, MXI_CMX_BASE_ADR, 'h20000, vwif, e_trans_done);
- AmcRd = new (/* AmcRd */, 2, MXI_CMX_BASE_ADR, 'h20000, vrif, e_trans_done);
- end
- logic [31:0] regdata;
- tb_sipp_parent #(.DW(32),.NC(1), .NP(1))
- tb_sipp_parent_i(
- .clk(clk),
- .rst_n(rst_n),
- .cfg(cfg),
- .img_width(img_width),
- .img_height(img_height),
- .en(en),
- .bfl_dec(bfl_dec),
- .bfl_inc(bfl_inc),
- .bfl(bfl),
- .pi(my_pi),
- .wc(parent_wif)
- );
- cv_fft cv_fft_i(
- .clk(clk),
- .rst_n(rst_n),
- .fscan_clkungate(fscan_clkungate),
- .test_enable(1'b0),
- .fft_irq(fft_irq),
- .paddr(paddr),
- .penable(penable),
- .pwrite(pwrite),
- .pwdata(pwdata),
- .psel(psel),
- .prdata(prdata),
- .pslverr(pslverr),
- .pready(pready),
- .rd_client_o(fft_rif.o),
- .rd_client_i(fft_rif.i),
- .wr_client_o(fft_wif.o),
- .wr_client_i(fft_wif.i)
- );
- always @(posedge fft_wif.o.req)begin
- while(fft_wif.o.req == 1'b1)begin
- #1;
- $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]);
- if(transftype == 0) begin
- $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]));
- end
- $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
- if(ignoremedata == fft_wif.o.data[31:0])
- $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]));
- else begin
- 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))
- $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]));
- else
- 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))
- $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]));
- else
- $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]));
- matcherrors+=1;
- end
- $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
- if(ignoremedata == fft_wif.o.data[63:32])
- $write("\033[1;32m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
- else begin
- 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))
- $write("\033[1;33m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
- else
- 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))
- $write("\033[1;35m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
- else
- $write("\033[1;31m %f,%f\033[0m",trans_fp16(fft_wif.o.data[63:48]),trans_fp16(fft_wif.o.data[47:32]));
- matcherrors+=1;
- end
- $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
- if(ignoremedata == fft_wif.o.data[95:64])
- $write("\033[1;32m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
- else begin
- 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))
- $write("\033[1;33m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
- else
- 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))
- $write("\033[1;35m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
- else
- $write("\033[1;31m %f,%f\033[0m",trans_fp16(fft_wif.o.data[95:80]),trans_fp16(fft_wif.o.data[79:64]));
- matcherrors+=1;
- end
- $fscanf(modelout,"%h %h",ignoremedata[31:16],ignoremedata[15:0]);
- if(ignoremedata == fft_wif.o.data[127:96])
- $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]));
- else begin
- 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))
- $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]));
- else
- 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))
- $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]));
- else
- $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]));
- matcherrors+=1;
- end
- @(posedge clk);
- #1;
- end
- end
- int fftreadsdone;
- always @(posedge fft_rif.i.strb)begin
- logic[127:0]olddata;
- int cN = 2 ** N;
- olddata = 'b0;
- while(fft_rif.i.strb == 1'b1)begin
- if(olddata != fft_rif.i.data) begin
- olddata = fft_rif.i.data;
- #1;
- @(posedge clk); #1;
- fftreadsdone++;
- if(fftreadsdone == (cN/4))begin
- if(transftype == 0) begin
- $fclose(fwrinp);
- $fclose(fwrinp_py);
- go_fft_butterfly("input.txt",cN,cbits);
- modelout = $fopen("fft.txt","r");
- end
- else begin
- go_ifft("dut_output_fft.txt",cN);
- modelout = $fopen("ifft.txt","r");
- end
- end
- end
- else begin @(posedge clk); #1; end
- end
- end
- int auxpix;
- initial begin
- if($isunknown(seed)) seed = 43041;
- initialseed = seed;
- if($isunknown(initialseed)) initialseed = 43041;
- if($isunknown(MODE)) MODE = 0;
- if($isunknown(N)) N = 4;
- logs = $fopen("log.txt","a");
- if (MODE == 1 || MODE == 2) begin
- thresh = 1;
- end
- else begin
- thresh = 64408/(2 ** (N+1));
- end
- if(MODE == 1) begin
- cbits = 24;
- end
- else if(MODE == 2) begin
- cbits = 20;
- end
- else if(MODE == 0)begin
- cbits = 15;
- end
- /* $fwrite(logs," and thresh is %0d", thresh); */
- repeat(2)@(posedge clk);
- transftype = 2'b00;
- start_fft();
- //AmcWr = new (/* AmcWr */, 1, MXI_CMX_BASE_ADR, 'h20000, vwif, e_trans_done);
- //AmcRd = new (/* AmcRd */, 2, MXI_CMX_BASE_ADR, 'h20000, vrif, e_trans_done);
- AmcWr.reset(1);
- AmcRd.reset(1);
- rst_n = 1'b0;
- repeat(10)@(posedge clk);
- rst_n = 1'b1;
- ifftinp = $fopen("dut_output_fft.txt","r");
- transftype = 2'b01;
- $fclose(modelout);
- //start_fft();
- if(regdata[28] == 1'b1)
- $display("-------------------------->REORDER BYPASS ENABLED<-----------------------");
- else
- $display("-------------------------->REORDER BYPASS DISABLED<-----------------------");
- $fclose(modelout);
- if(matcherrors != 0)
- $fwrite(logs,"MODE=%0d N=%0d SEED=%0d and it finished with %0d errors\n",MODE,N,initialseed, matcherrors);
- /* $fwrite(logs," and it finished with %0d errors\n",matcherrors); */
- $fclose(logs);
- $finish(2);
- end
- task automatic start_fft;
- int contorpix = 0;
- $display("\n------------>STARTED FFT <-----------------\n");
- if(transftype == 0) begin
- fwr = $fopen("dut_output_fft.txt","w");
- fwrinp_py = $fopen("input_for_python.txt","w");
- fwrinp = $fopen("input.txt","w");
- end
- else if(transftype == 1)begin
- fwr = $fopen("dut_output_ifft.txt","w");
- end
- fftreadsdone = 0;
- ignoreme = 0;
- /* AmcWr.b.verbose =4;
- AmcRd.b.verbose =4; */
- AmcWr.run();
- AmcRd.run();
- my_pi.d.line_start = 1'b1;
- my_pi.d.frame_start = 1'b1;
- send_pix();
- my_pi.d.line_start = 1'b0;
- my_pi.d.frame_start = 1'b0;
- regdata = 0;
- regdata[3:0] = N;//N
- regdata[9:8] = transftype; //FFT/IFFT/DCT/IDCT
- regdata[21:10] = 1;//Numberr of lines
- regdata[28] = 1'b1;//Bypass enable
- regdata[7] = 1'b0;//1D / 2D
- write_to_reg(cv_fft_regs_pkg::CV_FFT_CTRL0_CR_ADDR,regdata);
- write_to_reg(cv_fft_regs_pkg::CV_FFT_INT_EN_CR_ADDR,1);
- write_to_reg(cv_fft_regs_pkg::CV_FFT_CTRL1_CR_ADDR,MODE);//17/15 8/24 12/20
- write_to_reg(cv_fft_regs_pkg::CV_FFT_INPUT_ADDR_CR_ADDR,0);//Input adress
- write_to_reg(cv_fft_regs_pkg::CV_FFT_OUTPUT_ADDR_CR_ADDR,0);//Output adress
- write_to_reg(cv_fft_regs_pkg::CV_FFT_MEMSETUP_CR_ADDR,{6'd0,22'd0,4'd0});//idk
- write_to_reg(cv_fft_regs_pkg::CV_FFT_INT_CR_ADDR,{6'd0,22'd0,4'd0});
- repeat(2**N)
- begin
- send_pix();
- send_write();
- repeat(15) @(posedge clk);
- contorpix++;
- if(contorpix % ((2**N)/10) == 0) begin
- $display("Sent %d points",contorpix);
- end
- end
- write_to_reg(cv_fft_regs_pkg::CV_FFT_START_CR_ADDR,1'b1);
- $display("Started FFT! at time %d",$time());
- @(posedge clk) penable = 1'b0;
- wait(fft_wif.o.req == 1'b1);
- wait(fft_wif.o.req == 1'b0);
- repeat(500)@(posedge clk);
- $fclose(fwr);
- if(transftype == 1) begin
- $fclose(ifftinp);
- end
- endtask
- task automatic write_to_reg;
- input [31:0] addr;
- input [31:0] data;
- penable = 1'b1;
- pwrite = 1'b1;
- pwdata = data;
- psel = 1'b1;
- paddr = addr;
- @(posedge clk);
- penable = 1'b0;
- pwrite = '0;
- psel = 1'b0;
- endtask
- initial begin
- rst_n = 0;
- fscan_clkungate = 1'b0;//No clue what this is
- fft_wif.i.gnt = 1'b1;
- en = 1;
- img_width = 2048;
- img_height = 2048;
- vwif.o.req = 1'b0;
- vrif.o.req = 1'b0;
- paddr = 0;
- penable = 1'b0;
- pwrite = 1'b0;
- pwdata = 1'b1;
- psel = 1'b1;
- cfg.base = 0;//MXI_CMX_BASE_ADR;
- cfg.page = 0;
- cfg.offset = 0;
- cfg.nl = 0;
- cfg.ls = 0;//cica nu conteaza
- cfg.np = 0;
- cfg.ps = 0;
- cfg.nps = 0;
- cfg.kl = 1;
- cfg.ss = 0;
- cfg.first = 0;
- cfg.burst = 0;
- cfg.last = 0;
- cfg.start = 0;
- cfg.lcen = 0;
- cfg.lcs = 0;
- cfg.format = 4;//so this should be 16
- cfg.p010 = 0;
- cfg.llb_byp = 0;
- cfg.irq = 0;
- cfg.rate = 0;
- cfg.auto = 1;
- cfg.se = 0;
- cfg.x2 = 0;
- cfg.x4 = 0;
- cfg.nlextra = 0;
- cfg.nlextra_ovrd = 0;
- cfg.rc = 0;
- cfg.wc = 0;
- repeat(2)@(posedge clk);
- rst_n = 1'b1;
- end
- function shortreal trans_fp16;
- input [DW-1:0] A;
- int sign, mantisa_norm, exp;
- shortreal rl;
- shortreal aux,m;
- /* $display("I get %0h",A); */
- sign = A[15];
- A = A & 16'h7fff;
- mantisa_norm = A % 1024;
- exp = (A / 1024);
- m = 1024 + mantisa_norm;
- exp -= 15;
- if(exp - 10 > 0)
- rl = m * (2 **( exp - 10));
- else begin
- aux = 1.0/(2.0 **( 10 - exp));
- rl = m * aux;
- end
- if (sign) begin
- trans_fp16 = -1 * rl;
- /* $display(" and I give %f", -1 * rl); */
- end
- else begin
- trans_fp16 = rl;
- /* $display(" and I give %f", rl); */
- end
- endfunction
- task automatic send_write;
- #1;
- while(!vwif.i.gnt) @(posedge clk);
- //$display("INFO : (%9d.00 ns) Sending write request for addr: %0h data: %0h", $time, vwif.o.addr, parent_wif.o.data[31:0]);
- /* while(vwif.i.gnt) @(posedge clk); */
- //$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]);
- endtask
- task automatic send_read;
- input [31:0] addr;
- if(addr[31:28] == 4'h7 ) begin
- while(!fft_rif.i.gnt) @(posedge clk);
- //$display("INFO : (%9d.00 ns) Sending read request for addr: %0h", $time, addr);
- fft_rif.o.burst = 4'b0000;
- fft_rif.o.page = 1'b0;
- fft_rif.o.addr = addr;
- fft_rif.o.req = 1'b1;
- /* while(fft_rif.i.gnt) @(posedge clk);
- fft_rif.o.req = 1'b0; */
- while(!vrif.i.strb) @(posedge clk);
- //$display("INFO : (%9d.00 ns) \033[1;49mGot data:%0h at addr: %0h\033[0m", $time, fft_rif.i.data[31:0], addr);
- fft_rif.o.req = 1'b0;
- end
- else
- $display("ERROR : (%9d.00 ns) \033[1;31mRead addr doesn't match base addr\033[0m", $time);
- endtask
- //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
- //nu fie mai mult de 3 adunari/scaderi consecutive. Pot sa folosesc chestia lui Vasile din python
- task automatic send_pix;
- logic [31:0] data;
- int negthresh = -1 * thresh;
- if(ignoreme == 1) begin
- if(transftype == 0) begin
- data = $urandom($random(seed));
- //$display("data is %h=%f",data[15:0],data[15:0]);
- while((trans_fp16(data[15:0]) > thresh) || (trans_fp16(data[15:0]) <negthresh) )begin
- data[15:0] = $urandom($random(seed));
- //$display("data is %h=%f IN WHILE",data[15:0],data[15:0]);
- end
- //$display("data is %h=%f",data[31:16],data[31:16]);
- while((trans_fp16(data[31:16]) > thresh) || (trans_fp16(data[31:16]) <negthresh) )begin
- data[31:16] = $urandom($random(seed));
- //$display("data is %h=%f IN WHILE",data[31:16],data[31:16]);
- end
- $fwrite(fwrinp,"%h %h ", data[31:16], data[15:0]);
- $fwrite(fwrinp_py,"%f + %fj, ", trans_fp16(data[31:16]), trans_fp16(data[15:0]));
- end
- else if(transftype == 1)begin
- $fscanf(ifftinp,"%h %h",data[31:16],data[15:0]);
- /* $display("I read from file %h %h",data[15:0], data[31:16]); */
- end
- end
- else begin
- ignoreme = 1;
- oldpixdata=$urandom($random(seed));
- end
- while(my_pi.c.ready == 1'b0) @(posedge clk);
- bfl_dec = 1'b1;
- my_pi.d.data = data;
- my_pi.d.valid = 1'b1;
- my_pi.d.line_end = 1'b0;
- my_pi.d.frame_end = 1'b0;
- repeat(1)@(posedge clk);
- my_pi.d.valid = 1'b0;
- /* $display("I generated pixel %0h.\n",my_pi.d.data); */
- endtask
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement