Hard Processor System Component Reference Manual: Agilex™ 3 SoCs

ID 851703
Date 5/30/2025
Public
Document Table of Contents

4.3.3. test_h2f_128b.sv

  1. Change directory to <project directory>/simple_tb/simple_tb/sim/ .
  2. Create a file named test_h2f_128b.sv and edit with contents as shown below.
    // test_h2f_128b.sv
    
    `timescale 1 ps / 1 ps
    import altera_axi_bfm_pkg::*;
    
    module test_h2f_128b#();
    
    `define h2f_test_m     simple_tb.simple_inst.intel_agilex_5_soc_0.intel_agilex_5_soc_0.sm_hps.sundancemesa_hps_inst.h2f_bfm_gen.h2f_axi4_master_inst
    
    localparam ADDR_WIDTH = 38;
    localparam DATA_WIDTH = 128;
    localparam ID_WIDTH = 4;
    localparam USER_WIDTH = 8;
    
    int i,j;
    bit status, f_rw[8], f_incr[8][8];
    reg [ADDR_WIDTH-1:0] Addr;	// 38 bit addr
    reg [DATA_WIDTH-1:0] Data[8];	// 128 bit data
    
    //-----------------------------------------------------------------------------------------------
    //----------------------------  BFM Manager (h2f)
    //-----------------------------------------------------------------------------------------------
    initial begin 
      
      AlteraAxiTransaction wr_resp_tr, rd_resp_tr;
      BaseAxiBfm#(ADDR_WIDTH, DATA_WIDTH, ID_WIDTH, USER_WIDTH) test_m;
      test_m = `h2f_test_m.AXI4MAN.bfm;
      
      Data[0] = 'h11111111_22222222_33333333_44444444;
      Data[1] = 'h22222222_33333333_44444444_55555555;
      Data[2] = 'h33333333_44444444_55555555_66666666;
      Data[3] = 'hbbbbbbbb_cccccccc_dddddddd_eeeeeeee;  
      
      test_m.m_reset();
      test_m.set_config(AXI_CONFIG_MAX_OUTSTANDING_WR, 2);
      test_m.set_config(AXI_CONFIG_MAX_OUTSTANDING_RD, 2);
    
      $display("\n\n\n\n@%0t, [TESTINFO]: Starting     MANAGER BFM               H2F     \n\n\n\n",$time);
    
    /////////////////////////////////////////// SINGLE WRITES //////////////////////////////////////
    for (i = 0; i < 4; i++) begin
      $display("\n@%0t*************** START OF WRITE #%d TEST *******  H2F  ********\n",$time, i);
      Addr = (i * 1<<AXI4_BYTES_16);
      wr_resp_tr = test_m.manager_bfm_wr_tx();
      wr_resp_tr.set_id(i);
      wr_resp_tr.set_awaddr(Addr);
      wr_resp_tr.set_burst_length(0);
      wr_resp_tr.set_size(AXI4_BYTES_16);
    
      wr_resp_tr.set_data_words(Data[i], 0);
      wr_resp_tr.set_write_strobes(16'hffff, 0);
      test_m.put_transaction(wr_resp_tr); 
      test_m.drive_transaction(); 
      $display("\n@%0t*************** END OF   WRITE #%d TEST *******  H2F  ********\n",$time, i);
    end
    /////////////////////////////////////////// SINGLE READS  //////////////////////////////////////
    for (i = 0; i < 4; i++) begin
      $display("\n@%0t*************** START OF READ  #%d TEST ******   H2F   *********\n",$time, i); 
      Addr = (i * 1<<AXI4_BYTES_16);
      rd_resp_tr = test_m.manager_bfm_rd_tx(i, Addr );	//id, addr
      rd_resp_tr.set_size(AXI4_BYTES_16);
      test_m.put_transaction(rd_resp_tr); 
      test_m.drive_transaction();
        
      if (rd_resp_tr.get_data_words(0) == Data[i]) begin
         f_rw[i]=1'b1;
         $display ("value of f_rw[%d] is %b", i, f_rw[i]);
         $display ( "@ %t  Read correct data (%h) at address (%d)", $time, Data[i], Addr );
      end 
      else
         $display ( "@ %t  Error: Expected data (%h) at address (%d), but got %d", $time, Data[i], Addr, rd_resp_tr.get_data_words(0));
      $display("\n@%0t*************** END OF   READ  #%d TEST ******   H2F   *********\n",$time, i);
    end  
    /////////////////////////////////////////// INCR WRITES/READS  /////////////////////////////////
    for (i = 0; i < 4; i++) begin
       $display("\n@%0t*************** START OF INCR BURST #%d TEST ******   H2F   *********\n",$time, i); 
       Addr = 32+ (i*1<<AXI4_BYTES_16);
       wr_resp_tr = test_m.manager_bfm_wr_tx( (4+i), Addr );	// id, addr
       wr_resp_tr.set_burst_length(3); 
       wr_resp_tr.set_size(AXI4_BYTES_16); 
       wr_resp_tr.set_burst_type(BURST_TYPE_INCR); 
       wr_resp_tr.set_data_words(Data[0], 0);	// data, id
       wr_resp_tr.set_data_words(Data[1], 1); 
       wr_resp_tr.set_data_words(Data[2], 2); 
       wr_resp_tr.set_data_words(Data[3], 3); 
       wr_resp_tr.set_write_strobes(16'hffff, 0);	// strobe, id
       wr_resp_tr.set_write_strobes(16'hffff, 0); 
       wr_resp_tr.set_write_strobes(16'hffff, 0); 
       wr_resp_tr.set_write_strobes(16'hffff, 0); 
       test_m.put_transaction(wr_resp_tr);
       test_m.drive_transaction();
    
       rd_resp_tr = test_m.manager_bfm_rd_tx( (4+i), Addr ); 
       rd_resp_tr.set_burst_length(3); 
       rd_resp_tr.set_size(AXI4_BYTES_16); 
       rd_resp_tr.set_burst_type(BURST_TYPE_INCR); 
    
    fork 
       begin 
    	test_m.put_transaction(rd_resp_tr); 
    	test_m.drive_transaction(); 
       end 
       begin 
    	test_m.put_transaction(wr_resp_tr); 
    	test_m.drive_transaction(); 
       end 
    join 
    
       for (j=0; j<4; j++) begin
         if (rd_resp_tr.get_data_words(j) == Data[j]) begin
           f_incr[i][j]=1'b1;
           $display ( "@ %t  Read correct data (%h) at address (%h)", $time, Data[j], (Addr + j) );      
           end 
        else
           $display ( "@ %t  Error: Expected data (%h) at address (%h), but got %h", $time, Data[j], (Addr + j), rd_resp_tr.get_data_words(j));
        end	   //for j loop
    end	//for i loop
    /////////////////////////////////////////// CHECK TESTS        /////////////////////////////////
    #2000000	// optional delay - if timescale is 1ps/1ps, then  2000000 = 2ns
    status=1'b1;	//assume pass
    for (i = 0; i < 4; i++)
       if (f_rw[i]!=1'b1)
    	status=1'b0;
    
    for (i=0; i<4; i++)
       for (j=0; j<2; j++)
          	if (f_incr[i][j]!=1'b1)
          		status=1'b0;	
    	
    if (status==1'b1)
       $display ("\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pass    H2F ");
    else begin
       $display ("\n\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fail    H2F ");
       for (i=0; i<4; i++)
          for (j=0; j<2; j++)
     	 $display (">>>  f_rw[%d] is %b   >>>  f_incr[%d][%d] is %b ", i, f_rw[i], i, j, f_incr[i][j] );
    end
    
    $display("\n@%0t**************** END OF TEST ********      H2F    ********\n",$time); 
    
    end     // initial begin
    endmodule