Skip to content

Commit 4b93120

Browse files
Add br_amba_axil2apb test (#1213)
Add simulation coverage for `br_amba_axil2apb` and refactor shared AMBA simulation helpers so AXI-Lite/APB drivers and monitors can be reused across benches. - Add `br_amba_axil2apb_tb` with directed and randomized scenarios for: - reset/idle behavior - no-delay reads and writes - zero-strobe writes - APB `PREADY` backpressure on reads and writes - independent AW/W channel skew - read/write arbitration - AXI B/R response backpressure - APB `PSLVERR` propagation - mixed directed traffic - sustained stress traffic - mid-transaction reset recovery - Add `br_amba_axil2apb_scoreboard` to predict protocol-agnostic transactions from AXI-Lite observations and verify: - AXI-Lite request payloads - APB transfer payloads and timing - AXI-Lite response payloads and timing - read/write arbitration priority - Add/refactor reusable simulation components: - generic AXI-Lite requester driver - generic AXI-Lite monitor with channel observations and protocol checks - generic APB monitor with request/completion timestamps - APB completer response queue support - shared AMBA sim helpers and protocol transaction types - Rename the existing AXI-Lite driver to `br_amba_axil_completer_driver` to clarify side ownership. - Update AXI-Lite default target tests to use the common helper structure. Depends on: #1183 and #1197. --------- Co-authored-by: Wiktoria Kuna <wkuna@antmicro.com>
1 parent 5bff9d7 commit 4b93120

21 files changed

Lines changed: 3694 additions & 179 deletions

amba/sim/BUILD.bazel

Lines changed: 135 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,88 @@ load("@rules_hdl//verilog:providers.bzl", "verilog_library")
44
load("//bazel:br_verilog.bzl", "br_verilog_sim_test_tools_suite")
55
load("//bazel:verilog.bzl", "verilog_elab_test")
66

7+
BR_AMBA_SIM_MAX_CHECK_WIDTH_64 = "BR_AMBA_SIM_MAX_CHECK_WIDTH=64"
8+
9+
BR_AMBA_SIM_DEFINES_64 = [
10+
"BR_ASSERT_ON",
11+
"BR_ENABLE_IMPL_CHECKS",
12+
"SIMULATION",
13+
BR_AMBA_SIM_MAX_CHECK_WIDTH_64,
14+
]
15+
16+
BR_AMBA_APB_TIMING_SLICE_DEFINES = [
17+
"BR_AMBA_APB_SIM_ADDR_WIDTH=32",
18+
"BR_AMBA_APB_SIM_DATA_WIDTH=32",
19+
]
20+
21+
verilog_library(
22+
name = "br_amba_axil2apb_sim_pkg",
23+
srcs = ["br_amba_axil2apb_sim_pkg.sv"],
24+
visibility = ["//visibility:public"],
25+
deps = [
26+
"//amba/rtl:br_amba_pkg",
27+
"//amba/sim/drivers:br_amba_apb_sim_pkg",
28+
],
29+
)
30+
31+
verilog_library(
32+
name = "br_amba_axil2apb_tb",
33+
srcs = ["br_amba_axil2apb_tb.sv"],
34+
deps = [
35+
":br_amba_axil2apb_sim_pkg",
36+
"//amba/rtl:br_amba_axil2apb",
37+
"//amba/sim/drivers:br_amba_apb_sim_helpers",
38+
"//amba/sim/drivers:br_amba_axil_requester_driver",
39+
"//amba/sim/drivers:br_amba_sim_pkg",
40+
"//amba/sim/monitors:br_amba_apb_monitor",
41+
"//amba/sim/monitors:br_amba_axil2apb_scoreboard",
42+
"//amba/sim/monitors:br_amba_axil_monitor",
43+
"//amba/sim/monitors:br_amba_axil_monitor_sim_pkg",
44+
"//macros:br_asserts",
45+
"//misc/sim:br_test_driver",
46+
],
47+
)
48+
49+
verilog_elab_test(
50+
name = "br_amba_axil2apb_tb_elab_test",
51+
defines = [
52+
"BR_AMBA_SIM_MAX_CHECK_WIDTH=32",
53+
"BR_AMBA_AXIL_SIM_ADDR_WIDTH=12",
54+
"BR_AMBA_AXIL_SIM_DATA_WIDTH=32",
55+
"BR_AMBA_AXIL_SIM_USER_WIDTH=1",
56+
"BR_AMBA_APB_SIM_ADDR_WIDTH=12",
57+
"BR_AMBA_APB_SIM_DATA_WIDTH=32",
58+
],
59+
tool = "slang",
60+
deps = [":br_amba_axil2apb_tb"],
61+
)
62+
63+
[
64+
br_verilog_sim_test_tools_suite(
65+
name = "br_amba_axil2apb_sim_test_tools_suite_dw%s" % data_width,
66+
defines = [
67+
"BR_ASSERT_ON",
68+
"BR_ENABLE_IMPL_CHECKS",
69+
"SIMULATION",
70+
"BR_AMBA_SIM_MAX_CHECK_WIDTH=%s" % data_width,
71+
"BR_AMBA_AXIL_SIM_ADDR_WIDTH=12",
72+
"BR_AMBA_AXIL_SIM_DATA_WIDTH=%s" % data_width,
73+
"BR_AMBA_AXIL_SIM_USER_WIDTH=1",
74+
"BR_AMBA_APB_SIM_ADDR_WIDTH=12",
75+
"BR_AMBA_APB_SIM_DATA_WIDTH=%s" % data_width,
76+
],
77+
tools = [
78+
"vcs",
79+
"verilator",
80+
],
81+
deps = [":br_amba_axil2apb_tb"],
82+
)
83+
for data_width in [
84+
"32",
85+
"64",
86+
]
87+
]
88+
789
verilog_library(
890
name = "br_amba_apb_timing_slice_tb",
991
srcs = ["br_amba_apb_timing_slice_tb.sv"],
@@ -17,12 +99,14 @@ verilog_library(
1799

18100
verilog_elab_test(
19101
name = "br_amba_apb_timing_slice_tb_elab_test",
102+
defines = BR_AMBA_APB_TIMING_SLICE_DEFINES,
20103
tool = "slang",
21104
deps = [":br_amba_apb_timing_slice_tb"],
22105
)
23106

24107
br_verilog_sim_test_tools_suite(
25108
name = "br_amba_apb_timing_slice_sim_test_tools_suite",
109+
defines = BR_AMBA_APB_TIMING_SLICE_DEFINES,
26110
params = {
27111
"AddrWidth": [
28112
"12",
@@ -176,6 +260,9 @@ verilog_elab_test(
176260
"BR_AMBA_AXI_SIM_DATA_WIDTH=32",
177261
"BR_AMBA_AXI_SIM_ID_WIDTH=3",
178262
"BR_AMBA_AXI_SIM_USER_WIDTH=2",
263+
"BR_AMBA_AXIL_SIM_ADDR_WIDTH=12",
264+
"BR_AMBA_AXIL_SIM_DATA_WIDTH=32",
265+
"BR_AMBA_AXIL_SIM_USER_WIDTH=2",
179266
],
180267
tool = "slang",
181268
deps = [":br_amba_axi2axil_tb"],
@@ -192,6 +279,9 @@ verilog_elab_test(
192279
"BR_AMBA_AXI_SIM_DATA_WIDTH=%s" % data_width,
193280
"BR_AMBA_AXI_SIM_ID_WIDTH=3",
194281
"BR_AMBA_AXI_SIM_USER_WIDTH=2",
282+
"BR_AMBA_AXIL_SIM_ADDR_WIDTH=12",
283+
"BR_AMBA_AXIL_SIM_DATA_WIDTH=%s" % data_width,
284+
"BR_AMBA_AXIL_SIM_USER_WIDTH=2",
195285
],
196286
params = {
197287
"MaxOutstandingReqs": [
@@ -356,7 +446,8 @@ verilog_library(
356446
srcs = ["br_amba_axil_default_target_tb.sv"],
357447
deps = [
358448
"//amba/rtl:br_amba_axil_default_target",
359-
"//amba/sim/drivers:br_amba_axil_driver",
449+
"//amba/sim/drivers:br_amba_axil_completer_driver",
450+
"//amba/sim/drivers:br_amba_sim_pkg",
360451
"//amba/sim/monitors:br_amba_axil_monitor",
361452
"//misc/sim:br_test_driver",
362453
],
@@ -392,3 +483,46 @@ br_verilog_sim_test_tools_suite(
392483
],
393484
deps = [":br_amba_axil_default_target_tb"],
394485
)
486+
487+
verilog_library(
488+
name = "br_amba_atb_funnel_tb",
489+
srcs = ["br_amba_atb_funnel_tb.sv"],
490+
deps = [
491+
"//amba/rtl:br_amba_atb_funnel",
492+
"//misc/sim:br_test_driver",
493+
],
494+
)
495+
496+
verilog_elab_test(
497+
name = "br_amba_atb_funnel_tb_elab_test",
498+
tool = "slang",
499+
deps = [":br_amba_atb_funnel_tb"],
500+
)
501+
502+
br_verilog_sim_test_tools_suite(
503+
name = "br_amba_atb_funnel_sim_test_tools_suite",
504+
params = {
505+
"DataWidth": [
506+
"32",
507+
"64",
508+
],
509+
"NumSources": [
510+
"2",
511+
"4",
512+
"17",
513+
],
514+
"RegisterAtReady": [
515+
"0",
516+
"1",
517+
],
518+
"UserWidth": [
519+
"1",
520+
"3",
521+
],
522+
},
523+
tools = [
524+
"vcs",
525+
"verilator",
526+
],
527+
deps = [":br_amba_atb_funnel_tb"],
528+
)

amba/sim/br_amba_apb_timing_slice_tb.sv

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ module br_amba_apb_timing_slice_tb;
6161
function automatic apb_request_t get_request(
6262
input logic [AddrWidth-1:0] addr, input logic [ApbProtWidth-1:0] prot, input logic [3:0] strb,
6363
input logic write, input logic [31:0] wdata);
64-
get_request.addr = addr;
64+
get_request.addr = ApbAddrWidth'(addr);
6565
get_request.prot = prot;
66-
get_request.strb = strb;
66+
get_request.strb = ApbStrbWidth'(strb);
6767
get_request.write = write;
68-
get_request.wdata = wdata;
68+
get_request.wdata = ApbDataWidth'(wdata);
6969
endfunction
7070

7171
function automatic apb_request_controls_t get_request_controls(
@@ -77,7 +77,7 @@ module br_amba_apb_timing_slice_tb;
7777

7878
function automatic apb_response_t get_response(input logic [31:0] rdata, input logic slverr);
7979
get_response.ready = 1'b1;
80-
get_response.rdata = rdata;
80+
get_response.rdata = ApbDataWidth'(rdata);
8181
get_response.slverr = slverr;
8282
endfunction
8383

@@ -89,6 +89,7 @@ module br_amba_apb_timing_slice_tb;
8989

9090
logic monitor_enable;
9191
logic monitor_done;
92+
logic completer_failed;
9293

9394
br_amba_apb_timing_slice #(
9495
.AddrWidth(AddrWidth)
@@ -147,7 +148,8 @@ module br_amba_apb_timing_slice_tb;
147148
.target_penable(penable_out),
148149
.pready(pready_in),
149150
.prdata(prdata_in),
150-
.pslverr(pslverr_in)
151+
.pslverr(pslverr_in),
152+
.failed(completer_failed)
151153
);
152154

153155
br_amba_apb_timing_slice_monitor #(
@@ -183,7 +185,7 @@ module br_amba_apb_timing_slice_tb;
183185
input apb_request_t request, input apb_request_controls_t request_controls,
184186
input apb_response_t response, input apb_response_controls_t response_controls);
185187
for (int transaction = 0; transaction < response_controls.num_transactions; transaction++) begin
186-
monitor.expect_response(response.rdata + 32'(transaction), response.slverr);
188+
monitor.expect_response(32'(response.rdata) + 32'(transaction), response.slverr);
187189
end
188190
fork
189191
requester.run(request, request_controls);
@@ -281,6 +283,7 @@ module br_amba_apb_timing_slice_tb;
281283

282284
td.check(monitor.pending_count() == 0, "monitor response queue not empty");
283285
td.check(monitor.get_error_count() == 0, "APB monitor reported errors");
286+
td.check(!completer_failed, "APB completer reported failures");
284287
monitor_enable = 1'b0;
285288
monitor_done = 1'b1;
286289
td.finish();

0 commit comments

Comments
 (0)