Hard Processor System Component Reference Manual: Agilex™ 5 SoCs

ID 813752
Date 8/15/2025
Public
Document Table of Contents

4.3.4. test_f2sdram.sv

  1. Change directory to <project directory>/simple_tb/simple_tb/sim/.
  2. Create a file named test_f2sdram.sv and edit with contents as shown below
    // test_f2sdram.sv
    
    `timescale 1 ps / 1 ps
    import altera_axi_bfm_pkg::*; 
    import host_memory_class_pkg::*;
    
    `define DUT		simple_tb.simple_inst	// project name with "_tb" and "_inst"
    `define mgr_bfm		`DUT.	axi4_mm_manager_intf_0.axi4_mm_manager_intf_0 
    `define sub_bfm		`DUT.	intel_agilex_5_soc_0.intel_agilex_5_soc_0.sm_mpfe.\
    				sundancemesa_mpfe_inst.f2sdram_bfm_gen.\
    				f2sdram_axi4_slave_inst
    `define sub_mem 	`sub_bfm.	host_memory
    
    `define CLK_PATH 	`DUT.	clock_in.out_clk
    `define RESET_PATH 	`DUT.	reset_in.out_reset
    
    localparam MGR_ADDR_WIDTH = 32;
    localparam MGR_DATA_WIDTH = 256;  // width of the Manager driving the F2SDRAM bridge
    localparam MGR_ID_WIDTH = 5;
    localparam MGR_USER_WIDTH = 32;
    
    localparam SUB_ADDR_WIDTH = 32;
    localparam SUB_DATA_WIDTH = 64;	  // width of the F2SDRAM bridge
    localparam SUB_ID_WIDTH = 5;
    localparam SUB_USER_WIDTH = 8;
    
    module test_f2sdram#();
    
    int i,j;
    bit status, f_rw[8], f_incr[8][8];
    reg [MGR_ADDR_WIDTH-1:0] Addr;		// addr reg
    reg [MGR_DATA_WIDTH-1:0] mgrData[8];	// MGR data reg
    reg [SUB_DATA_WIDTH-1:0] subData[8];	// SUB data reg
    
    //----------------------------------------------------------------------------------
    //----------------------------  BFM Manager (f2sdram)
    //----------------------------------------------------------------------------------
    initial begin 
      AlteraAxiTransaction wr_resp_tr, rd_resp_tr;
      BaseAxiBfm#(MGR_ADDR_WIDTH, MGR_DATA_WIDTH, MGR_ID_WIDTH, MGR_USER_WIDTH) test_m;  
      
      test_m = `mgr_bfm.AXI4MAN.bfm;
      
    mgrData[0]='h11111111_22222222_33333333_44444444_55555555_66666666_77777777_88888888;
    mgrData[1]='h22222222_33333333_44444444_55555555_66666666_77777777_88888888_99999999;
    mgrData[2]='h33333333_44444444_55555555_66666666_77777777_88888888_99999999_aaaaaaaa;
    mgrData[3]='h44444444_55555555_66666666_77777777_88888888_99999999_aaaaaaaa_bbbbbbbb;  
    
      subData[0] = 'h77777777_88888888;  
      subData[1] = 'h55555555_66666666;  
      subData[2] = 'h33333333_44444444;
      subData[3] = 'h11111111_22222222;      
      
      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  F2SDRAM  n\n\n",$time);
    
    /////////////////////////////////////////// SINGLE WRITES //////////////////////////
    for (i = 0; i < 4; i++) begin
      $display("\n@%0t******** START OF WRITE #%d TEST ****  F2SDRAM  ****\n",$time, i);
      Addr = (i * 1<<AXI4_BYTES_32);  
      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_32);
    
      wr_resp_tr.set_data_words(mgrData[i], 0);
      wr_resp_tr.set_write_strobes(32'hffffffff, 0);
      test_m.put_transaction(wr_resp_tr); 
      test_m.drive_transaction(); 
      $display("\n@%0t******** END OF   WRITE #%d TEST ***  F2SDRAM  ****\n",$time, i);
    end
    
    /////////////////////////////////////////// SINGLE READS  //////////////////////////
    for (i = 0; i < 4; i++) begin
      $display("\n@%0t******** START OF READ  #%d TEST ****  F2SDRAM   ***\n",$time, i); 
      Addr = (i * 1<<AXI4_BYTES_32);    // (i * 1<<AXI4_BYTES_32);  // 0,1,2,3   *  0x20
      rd_resp_tr = test_m.manager_bfm_rd_tx(i, Addr );
      rd_resp_tr.set_size(AXI4_BYTES_32);
      test_m.put_transaction(rd_resp_tr); 
      test_m.drive_transaction();
        
      if (rd_resp_tr.get_data_words(0) == mgrData[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 (0x%h)", 
         		$time, mgrData[i], Addr );
      end 
      else
         $display ( "@ %t  Error: Expected data (%h) at address (0x%h), but got 0x%h", 
         		$time, mgrData[i], Addr, rd_resp_tr.get_data_words(0));
      $display("\n@%0t******** END OF   READ  #%d TEST ***   F2SDRAM   ***\n",$time, i);
    end  
    
    /////////////////////////////////////////// INCR WRITES/READS  /////////////////////
    for (i = 0; i < 4; i++) begin
       $display("\n@%0t****** START OF INCR BURST #%d TEST **  F2SDRAM  **\n",$time, i); 
       Addr = 32+ (i*1<<AXI4_BYTES_32);
       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_32); 
       wr_resp_tr.set_burst_type(BURST_TYPE_INCR); 
       wr_resp_tr.set_data_words(mgrData[0], 0);	// data, id
       wr_resp_tr.set_data_words(mgrData[1], 1); 
       wr_resp_tr.set_data_words(mgrData[2], 2); 
       wr_resp_tr.set_data_words(mgrData[3], 3); 
       wr_resp_tr.set_write_strobes(32'hffffffff, 0);	// strobe, id
       wr_resp_tr.set_write_strobes(32'hffffffff, 0); 
       wr_resp_tr.set_write_strobes(32'hffffffff, 0); 
       wr_resp_tr.set_write_strobes(32'hffffffff, 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_32); 
       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) == mgrData[j]) begin
           f_incr[i][j]=1'b1;
           $display ( "@ %t  Read correct data (%h) at address (%h)", 
           		$time, mgrData[j], (Addr + j) );      
           end 
        else
           $display ( "@ %t  Error: Expected data (%h) at address (%h), but got %h", 
           		$time, mgrData[j], (Addr + j), rd_resp_tr.get_data_words(j));
        end	   //for j loop
    end	//for i loop
    
    /////////////////////////////////////////// CHECK TESTS        /////////////////////
    //#2000	// optional delay - if timescale is 1ps/1ps, then  2000ps = 2ns
    #(18000000 - $time)		// wait until a certain time
    
    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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> pass    F2SDRAM ");
    else begin
       $display ("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> fail    F2SDRAM ");
       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
    
    end     // initial begin
    
    
    //----------------------------------------------------------------------------------
    //----------------------------  BFM Subordinate
    //----------------------------------------------------------------------------------
    
    initial begin 
      AlteraAxiTransaction wr_resp_tr, rd_resp_tr;
      byte_t init_buf[]; 
      int k;
    
      BaseAxiBfm#(SUB_ADDR_WIDTH, SUB_DATA_WIDTH, SUB_ID_WIDTH, SUB_USER_WIDTH) test_s;  
      test_s =`sub_bfm.AXI4SUB.bfm;
      test_s.s_reset(); 
      
      // Configure BFM as needed
      test_s.set_config(AXI_CONFIG_MAX_OUTSTANDING_WR, 2);
      test_s.set_config(AXI_CONFIG_MAX_OUTSTANDING_RD, 2);
      // Create response transactions
      wr_resp_tr = test_s.subordinate_bfm_wr_resp_tx();
      rd_resp_tr = test_s.subordinate_bfm_rd_resp_tx();
    
      fork 
        //Initialise the memory 
        init_buf = new[8]; 
        init_buf = {<<byte_t{8'hff}}; 
        
        for (k = 0; k < 256; k++)
          `sub_bfm.host_memory.initialize_data(k, init_buf);       
        
      join 
    
      $display("\n\n\n\n@%0t, [TESTINFO]: Starting   SUBORDINATE BFM     \n\n\n",$time);
    
      fork 
        forever begin
           test_s.put_transaction(wr_resp_tr);
           test_s.drive_transaction();
        end
        forever begin
           test_s.put_transaction(rd_resp_tr);
           test_s.drive_transaction();
        end
      join
      
    end		// initial begin
    
    endmodule