Hard Processor System Component Reference Manual: Agilex™ 5 SoCs
ID
813752
Date
8/15/2025
Public
1. Introduction to the Agilex™ 5 Hard Processor System Component
2. Configuring the Agilex™ 5 Hard Processor System Component
3. Simulating the Agilex™ 5 HPS Component
4. Simulating the Agilex™ 5 HPS bridges (H2F, LWH2F, F2SDRAM, F2H)
5. Design Guidelines
6. Document Revision History for the Hard Processor System Component Reference Manual Agilex™ 5 SoCs
2.1. Parameterizing the HPS Component
2.2. HPS-FPGA Interfaces
2.3. SDRAM
2.4. HPS Clocks, Reset, Power
2.5. I/O Delays
2.6. Pin Mux and Peripherals
2.7. Generating and Compiling the HPS Component
2.8. Using the Address Span Extender Component
2.9. Configuring the Agilex™ 5 Hard Processor System Component Revision History
2.2.1.1. Enable MPU Standby and Event Signals
2.2.1.2. Enable General Purpose Signals
2.2.1.3. Enable Debug APB* Interface
2.2.1.4. Enable System Trace Macrocell (STM) Hardware Events
2.2.1.5. Enable SWJ-DP JTAG Interface
2.2.1.6. Enable FPGA Cross Trigger Interface
2.2.1.7. Enable AMBA* Trace Bus (ATB)
2.3.1. Configurations for HPS IP
2.3.2. Configurations for HPS EMIF IP
2.3.3. Graphical Connections of HPS to HPS-EMIF
2.3.4. Configuration when using ECC
2.3.5. Configuration of HPS EMIF Calibration Settings
2.3.6. Supported Memory Protocols Among Device Families
2.3.7. IO96 Bank and Lane Usage for HPS EMIF
2.3.8. Quartus Report of I/O Bank Usage
2.3.9. Debugging with the External Memory Interface Debug Toolkit
4.3.4. test_f2sdram.sv
- Change directory to <project directory>/simple_tb/simple_tb/sim/.
- 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