Verification of Gold code Generation and Delay chipping
diff --git a/verilog/dv/wb_bfm_goldcode_test/gps_engine_tb_gold_code.v b/verilog/dv/wb_bfm_goldcode_test/gps_engine_tb_gold_code.v
new file mode 100644
index 0000000..5c3b1e5
--- /dev/null
+++ b/verilog/dv/wb_bfm_goldcode_test/gps_engine_tb_gold_code.v
@@ -0,0 +1,221 @@
+`timescale 1ns / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+// Company: 
+// Engineer: 
+// 
+// Create Date: 10.10.2021 22:37:56
+// Design Name: 
+// Module Name: gps_engine_tb
+// Project Name: 
+// Target Devices: 
+// Tool Versions: 
+// Description: 
+// 
+// Dependencies: 
+// 
+// Revision:
+// Revision 0.01 - File Created
+// Additional Comments:
+// 
+//////////////////////////////////////////////////////////////////////////////////
+`timescale 1ns / 1ps
+
+module gps_engine_tb( );
+    
+    parameter aw                    = 32 ;
+    parameter dw                    = 32 ;
+	parameter CH1_BASE_ADDR         = 32'h00000A00;
+	parameter CH2_BASE_ADDR         = 32'h00000B00;
+	parameter CODE_FREQUENCY_REG_ADDR = CH1_BASE_ADDR + 8'h00 ;
+    parameter CARR_FREQUENCY_REG_ADDR = CH1_BASE_ADDR + 8'h04 ;
+    parameter CODE_FREQUENCY_OFFSET_REG_ADDR = CH1_BASE_ADDR + 8'h08 ;
+    parameter CARR_FREQUENCY_OFFSET_REG_ADDR = CH1_BASE_ADDR + 8'h0C ;
+    parameter ACQ_THRESHOLD_REG_ADDR = CH1_BASE_ADDR + 8'h10;
+    parameter CONFG_REG_ADDR = CH1_BASE_ADDR + 8'h14;
+    parameter PROMPT_IDATA_REG_ADDR = CH1_BASE_ADDR + 8'h18;
+    parameter PROMPT_QDATA_REG_ADDR = CH1_BASE_ADDR + 8'h1C;
+    parameter LATE_IDATA_REG_ADDR  = CH1_BASE_ADDR + 8'h20;
+    parameter LATE_QDATA_REG_ADDR  = CH1_BASE_ADDR + 8'h24;
+    parameter EARLY_IDATA_REG_ADDR = CH1_BASE_ADDR + 8'h28;
+    parameter EARLY_QDATA_REG_ADDR = CH1_BASE_ADDR + 8'h2C;
+    parameter STATUS_REG_ADDR      = CH1_BASE_ADDR + 8'h30;     
+    
+    
+    integer outfile0, count ; //file descriptors
+    reg [1:0] gps_data_i ; 
+    reg [1:0] gps_data_q ;
+    reg gps_clk ;
+    
+    // wishbone signals
+    reg 	      wb_clk_i ;
+    reg 	      wb_rst_i ;
+    wire [aw-1:0]   wb_adr_o ;
+    wire [dw-1:0]   wb_dat_o ;
+    wire [dw/8-1:0] wb_sel_o ;
+    wire 	      wb_we_o ;
+    wire 	      wb_cyc_o ;
+    wire 	      wb_stb_o ;
+    wire [2:0]      wb_cti_o ;
+    wire [1:0]      wb_bte_o ;
+    wire [dw-1:0]    wb_dat_i ;
+    wire 	      wb_ack_i ;
+    wire 	      wb_err_i ;
+    wire 	      wb_rty_i ;
+
+    //Accumulator outputs
+    reg [31:0] dip;
+    reg [31:0] dqp;
+    reg [31:0] die;
+    reg [31:0] dqe;
+    reg [31:0] dil;
+    reg [31:0] dql;
+    reg [31:0] rs_reg;
+
+    reg select_qmaxim;
+    reg dll_sel;
+    wire epochrx;
+    wire codeout;
+    reg mclr;
+
+
+    
+    
+    
+    initial begin
+        $dumpfile("gps_test_gold.vcd");
+        $dumpvars(0, gps_engine_tb);
+    outfile0=$fopen ("gold_code.txt","r");
+  // outfile0 = $fopenr ("input.txt");
+        while (! $feof(outfile0)) begin
+        @ (posedge gps_clk);
+        count = $fscanf(outfile0,"%b\n",gps_data_i);
+        //#10;
+        end      
+    $fclose(outfile0);
+    #100;
+    $stop;
+    end
+   
+    initial begin 
+    gps_clk = 1'b0 ;
+    end
+    
+    always
+    #87.5 gps_clk = ! gps_clk ; // Clock of 5.714 MHz
+    
+    always
+    #5 wb_clk_i = ! wb_clk_i ;
+    
+    
+    wb_master_model #(32,32) u0 (
+    
+		.clk(wb_clk_i),
+		.rst(wb_rst_i),
+		.adr(wb_adr_o),
+		.din(wb_dat_i),
+		.dout(wb_dat_o),
+		.cyc(wb_cyc_o),
+		.stb(wb_stb_o),
+		.we(wb_we_o),
+		.sel(wb_sel_o),
+		.ack(wb_ack_i),
+		.err(1'b0),
+		.rty(1'b0)
+	);
+
+    gps_multichannel gps_engine_i (
+
+    .mclr (mclr),
+    .mclk (gps_clk ),
+    .adc2bit_i (gps_data_i),
+    .adc2bit_q (gps_data_q),
+    .codeout(codeout),
+    .epochrx(epochrx),
+    .dll_sel(dll_sel),
+    .select_qmaxim(select_qmaxim),
+    .wb_clk_i (wb_clk_i), 
+    .wb_rst_i (wb_rst_i), 
+    .wb_adr_i (wb_adr_o), 
+    .wb_dat_i (wb_dat_o), 
+    .wb_dat_o (wb_dat_i),
+    .wb_we_i (wb_we_o), 
+    .wb_stb_i (wb_stb_o), 
+    .wb_cyc_i (wb_cyc_o),
+    .wb_ack_o (wb_ack_i)
+
+    );	    
+	
+	initial begin
+	$display("\nstatus: %t Testbench started\n\n", $time);
+	// initially values
+	wb_clk_i = 0;
+    dll_sel = 1'b0;
+    select_qmaxim = 1'b0;
+    gps_data_i = 2'b00;
+    gps_data_q = 2'b00;
+    mclr = 1'b0;
+    force gps_engine_i.ch1.signmul1.B = ({3'b001});
+    force gps_engine_i.ch1.signmul2.B = ({3'b000});
+    force gps_engine_i.ch1.signmul3.B = ({3'b001});
+    force gps_engine_i.ch1.signmul4.B = ({3'b000});  
+	// reset system
+	wb_rst_i = 1'b0; // negate reset
+	
+	repeat(4) @(posedge wb_clk_i);
+	wb_rst_i = 1'b1; // negate reset
+	$display("status: %t done reset", $time);
+    mclr = 1'b1;
+
+	@(posedge wb_clk_i);
+
+	//
+	// program core
+	//
+
+	// program internal registers
+	u0.wb_write(0,CARR_FREQUENCY_REG_ADDR,32'h00000000); // load prescaler lo-byte 1.405MHz-100Hz
+	u0.wb_write(0,CODE_FREQUENCY_REG_ADDR,32'h16EA4A8C); // load prescaler lo-byte 2.046MHz
+    u0.wb_write(0,ACQ_THRESHOLD_REG_ADDR,32'h00002710); //Threshold value given
+    u0.wb_write(0,CONFG_REG_ADDR,32'h1409A1BE);  //Satellite ID 20 & Sine LUT
+    u0.wb_write(0,CARR_FREQUENCY_OFFSET_REG_ADDR,32'h00000000);  //Offset words are set to zero
+    u0.wb_write(0,CODE_FREQUENCY_OFFSET_REG_ADDR,32'h00000000);
+    u0.wb_read(0,STATUS_REG_ADDR,rs_reg);
+    repeat(4) @(posedge wb_clk_i);
+    #100 mclr = 1'b0;
+    #100 mclr = 1'b1;
+        // check the bit
+	 while(!rs_reg[0]) begin
+	    u0.wb_read(0,STATUS_REG_ADDR,rs_reg); // poll it until it is zero
+            repeat(4) @(posedge wb_clk_i);
+     end
+    u0.wb_read(0,PROMPT_IDATA_REG_ADDR,dip);
+    repeat(4) @(posedge wb_clk_i);
+    u0.wb_read(0,PROMPT_QDATA_REG_ADDR,dqp);
+    repeat(4) @(posedge wb_clk_i);
+    u0.wb_read(0,EARLY_IDATA_REG_ADDR,die);
+    repeat(4) @(posedge wb_clk_i);
+    u0.wb_read(0,EARLY_QDATA_REG_ADDR,dqe);
+    repeat(4) @(posedge wb_clk_i);
+    u0.wb_read(0,LATE_IDATA_REG_ADDR,dil);
+    repeat(4) @(posedge wb_clk_i);
+    u0.wb_read(0,LATE_QDATA_REG_ADDR,dql);
+    repeat(4) @(posedge wb_clk_i);
+    rs_reg[0] = ~rs_reg[0];
+    u0.wb_write(0,STATUS_REG_ADDR,rs_reg);
+    $display("WB_READ @ %t : dip = 0x%h ", $time,dip);
+    $display("WB_READ @ %t : dqp = 0x%h ", $time,dqp);
+    $display("WB_READ @ %t : die = 0x%h ", $time,die);
+    $display("WB_READ @ %t : dqe = 0x%h ", $time,dqe);
+    $display("WB_READ @ %t : dil = 0x%h ", $time,dil);
+    $display("WB_READ @ %t : dql = 0x%h ", $time,dql);
+    #40000000;
+    $finish;
+	end
+            
+
+
+
+    
+    
+    
+endmodule