Files
retroSoC/tests/rtl/onchip_ram_perf_tb.sv
T

193 lines
5.4 KiB
Systemverilog

`timescale 1ns / 1ps
`include "axi4_define.svh"
module onchip_ram_perf_tb;
logic clk_i = 1'b0;
logic rst_n_i = 1'b0;
logic [31:0] s_legacy_memory [0:1023];
integer s_native_cycles;
integer s_legacy_cycles;
axi4_if #(
.ADDR_WIDTH(32),
.DATA_WIDTH(32),
.ID_WIDTH (1),
.USER_WIDTH(1)
) native_axi4 (
.aclk (clk_i),
.aresetn(rst_n_i)
);
axi4_if #(
.ADDR_WIDTH(32),
.DATA_WIDTH(32),
.ID_WIDTH (1),
.USER_WIDTH(1)
) legacy_axi4 (
.aclk (clk_i),
.aresetn(rst_n_i)
);
apb4_if cfg_apb4 (
.pclk (clk_i),
.presetn(rst_n_i)
);
ram_if legacy_ram ();
always #5 clk_i = ~clk_i;
always_ff @(posedge clk_i) begin
legacy_ram.rdata <= s_legacy_memory[legacy_ram.addr[9:0]];
for (int lane = 0; lane < 4; lane++) begin
if (legacy_ram.wstrb[lane]) begin
s_legacy_memory[legacy_ram.addr[9:0]][lane*8+:8] <= legacy_ram.wdata[lane*8+:8];
end
end
end
onchip_ram #(
.Present (1'b1),
.CapacityKiB(4)
) u_native (
.clk_i (clk_i),
.rst_n_i (rst_n_i),
.perf_enable_i(1'b0),
.perf_clear_i (1'b0),
.mem_axi4 (native_axi4),
.cfg_apb4 (cfg_apb4)
);
axi42ram u_legacy (
.clk_i (clk_i),
.rst_n_i(rst_n_i),
.axi4 (legacy_axi4),
.ram (legacy_ram)
);
task automatic init_axi4;
begin
native_axi4.awid = '0;
native_axi4.awaddr = '0;
native_axi4.awlen = '0;
native_axi4.awsize = `AXI4_BURST_SIZE_4BYTES;
native_axi4.awburst = `AXI4_BURST_TYPE_INCR;
native_axi4.awlock = 1'b0;
native_axi4.awcache = '0;
native_axi4.awprot = '0;
native_axi4.awqos = '0;
native_axi4.awregion = '0;
native_axi4.awuser = '0;
native_axi4.awvalid = 1'b0;
native_axi4.wdata = '0;
native_axi4.wstrb = '0;
native_axi4.wlast = 1'b0;
native_axi4.wuser = '0;
native_axi4.wvalid = 1'b0;
native_axi4.bready = 1'b0;
native_axi4.arid = '0;
native_axi4.araddr = '0;
native_axi4.arlen = '0;
native_axi4.arsize = `AXI4_BURST_SIZE_4BYTES;
native_axi4.arburst = `AXI4_BURST_TYPE_INCR;
native_axi4.arlock = 1'b0;
native_axi4.arcache = '0;
native_axi4.arprot = '0;
native_axi4.arqos = '0;
native_axi4.arregion = '0;
native_axi4.aruser = '0;
native_axi4.arvalid = 1'b0;
native_axi4.rready = 1'b1;
legacy_axi4.awid = '0;
legacy_axi4.awaddr = '0;
legacy_axi4.awlen = '0;
legacy_axi4.awsize = `AXI4_BURST_SIZE_4BYTES;
legacy_axi4.awburst = `AXI4_BURST_TYPE_INCR;
legacy_axi4.awlock = 1'b0;
legacy_axi4.awcache = '0;
legacy_axi4.awprot = '0;
legacy_axi4.awqos = '0;
legacy_axi4.awregion = '0;
legacy_axi4.awuser = '0;
legacy_axi4.awvalid = 1'b0;
legacy_axi4.wdata = '0;
legacy_axi4.wstrb = '0;
legacy_axi4.wlast = 1'b0;
legacy_axi4.wuser = '0;
legacy_axi4.wvalid = 1'b0;
legacy_axi4.bready = 1'b0;
legacy_axi4.arid = '0;
legacy_axi4.araddr = '0;
legacy_axi4.arlen = '0;
legacy_axi4.arsize = `AXI4_BURST_SIZE_4BYTES;
legacy_axi4.arburst = `AXI4_BURST_TYPE_INCR;
legacy_axi4.arlock = 1'b0;
legacy_axi4.arcache = '0;
legacy_axi4.arprot = '0;
legacy_axi4.arqos = '0;
legacy_axi4.arregion = '0;
legacy_axi4.aruser = '0;
legacy_axi4.arvalid = 1'b0;
legacy_axi4.rready = 1'b1;
cfg_apb4.paddr = '0;
cfg_apb4.pprot = '0;
cfg_apb4.psel = 1'b0;
cfg_apb4.penable = 1'b0;
cfg_apb4.pwrite = 1'b0;
cfg_apb4.pwdata = '0;
cfg_apb4.pstrb = '0;
end
endtask
task automatic measure_native;
integer beats;
begin
@(negedge clk_i);
native_axi4.araddr = `SOC_ADDR_SRAM_BASE;
native_axi4.arlen = 8'd15;
native_axi4.arvalid = 1'b1;
do @(posedge clk_i); while (!native_axi4.arready);
@(negedge clk_i);
native_axi4.arvalid = 1'b0;
s_native_cycles = 0;
beats = 0;
while (beats < 16) begin
@(posedge clk_i);
s_native_cycles = s_native_cycles + 1;
if (native_axi4.rvalid) beats = beats + 1;
end
end
endtask
task automatic measure_legacy;
integer beats;
begin
@(negedge clk_i);
legacy_axi4.araddr = `SOC_ADDR_SRAM_BASE;
legacy_axi4.arlen = 8'd15;
legacy_axi4.arvalid = 1'b1;
do @(posedge clk_i); while (!legacy_axi4.arready);
@(negedge clk_i);
legacy_axi4.arvalid = 1'b0;
s_legacy_cycles = 0;
beats = 0;
while (beats < 16) begin
@(posedge clk_i);
s_legacy_cycles = s_legacy_cycles + 1;
if (legacy_axi4.rvalid) beats = beats + 1;
end
end
endtask
initial begin
init_axi4();
repeat (3) @(posedge clk_i);
@(negedge clk_i);
rst_n_i = 1'b1;
measure_native();
measure_legacy();
$display("on-chip SRAM burst cycles native=%0d legacy=%0d", s_native_cycles, s_legacy_cycles);
if ((s_native_cycles != 16) || (s_legacy_cycles < (s_native_cycles + 2))) begin
$fatal(1, "native SRAM did not reach one beat per cycle or remove bridge overhead");
end
$finish;
end
endmodule