Skip to content

Commit 8810353

Browse files
committed
axi_bus_compare: Fixes and changes from the PR, add README entry
1 parent 96cdede commit 8810353

File tree

5 files changed

+96
-88
lines changed

5 files changed

+96
-88
lines changed

README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ In addition to the documents linked in the following table, we are setting up [d
6161
| [`axi_xbar`](src/axi_xbar.sv) | Fully-connected AXI4+ATOP crossbar with an arbitrary number of slave and master ports. | [Doc](doc/axi_xbar.md) |
6262
| [`axi_xp`](src/axi_xp.sv) | AXI Crosspoint (XP) with homomorphous slave and master ports. | |
6363

64+
## Synthesizable Verification Modules
65+
66+
The following modules are meant to be used for verification purposes only but are synthesizable to be used in FPGA environments.
67+
68+
| Name | Description |
69+
|------------------------------------------------------|---------------------------------------------------------------------------------------------------------|
70+
| [`axi_bus_compare`](src/axi_bus_compare.sv) | Compares two buses of the same type (and in the same clock domain), returns events on mismatch. |
71+
| [`axi_slave_compare`](src/axi_slave_compare.sv) | Compares two slave devices of the same type (and in the same clock domain), returns events on mismatch. |
72+
6473
### Simulation-Only Modules
6574

6675
In addition to the modules above, which are available in synthesis and simulation, the following modules are available only in simulation. Those modules are widely used in our testbenches, but they are also suitable to build testbenches for AXI modules and systems outside this repository.

src/axi_bus_compare.sv

Lines changed: 77 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// Authors:
1313
// - Thomas Benz <[email protected]>
1414

15+
`include "axi/assign.svh"
1516
/// Synthesizable test module comparing two AXI channels of the same type
1617
/// This module is meant to be used in FPGA-based verification.
1718
module axi_bus_compare #(
@@ -79,22 +80,23 @@ module axi_bus_compare #(
7980
// Channel Signals
8081
//-----------------------------------
8182
// assign request payload A
82-
assign axi_a_req_o.aw = axi_a_req_i.aw;
83-
assign axi_a_req_o.w = axi_a_req_i.w;
84-
assign axi_a_req_o.ar = axi_a_req_i.ar;
83+
84+
`AXI_ASSIGN_AW_STRUCT(axi_a_req_o.aw, axi_a_req_i.aw)
85+
`AXI_ASSIGN_W_STRUCT(axi_a_req_o.w, axi_a_req_i.w)
86+
`AXI_ASSIGN_AR_STRUCT(axi_a_req_o.ar, axi_a_req_i.ar)
8587

8688
// assign response payload A
87-
assign axi_a_rsp_o.r = axi_a_rsp_i.r;
88-
assign axi_a_rsp_o.b = axi_a_rsp_i.b;
89+
`AXI_ASSIGN_R_STRUCT(axi_a_rsp_o.r, axi_a_rsp_i.r)
90+
`AXI_ASSIGN_B_STRUCT(axi_a_rsp_o.b, axi_a_rsp_i.b)
8991

9092
// assign request payload B
91-
assign axi_b_req_o.aw = axi_b_req_i.aw;
92-
assign axi_b_req_o.w = axi_b_req_i.w;
93-
assign axi_b_req_o.ar = axi_b_req_i.ar;
93+
`AXI_ASSIGN_AW_STRUCT(axi_b_req_o.aw, axi_b_req_i.aw)
94+
`AXI_ASSIGN_W_STRUCT(axi_b_req_o.w, axi_b_req_i.w)
95+
`AXI_ASSIGN_AR_STRUCT(axi_b_req_o.ar, axi_b_req_i.ar)
9496

9597
// assign response payload B
96-
assign axi_b_rsp_o.r = axi_b_rsp_i.r;
97-
assign axi_b_rsp_o.b = axi_b_rsp_i.b;
98+
`AXI_ASSIGN_R_STRUCT(axi_b_rsp_o.r, axi_b_rsp_i.r)
99+
`AXI_ASSIGN_B_STRUCT(axi_b_rsp_o.b, axi_b_rsp_i.b)
98100

99101
// fifo handshaking signals A
100102
id_t fifo_valid_aw_a, fifo_ready_aw_a;
@@ -314,40 +316,38 @@ module axi_bus_compare #(
314316
// Input Handshaking A
315317
//-----------------------------------
316318
always_comb begin : gen_handshaking_a
317-
for (int id = 0; id < 2**AxiIdWidth; id++) begin
318-
// aw
319-
// defaults
320-
fifo_valid_aw_a = '0;
321-
fifo_sel_ready_aw_a = '0;
322-
// assign according id
323-
fifo_valid_aw_a [axi_a_req_i.aw.id] = fifo_sel_valid_aw_a;
324-
fifo_sel_ready_aw_a = fifo_ready_aw_a[axi_a_req_i.aw.id];
325-
326-
327-
// b
328-
// defaults
329-
fifo_valid_b_a = '0;
330-
fifo_sel_ready_b_a = '0;
331-
// assign according id
332-
fifo_valid_b_a [axi_a_rsp_i.b.id] = fifo_sel_valid_b_a;
333-
fifo_sel_ready_b_a = fifo_ready_b_a[axi_a_rsp_i.b.id];
334-
335-
// ar
336-
// defaults
337-
fifo_valid_ar_a = '0;
338-
fifo_sel_ready_ar_a = '0;
339-
// assign according id
340-
fifo_valid_ar_a [axi_a_req_i.ar.id] = fifo_sel_valid_ar_a;
341-
fifo_sel_ready_ar_a = fifo_ready_ar_a[axi_a_req_i.ar.id];
342-
343-
// b
344-
// defaults
345-
fifo_valid_r_a = '0;
346-
fifo_sel_ready_r_a = '0;
347-
// assign according id
348-
fifo_valid_r_a [axi_a_rsp_i.r.id] = fifo_sel_valid_r_a;
349-
fifo_sel_ready_r_a = fifo_ready_r_a[axi_a_rsp_i.r.id];
350-
end
319+
// aw
320+
// defaults
321+
fifo_valid_aw_a = '0;
322+
fifo_sel_ready_aw_a = '0;
323+
// assign according id
324+
fifo_valid_aw_a [axi_a_req_i.aw.id] = fifo_sel_valid_aw_a;
325+
fifo_sel_ready_aw_a = fifo_ready_aw_a[axi_a_req_i.aw.id];
326+
327+
328+
// b
329+
// defaults
330+
fifo_valid_b_a = '0;
331+
fifo_sel_ready_b_a = '0;
332+
// assign according id
333+
fifo_valid_b_a [axi_a_rsp_i.b.id] = fifo_sel_valid_b_a;
334+
fifo_sel_ready_b_a = fifo_ready_b_a[axi_a_rsp_i.b.id];
335+
336+
// ar
337+
// defaults
338+
fifo_valid_ar_a = '0;
339+
fifo_sel_ready_ar_a = '0;
340+
// assign according id
341+
fifo_valid_ar_a [axi_a_req_i.ar.id] = fifo_sel_valid_ar_a;
342+
fifo_sel_ready_ar_a = fifo_ready_ar_a[axi_a_req_i.ar.id];
343+
344+
// b
345+
// defaults
346+
fifo_valid_r_a = '0;
347+
fifo_sel_ready_r_a = '0;
348+
// assign according id
349+
fifo_valid_r_a [axi_a_rsp_i.r.id] = fifo_sel_valid_r_a;
350+
fifo_sel_ready_r_a = fifo_ready_r_a[axi_a_rsp_i.r.id];
351351
end
352352

353353

@@ -516,40 +516,38 @@ module axi_bus_compare #(
516516
// Input Handshaking B
517517
//-----------------------------------
518518
always_comb begin : gen_handshaking_b
519-
for (int id = 0; id < 2**AxiIdWidth; id++) begin
520-
// aw
521-
// defaults
522-
fifo_valid_aw_b = '0;
523-
fifo_sel_ready_aw_b = '0;
524-
// assign according id
525-
fifo_valid_aw_b [axi_b_req_i.aw.id] = fifo_sel_valid_aw_b;
526-
fifo_sel_ready_aw_b = fifo_ready_aw_b[axi_b_req_i.aw.id];
527-
528-
529-
// b
530-
// defaults
531-
fifo_valid_b_b = '0;
532-
fifo_sel_ready_b_b = '0;
533-
// assign according id
534-
fifo_valid_b_b [axi_b_rsp_i.b.id] = fifo_sel_valid_b_b;
535-
fifo_sel_ready_b_b = fifo_ready_b_b[axi_b_rsp_i.b.id];
536-
537-
// ar
538-
// defaults
539-
fifo_valid_ar_b = '0;
540-
fifo_sel_ready_ar_b = '0;
541-
// assign according id
542-
fifo_valid_ar_b [axi_b_req_i.ar.id] = fifo_sel_valid_ar_b;
543-
fifo_sel_ready_ar_b = fifo_ready_ar_b[axi_b_req_i.ar.id];
544-
545-
// b
546-
// defaults
547-
fifo_valid_r_b = '0;
548-
fifo_sel_ready_r_b = '0;
549-
// assign according id
550-
fifo_valid_r_b [axi_b_rsp_i.r.id] = fifo_sel_valid_r_b;
551-
fifo_sel_ready_r_b = fifo_ready_r_b[axi_b_rsp_i.r.id];
552-
end
519+
// aw
520+
// defaults
521+
fifo_valid_aw_b = '0;
522+
fifo_sel_ready_aw_b = '0;
523+
// assign according id
524+
fifo_valid_aw_b [axi_b_req_i.aw.id] = fifo_sel_valid_aw_b;
525+
fifo_sel_ready_aw_b = fifo_ready_aw_b[axi_b_req_i.aw.id];
526+
527+
528+
// b
529+
// defaults
530+
fifo_valid_b_b = '0;
531+
fifo_sel_ready_b_b = '0;
532+
// assign according id
533+
fifo_valid_b_b [axi_b_rsp_i.b.id] = fifo_sel_valid_b_b;
534+
fifo_sel_ready_b_b = fifo_ready_b_b[axi_b_rsp_i.b.id];
535+
536+
// ar
537+
// defaults
538+
fifo_valid_ar_b = '0;
539+
fifo_sel_ready_ar_b = '0;
540+
// assign according id
541+
fifo_valid_ar_b [axi_b_req_i.ar.id] = fifo_sel_valid_ar_b;
542+
fifo_sel_ready_ar_b = fifo_ready_ar_b[axi_b_req_i.ar.id];
543+
544+
// b
545+
// defaults
546+
fifo_valid_r_b = '0;
547+
fifo_sel_ready_r_b = '0;
548+
// assign according id
549+
fifo_valid_r_b [axi_b_rsp_i.r.id] = fifo_sel_valid_r_b;
550+
fifo_sel_ready_r_b = fifo_ready_r_b[axi_b_rsp_i.r.id];
553551
end
554552

555553

@@ -584,4 +582,4 @@ module axi_bus_compare #(
584582
assign mismatch_o = (|aw_mismatch_o) | (|w_mismatch_o) | (|b_mismatch_o) |
585583
(|ar_mismatch_o) | (|r_mismatch_o);
586584

587-
endmodule : axi_bus_compare
585+
endmodule

src/axi_slave_compare.sv

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// Authors:
1313
// - Thomas Benz <[email protected]>
1414

15+
`include "axi/assign.svh"
1516
/// Synthesizable test module comparing two AXI slaves of the same type.
1617
/// The reference response is always passed to the master, whereas the test response
1718
/// is discarded after handshaking.
@@ -123,8 +124,8 @@ module axi_slave_compare #(
123124
// assemble buses
124125
always_comb begin
125126
// request
126-
axi_ref_req_in = axi_mst_req_i;
127-
axi_test_req_in = axi_mst_req_i;
127+
`AXI_SET_REQ_STRUCT(axi_ref_req_in, axi_mst_req_i)
128+
`AXI_SET_REQ_STRUCT(axi_test_req_in, axi_mst_req_i)
128129
// overwrite valids in requests
129130
axi_ref_req_in.aw_valid = aw_valid_ref;
130131
axi_ref_req_in.ar_valid = ar_valid_ref;
@@ -140,7 +141,7 @@ module axi_slave_compare #(
140141
ar_ready_test = axi_test_rsp_in.ar_ready;
141142
w_ready_test = axi_test_rsp_in.w_ready;
142143
// response
143-
axi_mst_rsp_o = axi_ref_rsp_in;
144+
`AXI_SET_RESP_STRUCT(axi_mst_rsp_o, axi_ref_rsp_in)
144145
// overwrite readies
145146
axi_mst_rsp_o.aw_ready = aw_ready_mst;
146147
axi_mst_rsp_o.w_ready = w_ready_mst;
@@ -181,4 +182,4 @@ module axi_slave_compare #(
181182
.axi_b_rsp_i ( axi_test_rsp_i )
182183
);
183184

184-
endmodule : axi_slave_compare
185+
endmodule

test/tb_axi_bus_compare.sv

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ module tb_axi_bus_compare #(
109109
// assemble buses
110110
always_comb begin
111111
// request
112-
axi_req_a_in = axi_req;
113-
axi_req_b_in = axi_req;
112+
`AXI_SET_REQ_STRUCT(axi_req_a_in, axi_req)
113+
`AXI_SET_REQ_STRUCT(axi_req_b_in, axi_req)
114114
// overwrite valids in requests
115115
axi_req_a_in.aw_valid = aw_valid_a;
116116
axi_req_a_in.ar_valid = ar_valid_a;
@@ -126,7 +126,7 @@ module tb_axi_bus_compare #(
126126
ar_ready_b = axi_rsp_b_in.ar_ready;
127127
w_ready_b = axi_rsp_b_in.w_ready;
128128
// response
129-
axi_rsp = axi_rsp_a_in;
129+
`AXI_SET_RESP_STRUCT(axi_rsp, axi_rsp_a_in)
130130
// overwrite readies
131131
axi_rsp.aw_ready = aw_ready;
132132
axi_rsp.w_ready = w_ready;
@@ -307,4 +307,4 @@ module tb_axi_bus_compare #(
307307
$finish();
308308
end
309309

310-
endmodule : tb_axi_bus_compare
310+
endmodule

test/tb_axi_slave_compare.sv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,4 +236,4 @@ module tb_axi_slave_compare #(
236236
$finish();
237237
end
238238

239-
endmodule : tb_axi_slave_compare
239+
endmodule

0 commit comments

Comments
 (0)