mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-06 14:55:14 +00:00
147 lines
4.1 KiB
Systemverilog
147 lines
4.1 KiB
Systemverilog
`timescale 1ns / 1ps
|
|
|
|
`include "axi4_define.svh"
|
|
`include "onchip_ram_define.svh"
|
|
|
|
module onchip_ram_absent_tb;
|
|
logic clk_i = 1'b0;
|
|
logic rst_n_i = 1'b0;
|
|
|
|
axi4_if #(
|
|
.ADDR_WIDTH(32),
|
|
.DATA_WIDTH(32),
|
|
.ID_WIDTH (1),
|
|
.USER_WIDTH(1)
|
|
) mem_axi4 (
|
|
.aclk (clk_i),
|
|
.aresetn(rst_n_i)
|
|
);
|
|
apb4_if cfg_apb4 (
|
|
.pclk (clk_i),
|
|
.presetn(rst_n_i)
|
|
);
|
|
|
|
always #5 clk_i = ~clk_i;
|
|
|
|
onchip_ram #(
|
|
.Present (1'b0),
|
|
.CapacityKiB(128)
|
|
) u_dut (
|
|
.clk_i (clk_i),
|
|
.rst_n_i (rst_n_i),
|
|
.perf_enable_i(1'b1),
|
|
.perf_clear_i (1'b0),
|
|
.mem_axi4 (mem_axi4),
|
|
.cfg_apb4 (cfg_apb4)
|
|
);
|
|
|
|
task automatic init_interfaces;
|
|
begin
|
|
mem_axi4.awid = '0;
|
|
mem_axi4.awaddr = '0;
|
|
mem_axi4.awlen = '0;
|
|
mem_axi4.awsize = `AXI4_BURST_SIZE_4BYTES;
|
|
mem_axi4.awburst = `AXI4_BURST_TYPE_INCR;
|
|
mem_axi4.awlock = `AXI4_LOCK_NORM;
|
|
mem_axi4.awcache = `AXI4_CACHE_NO_BUF;
|
|
mem_axi4.awprot = `AXI4_PROT_DATA;
|
|
mem_axi4.awqos = `AXI4_QOS_NORMAL;
|
|
mem_axi4.awregion = `AXI4_REGION_NORMAL;
|
|
mem_axi4.awuser = '0;
|
|
mem_axi4.awvalid = 1'b0;
|
|
mem_axi4.wdata = '0;
|
|
mem_axi4.wstrb = '0;
|
|
mem_axi4.wlast = 1'b0;
|
|
mem_axi4.wuser = '0;
|
|
mem_axi4.wvalid = 1'b0;
|
|
mem_axi4.bready = 1'b0;
|
|
mem_axi4.arid = '0;
|
|
mem_axi4.araddr = '0;
|
|
mem_axi4.arlen = '0;
|
|
mem_axi4.arsize = `AXI4_BURST_SIZE_4BYTES;
|
|
mem_axi4.arburst = `AXI4_BURST_TYPE_INCR;
|
|
mem_axi4.arlock = `AXI4_LOCK_NORM;
|
|
mem_axi4.arcache = `AXI4_CACHE_NO_BUF;
|
|
mem_axi4.arprot = `AXI4_PROT_DATA;
|
|
mem_axi4.arqos = `AXI4_QOS_NORMAL;
|
|
mem_axi4.arregion = `AXI4_REGION_NORMAL;
|
|
mem_axi4.aruser = '0;
|
|
mem_axi4.arvalid = 1'b0;
|
|
mem_axi4.rready = 1'b0;
|
|
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 apb_read(input logic [11:0] offset, input logic [31:0] expected);
|
|
begin
|
|
@(negedge clk_i);
|
|
cfg_apb4.paddr = {20'd0, offset};
|
|
cfg_apb4.psel = 1'b1;
|
|
cfg_apb4.penable = 1'b0;
|
|
@(negedge clk_i);
|
|
cfg_apb4.penable = 1'b1;
|
|
do @(posedge clk_i); while (!cfg_apb4.pready);
|
|
if (cfg_apb4.pslverr || (cfg_apb4.prdata !== expected)) begin
|
|
$fatal(1, "absent SRAM APB read mismatch offset=%03x", offset);
|
|
end
|
|
@(negedge clk_i);
|
|
cfg_apb4.psel = 1'b0;
|
|
cfg_apb4.penable = 1'b0;
|
|
end
|
|
endtask
|
|
|
|
initial begin
|
|
init_interfaces();
|
|
repeat (3) @(posedge clk_i);
|
|
@(negedge clk_i);
|
|
rst_n_i = 1'b1;
|
|
|
|
apb_read(`APB4_ONCHIP_RAM__CAPABILITY, 32'h0004_107E);
|
|
apb_read(`APB4_ONCHIP_RAM__MEMORY_BYTES, 32'd0);
|
|
apb_read(`APB4_ONCHIP_RAM__BANK_COUNT, 32'd0);
|
|
|
|
@(negedge clk_i);
|
|
mem_axi4.araddr = `SOC_ADDR_SRAM_BASE;
|
|
mem_axi4.arvalid = 1'b1;
|
|
do @(posedge clk_i); while (!mem_axi4.arready);
|
|
@(negedge clk_i);
|
|
mem_axi4.arvalid = 1'b0;
|
|
mem_axi4.rready = 1'b1;
|
|
do @(posedge clk_i); while (!mem_axi4.rvalid);
|
|
if ((mem_axi4.rresp != `AXI4_RESP_DECODE_ERROR) || !mem_axi4.rlast) begin
|
|
$fatal(1, "absent SRAM read did not return DECERR");
|
|
end
|
|
@(negedge clk_i);
|
|
mem_axi4.rready = 1'b0;
|
|
|
|
@(negedge clk_i);
|
|
mem_axi4.awaddr = `SOC_ADDR_SRAM_BASE;
|
|
mem_axi4.awvalid = 1'b1;
|
|
do @(posedge clk_i); while (!mem_axi4.awready);
|
|
@(negedge clk_i);
|
|
mem_axi4.awvalid = 1'b0;
|
|
mem_axi4.wdata = 32'hDEAD_BEEF;
|
|
mem_axi4.wstrb = 4'hF;
|
|
mem_axi4.wlast = 1'b1;
|
|
mem_axi4.wvalid = 1'b1;
|
|
do @(posedge clk_i); while (!mem_axi4.wready);
|
|
@(negedge clk_i);
|
|
mem_axi4.wvalid = 1'b0;
|
|
mem_axi4.wlast = 1'b0;
|
|
mem_axi4.bready = 1'b1;
|
|
do @(posedge clk_i); while (!mem_axi4.bvalid);
|
|
if (mem_axi4.bresp != `AXI4_RESP_DECODE_ERROR) begin
|
|
$fatal(1, "absent SRAM write did not return DECERR");
|
|
end
|
|
|
|
$display("absent on-chip SRAM test passed");
|
|
$finish;
|
|
end
|
|
endmodule
|