116 lines
3.0 KiB
Systemverilog
116 lines
3.0 KiB
Systemverilog
{% extends "lib/tb_base.sv" %}
|
|
|
|
|
|
|
|
{%- block dut_support %}
|
|
{% sv_line_anchor %}
|
|
|
|
external_block #(
|
|
.ADDR_WIDTH($clog2('h10))
|
|
) mem1_inst (
|
|
.clk(clk),
|
|
.rst(rst),
|
|
|
|
.req(hwif_out.mem1.req),
|
|
.req_is_wr(hwif_out.mem1.req_is_wr),
|
|
.addr(hwif_out.mem1.addr),
|
|
.wr_data(hwif_out.mem1.wr_data),
|
|
.wr_biten(hwif_out.mem1.wr_biten),
|
|
.rd_ack(hwif_in.mem1.rd_ack),
|
|
.rd_data(hwif_in.mem1.rd_data),
|
|
.wr_ack(hwif_in.mem1.wr_ack)
|
|
);
|
|
|
|
external_block #(
|
|
.ADDR_WIDTH($clog2('h90))
|
|
) mem2_inst (
|
|
.clk(clk),
|
|
.rst(rst),
|
|
|
|
.req(hwif_out.mem2.req),
|
|
.req_is_wr(hwif_out.mem2.req_is_wr),
|
|
.addr(hwif_out.mem2.addr),
|
|
.wr_data(hwif_out.mem2.wr_data),
|
|
.wr_biten(hwif_out.mem2.wr_biten),
|
|
.rd_ack(hwif_in.mem2.rd_ack),
|
|
.rd_data(hwif_in.mem2.rd_data),
|
|
.wr_ack(hwif_in.mem2.wr_ack)
|
|
);
|
|
|
|
{%- endblock %}
|
|
|
|
|
|
|
|
{% block seq %}
|
|
{% sv_line_anchor %}
|
|
##1;
|
|
cb.rst <= '0;
|
|
##1;
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Simple read/write tests
|
|
//--------------------------------------------------------------------------
|
|
// mem1
|
|
repeat(32) begin
|
|
logic [31:0] x;
|
|
int unsigned addr;
|
|
x = $urandom();
|
|
addr = 'h0;
|
|
addr += $urandom_range(('h10 / 4) - 1) * 4;
|
|
cpuif.write(addr, x);
|
|
cpuif.assert_read(addr, x);
|
|
end
|
|
|
|
// mem2
|
|
repeat(32) begin
|
|
logic [31:0] x;
|
|
int unsigned addr;
|
|
x = $urandom();
|
|
addr = 'h200;
|
|
addr += $urandom_range(('h90 / 4) - 1) * 4;
|
|
cpuif.write(addr, x);
|
|
cpuif.assert_read(addr, x);
|
|
end
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Pipelined access
|
|
//--------------------------------------------------------------------------
|
|
// init array with unique known value
|
|
for(int i=0; i<('h10 / 4); i++) begin
|
|
cpuif.write('h0 + i*4, 'h1000 + i);
|
|
end
|
|
for(int i=0; i<('h90 / 4); i++) begin
|
|
cpuif.write('h200 + i*4, 'h3000 + i);
|
|
end
|
|
|
|
// random pipelined read/writes
|
|
repeat(256) begin
|
|
fork
|
|
begin
|
|
int i;
|
|
logic [31:0] x;
|
|
int unsigned addr;
|
|
case($urandom_range(1))
|
|
0: begin
|
|
i = $urandom_range(('h10 / 4) - 1);
|
|
x = 'h1000 + i;
|
|
addr = 'h0 + i*4;
|
|
end
|
|
1: begin
|
|
i = $urandom_range(('h90 / 4) - 1);
|
|
x = 'h3000 + i;
|
|
addr = 'h200 + i*4;
|
|
end
|
|
endcase
|
|
|
|
case($urandom_range(1))
|
|
0: cpuif.write(addr, x);
|
|
1: cpuif.assert_read(addr, x);
|
|
endcase
|
|
end
|
|
join_none
|
|
end
|
|
wait fork;
|
|
|
|
{% endblock %}
|