diff --git a/arb/fpv/arb_basic_fpv_monitor.sv b/arb/fpv/arb_basic_fpv_monitor.sv index a741a4659..414f41120 100644 --- a/arb/fpv/arb_basic_fpv_monitor.sv +++ b/arb/fpv/arb_basic_fpv_monitor.sv @@ -8,7 +8,6 @@ `include "br_fv.svh" module arb_basic_fpv_monitor #( - // Must be at least 1 parameter int NumRequesters = 1 ) ( input logic clk, diff --git a/arb/fpv/br_arb_fixed_fpv_monitor.sv b/arb/fpv/br_arb_fixed_fpv_monitor.sv index 8b2044c63..aa67a4146 100644 --- a/arb/fpv/br_arb_fixed_fpv_monitor.sv +++ b/arb/fpv/br_arb_fixed_fpv_monitor.sv @@ -7,7 +7,6 @@ `include "br_fv.svh" module br_arb_fixed_fpv_monitor #( - // Must be at least 1 parameter int NumRequesters = 1 ) ( input logic clk, diff --git a/arb/fpv/lru_basic_fpv_monitor.sv b/arb/fpv/lru_basic_fpv_monitor.sv index d7a61504d..680b6f0a6 100644 --- a/arb/fpv/lru_basic_fpv_monitor.sv +++ b/arb/fpv/lru_basic_fpv_monitor.sv @@ -8,8 +8,8 @@ `include "br_fv.svh" module lru_basic_fpv_monitor #( - // Must be at least 2 - parameter int NumRequesters = 2, + // Must be at least 1 + parameter int NumRequesters = 1, // If 1, cover that request is multihot, // Otherwise, assume that it is onehot parameter bit EnableCoverRequestMultihot = 1 diff --git a/arb/fpv/rr_basic_fpv_monitor.sv b/arb/fpv/rr_basic_fpv_monitor.sv index e1478bb86..abf71f1b8 100644 --- a/arb/fpv/rr_basic_fpv_monitor.sv +++ b/arb/fpv/rr_basic_fpv_monitor.sv @@ -8,8 +8,8 @@ `include "br_fv.svh" module rr_basic_fpv_monitor #( - // Must be at least 2 - parameter int NumRequesters = 2, + // Must be at least 1 + parameter int NumRequesters = 1, parameter bit EnableAssertPushValidStability = 1 ) ( input logic clk, @@ -21,11 +21,14 @@ module rr_basic_fpv_monitor #( // ----------FV Modeling Code---------- logic [$clog2(NumRequesters)-1:0] i, j; + if (NumRequesters > 1) begin : gen_ij + `BR_FV_2RAND_IDX(i, j, NumRequesters) + end else begin : gen_i + assign i = 0; + end logic [NumRequesters-1:0] high_priority_request; - `BR_FV_2RAND_IDX(i, j, NumRequesters) - `BR_REGL(high_priority_request, - (grant == 1 << (NumRequesters - 1)) ? NumRequesters'(1) : grant << 1, + `BR_REGL(high_priority_request, (grant == 1 << (NumRequesters - 1)) ? 'd1 : grant << 1, (grant != 0) && enable_priority_update) // ----------Sanity Check---------- @@ -33,17 +36,20 @@ module rr_basic_fpv_monitor #( `BR_ASSERT(high_priority_grant_a, request[i] && high_priority_request[i] |-> grant[i]) // ----------Fairness Check---------- - `BR_ASSERT(arb_priority_a, - grant[j] |-> !request[i] || // high_priority ... j ... i - ((2 ** j >= high_priority_request) && (2 ** i > high_priority_request) && (j < i)) || - // i ... high_priority ... j - ((2 ** j >= high_priority_request) && (2 ** i < high_priority_request)) || - // j ... i ... high_priority ... - ((2 ** j <= high_priority_request) && (2 ** i < high_priority_request) && (j < i))) - - if (EnableAssertPushValidStability) begin : gen_req_stable - `BR_ASSERT(round_robin_a, - request[i] |-> not (!grant[i] && enable_priority_update throughout grant[j] [-> 2])) + if (NumRequesters > 1) begin : gen_multi_req + `BR_ASSERT(arb_priority_a, + grant[j] |-> !request[i] || // high_priority ... j ... i + ((2 ** j >= high_priority_request) && (2 ** i > high_priority_request) && (j < i)) || + // i ... high_priority ... j + ((2 ** j >= high_priority_request) && (2 ** i < high_priority_request)) || + // j ... i ... high_priority ... + ((2 ** j <= high_priority_request) && (2 ** i < high_priority_request) && (j < i))) + + if (EnableAssertPushValidStability) begin : gen_req_stable + `BR_ASSERT( + round_robin_a, + request[i] |-> not (!grant[i] && enable_priority_update throughout grant[j] [-> 2])) + end end // ----------Critical Covers---------- diff --git a/flow/fpv/arb/BUILD.bazel b/flow/fpv/arb/BUILD.bazel index e01cb3037..4680b15c4 100644 --- a/flow/fpv/arb/BUILD.bazel +++ b/flow/fpv/arb/BUILD.bazel @@ -50,6 +50,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -101,6 +102,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -152,6 +154,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", diff --git a/flow/fpv/arb/br_flow_arb_basic_fpv_monitor.sv b/flow/fpv/arb/br_flow_arb_basic_fpv_monitor.sv index b52ff0bbf..a1cf49177 100644 --- a/flow/fpv/arb/br_flow_arb_basic_fpv_monitor.sv +++ b/flow/fpv/arb/br_flow_arb_basic_fpv_monitor.sv @@ -7,7 +7,7 @@ `include "br_fv.svh" module br_flow_arb_basic_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 + parameter int NumFlows = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure ) ( diff --git a/flow/fpv/arb/br_flow_arb_fixed_fpv_monitor.sv b/flow/fpv/arb/br_flow_arb_fixed_fpv_monitor.sv index 3fc8e3862..30d708189 100644 --- a/flow/fpv/arb/br_flow_arb_fixed_fpv_monitor.sv +++ b/flow/fpv/arb/br_flow_arb_fixed_fpv_monitor.sv @@ -7,7 +7,7 @@ `include "br_fv.svh" module br_flow_arb_fixed_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 + parameter int NumFlows = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertFinalNotValid = 1 @@ -36,13 +36,15 @@ module br_flow_arb_fixed_fpv_monitor #( .pop_valid_unstable ); - // ----------FV Modeling Code---------- - logic [$clog2(NumFlows)-1:0] i, j; - `BR_FV_2RAND_IDX(i, j, NumFlows) + if (NumFlows > 1) begin : gen_multi_req + // ----------FV Modeling Code---------- + logic [$clog2(NumFlows)-1:0] i, j; + `BR_FV_2RAND_IDX(i, j, NumFlows) - // ----------Fairness Check---------- - if (EnableCoverPushBackpressure) begin : gen_strict_priority_check - `BR_ASSERT(strict_priority_a, (i < j) && push_valid[i] && push_valid[j] |-> !grant[j]) + // ----------Fairness Check---------- + if (EnableCoverPushBackpressure) begin : gen_strict_priority_check + `BR_ASSERT(strict_priority_a, (i < j) && push_valid[i] && push_valid[j] |-> !grant[j]) + end end endmodule : br_flow_arb_fixed_fpv_monitor diff --git a/flow/fpv/arb/br_flow_arb_lru_fpv_monitor.sv b/flow/fpv/arb/br_flow_arb_lru_fpv_monitor.sv index 4398ef509..79745276c 100644 --- a/flow/fpv/arb/br_flow_arb_lru_fpv_monitor.sv +++ b/flow/fpv/arb/br_flow_arb_lru_fpv_monitor.sv @@ -7,7 +7,7 @@ `include "br_fv.svh" module br_flow_arb_lru_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 + parameter int NumFlows = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertFinalNotValid = 1 diff --git a/flow/fpv/arb/br_flow_arb_rr_fpv_monitor.sv b/flow/fpv/arb/br_flow_arb_rr_fpv_monitor.sv index abd0f3724..0a45fa021 100644 --- a/flow/fpv/arb/br_flow_arb_rr_fpv_monitor.sv +++ b/flow/fpv/arb/br_flow_arb_rr_fpv_monitor.sv @@ -7,7 +7,7 @@ `include "br_fv.svh" module br_flow_arb_rr_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 + parameter int NumFlows = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertFinalNotValid = 1 diff --git a/flow/fpv/demux/BUILD.bazel b/flow/fpv/demux/BUILD.bazel index 41e3b34c4..bb03be988 100644 --- a/flow/fpv/demux/BUILD.bazel +++ b/flow/fpv/demux/BUILD.bazel @@ -69,6 +69,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -143,6 +144,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", diff --git a/flow/fpv/demux/br_flow_demux_basic_fpv_monitor.sv b/flow/fpv/demux/br_flow_demux_basic_fpv_monitor.sv index 32603a5d0..f2be5a57e 100644 --- a/flow/fpv/demux/br_flow_demux_basic_fpv_monitor.sv +++ b/flow/fpv/demux/br_flow_demux_basic_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_demux_basic_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/demux/br_flow_demux_select_fpv_monitor.sv b/flow/fpv/demux/br_flow_demux_select_fpv_monitor.sv index 1d5b297fb..1e3409f80 100644 --- a/flow/fpv/demux/br_flow_demux_select_fpv_monitor.sv +++ b/flow/fpv/demux/br_flow_demux_select_fpv_monitor.sv @@ -8,8 +8,8 @@ `include "br_fv.svh" module br_flow_demux_select_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/demux/br_flow_demux_select_unstable_fpv_monitor.sv b/flow/fpv/demux/br_flow_demux_select_unstable_fpv_monitor.sv index 1c24d5008..559ccd81f 100644 --- a/flow/fpv/demux/br_flow_demux_select_unstable_fpv_monitor.sv +++ b/flow/fpv/demux/br_flow_demux_select_unstable_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_demux_select_unstable_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/fork/BUILD.bazel b/flow/fpv/fork/BUILD.bazel index 92d899e43..9c80b2331 100644 --- a/flow/fpv/fork/BUILD.bazel +++ b/flow/fpv/fork/BUILD.bazel @@ -30,6 +30,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -90,6 +91,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", diff --git a/flow/fpv/fork/br_flow_fork_fpv_monitor.sv b/flow/fpv/fork/br_flow_fork_fpv_monitor.sv index 46d41a79a..b54cf4dd9 100644 --- a/flow/fpv/fork/br_flow_fork_fpv_monitor.sv +++ b/flow/fpv/fork/br_flow_fork_fpv_monitor.sv @@ -6,7 +6,7 @@ `include "br_asserts.svh" module br_flow_fork_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 + parameter int NumFlows = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertFinalNotValid = 1 diff --git a/flow/fpv/fork/br_flow_fork_select_multihot_fpv_monitor.sv b/flow/fpv/fork/br_flow_fork_select_multihot_fpv_monitor.sv index c47ad3388..9190fbdf9 100644 --- a/flow/fpv/fork/br_flow_fork_select_multihot_fpv_monitor.sv +++ b/flow/fpv/fork/br_flow_fork_select_multihot_fpv_monitor.sv @@ -6,7 +6,7 @@ `include "br_asserts.svh" module br_flow_fork_select_multihot_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 + parameter int NumFlows = 1, parameter bit EnableCoverSelectMultihot = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, diff --git a/flow/fpv/mux/BUILD.bazel b/flow/fpv/mux/BUILD.bazel index 6a5f03be4..008eba3b0 100644 --- a/flow/fpv/mux/BUILD.bazel +++ b/flow/fpv/mux/BUILD.bazel @@ -58,6 +58,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -123,6 +124,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -188,6 +190,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -262,6 +265,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -336,6 +340,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -399,6 +404,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -468,6 +474,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", @@ -537,6 +544,7 @@ br_verilog_fpv_test_tools_suite( "1", ], "NumFlows": [ + "1", "2", "4", "5", diff --git a/flow/fpv/mux/br_flow_mux_basic_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_basic_fpv_monitor.sv index d9ab8d1a3..27987f4c1 100644 --- a/flow/fpv/mux/br_flow_mux_basic_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_basic_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_mux_basic_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/mux/br_flow_mux_fixed_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_fixed_fpv_monitor.sv index d6d83cfe2..51a387ac8 100644 --- a/flow/fpv/mux/br_flow_mux_fixed_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_fixed_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_mux_fixed_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, @@ -47,15 +47,21 @@ module br_flow_mux_fixed_fpv_monitor #( // ----------FV Modeling Code---------- logic [$clog2(NumFlows)-1:0] i, j; - `BR_FV_2RAND_IDX(i, j, NumFlows) + if (NumFlows > 1) begin : gen_ij + `BR_FV_2RAND_IDX(i, j, NumFlows) + end else begin : gen_i + assign i = '0; + end // ----------Fairness Check---------- // verilog_lint: waive-start line-length - if (EnableCoverPushBackpressure) begin : gen_strict_priority_check - `BR_ASSERT(strict_priority_a, - (i < j) && push_valid[i] && push_valid[j] |-> (pop_data_unstable == push_data[i]) || !push_ready[i]) - end else begin : gen_no_conflict_check - `BR_ASSERT(no_conflict_a, i != j |-> !(push_valid[i] && push_valid[j])) + if (NumFlows > 1) begin : gen_multi_req + if (EnableCoverPushBackpressure) begin : gen_strict_priority_check + `BR_ASSERT(strict_priority_a, + (i < j) && push_valid[i] && push_valid[j] |-> (pop_data_unstable == push_data[i]) || !push_ready[i]) + end else begin : gen_no_conflict_check + `BR_ASSERT(no_conflict_a, i != j |-> !(push_valid[i] && push_valid[j])) + end end // verilog_lint: waive-stop line-length diff --git a/flow/fpv/mux/br_flow_mux_fixed_stable_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_fixed_stable_fpv_monitor.sv index 20281e779..40ce50e71 100644 --- a/flow/fpv/mux/br_flow_mux_fixed_stable_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_fixed_stable_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_mux_fixed_stable_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit RegisterPopReady = 0, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, @@ -49,20 +49,26 @@ module br_flow_mux_fixed_stable_fpv_monitor #( // ----------FV Modeling Code---------- logic [$clog2(NumFlows)-1:0] i, j; - `BR_FV_2RAND_IDX(i, j, NumFlows) + if (NumFlows > 1) begin : gen_ij + `BR_FV_2RAND_IDX(i, j, NumFlows) + end else begin : gen_i + assign i = '0; + end // ----------Fairness Check---------- - if (EnableCoverPushBackpressure) begin : gen_fairness_checks - `BR_ASSERT(strict_priority_a, - (i < j) && push_valid[i] && push_valid[j] |=> (pop_data == $past( - push_data[i] - )) || !$past( - pop_ready - ) || !$past( - push_ready[i] - )) - end else begin : gen_no_conflict_checks - `BR_ASSERT(no_conflict_a, (i != j) |-> !(push_valid[i] && push_valid[j])) + if (NumFlows > 1) begin : gen_multi_req + if (EnableCoverPushBackpressure) begin : gen_fairness_checks + `BR_ASSERT(strict_priority_a, + (i < j) && push_valid[i] && push_valid[j] |=> (pop_data == $past( + push_data[i] + )) || !$past( + pop_ready + ) || !$past( + push_ready[i] + )) + end else begin : gen_no_conflict_checks + `BR_ASSERT(no_conflict_a, (i != j) |-> !(push_valid[i] && push_valid[j])) + end end endmodule : br_flow_mux_fixed_stable_fpv_monitor diff --git a/flow/fpv/mux/br_flow_mux_lru_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_lru_fpv_monitor.sv index 1d84ce969..c396bea88 100644 --- a/flow/fpv/mux/br_flow_mux_lru_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_lru_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_mux_lru_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/mux/br_flow_mux_lru_stable_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_lru_stable_fpv_monitor.sv index e5a1ba6de..22a360901 100644 --- a/flow/fpv/mux/br_flow_mux_lru_stable_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_lru_stable_fpv_monitor.sv @@ -8,8 +8,8 @@ `include "br_fv.svh" module br_flow_mux_lru_stable_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit RegisterPopReady = 0, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, @@ -29,6 +29,8 @@ module br_flow_mux_lru_stable_fpv_monitor #( input logic enable_priority_update ); + localparam int MaxPending = NumFlows == 1 ? 2 : NumFlows; + // ----------Instantiate basic checks---------- br_flow_mux_basic_fpv_monitor #( .NumFlows(NumFlows), @@ -72,7 +74,7 @@ module br_flow_mux_lru_stable_fpv_monitor #( .IN_CHUNKS(1), .OUT_CHUNKS(1), .SINGLE_CLOCK(1), - .MAX_PENDING(NumFlows) + .MAX_PENDING(MaxPending) ) scoreboard ( .clk(clk), .rstN(!rst), diff --git a/flow/fpv/mux/br_flow_mux_rr_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_rr_fpv_monitor.sv index e2eedab0c..3ff02f2e2 100644 --- a/flow/fpv/mux/br_flow_mux_rr_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_rr_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_mux_rr_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/mux/br_flow_mux_rr_stable_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_rr_stable_fpv_monitor.sv index 9323f685f..77c72b22d 100644 --- a/flow/fpv/mux/br_flow_mux_rr_stable_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_rr_stable_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_mux_rr_stable_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit RegisterPopReady = 0, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, @@ -71,7 +71,7 @@ module br_flow_mux_rr_stable_fpv_monitor #( .IN_CHUNKS(1), .OUT_CHUNKS(1), .SINGLE_CLOCK(1), - .MAX_PENDING(NumFlows) + .MAX_PENDING(NumFlows == 1 ? 2 : NumFlows) ) scoreboard ( .clk(clk), .rstN(!rst), diff --git a/flow/fpv/mux/br_flow_mux_select_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_select_fpv_monitor.sv index f53ae7c31..2b37a9de3 100644 --- a/flow/fpv/mux/br_flow_mux_select_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_select_fpv_monitor.sv @@ -8,8 +8,8 @@ `include "br_fv.svh" module br_flow_mux_select_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/mux/br_flow_mux_select_unstable_fpv_monitor.sv b/flow/fpv/mux/br_flow_mux_select_unstable_fpv_monitor.sv index bd0517394..022eaab2a 100644 --- a/flow/fpv/mux/br_flow_mux_select_unstable_fpv_monitor.sv +++ b/flow/fpv/mux/br_flow_mux_select_unstable_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_fv.svh" module br_flow_mux_select_unstable_fpv_monitor #( - parameter int NumFlows = 2, // Must be at least 2 - parameter int Width = 1, // Must be at least 1 + parameter int NumFlows = 1, + parameter int Width = 1, parameter bit EnableCoverPushBackpressure = 1, parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, diff --git a/flow/fpv/xbar/BUILD.bazel b/flow/fpv/xbar/BUILD.bazel index 8947b7b39..df0e3c299 100644 --- a/flow/fpv/xbar/BUILD.bazel +++ b/flow/fpv/xbar/BUILD.bazel @@ -10,6 +10,7 @@ package(default_visibility = ["//visibility:private"]) verilog_library( name = "br_flow_xbar_basic_fpv_monitor", srcs = ["br_flow_xbar_basic_fpv_monitor.sv"], + deps = ["//pkg:br_math_pkg"], ) # Bedrock-RTL Flow-Controlled Crossbar (Fixed Priority Arbitration) @@ -84,11 +85,13 @@ br_verilog_fpv_test_tools_suite( name = "br_flow_xbar_fixed_test_suite", params = { "NumPopFlows": [ + "1", "2", "3", "4", ], "NumPushFlows": [ + "1", "2", "3", "4", @@ -186,11 +189,13 @@ br_verilog_fpv_test_tools_suite( name = "br_flow_xbar_rr_test_suite", params = { "NumPopFlows": [ + "1", "2", "3", "4", ], "NumPushFlows": [ + "1", "2", "3", "4", @@ -288,11 +293,13 @@ br_verilog_fpv_test_tools_suite( name = "br_flow_xbar_lru_test_suite", params = { "NumPopFlows": [ + "1", "2", "3", "4", ], "NumPushFlows": [ + "1", "2", "3", "4", diff --git a/flow/fpv/xbar/br_flow_xbar_basic_fpv_monitor.sv b/flow/fpv/xbar/br_flow_xbar_basic_fpv_monitor.sv index 1a223ad56..f64b038e9 100644 --- a/flow/fpv/xbar/br_flow_xbar_basic_fpv_monitor.sv +++ b/flow/fpv/xbar/br_flow_xbar_basic_fpv_monitor.sv @@ -7,8 +7,8 @@ `include "br_registers.svh" module br_flow_xbar_basic_fpv_monitor #( - parameter int NumPushFlows = 2, - parameter int NumPopFlows = 2, + parameter int NumPushFlows = 1, + parameter int NumPopFlows = 1, parameter int Width = 1, parameter bit RegisterDemuxOutputs = 0, parameter bit RegisterPopOutputs = 0, @@ -16,8 +16,8 @@ module br_flow_xbar_basic_fpv_monitor #( parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, parameter bit EnableAssertPushDestinationStability = EnableAssertPushValidStability, - localparam int PushDestIdWidth = $clog2(NumPushFlows), - localparam int DestIdWidth = $clog2(NumPopFlows) + localparam int PushDestIdWidth = br_math::clamped_clog2(NumPushFlows), + localparam int DestIdWidth = br_math::clamped_clog2(NumPopFlows) ) ( input logic clk, input logic rst, diff --git a/flow/fpv/xbar/br_flow_xbar_fixed_fpv_monitor.sv b/flow/fpv/xbar/br_flow_xbar_fixed_fpv_monitor.sv index e28c56634..cdb3e0973 100644 --- a/flow/fpv/xbar/br_flow_xbar_fixed_fpv_monitor.sv +++ b/flow/fpv/xbar/br_flow_xbar_fixed_fpv_monitor.sv @@ -7,38 +7,17 @@ `include "br_fv.svh" module br_flow_xbar_fixed_fpv_monitor #( - // The number of input flows. Must be >=2. - parameter int NumPushFlows = 2, - // The number of output flows. Must be >=2. - parameter int NumPopFlows = 2, - // The width of the data bus. + parameter int NumPushFlows = 1, + parameter int NumPopFlows = 1, parameter int Width = 1, - // If 1, registers are inserted between the demux and mux to break up the - // timing path, increasing the cut-through latency by 1. Note that this - // results in NumPushFlows x NumPopFlows x Width bits of registers being - // inserted. parameter bit RegisterDemuxOutputs = 0, - // If 1, registers are inserted at the output of the muxes, ensuring that - // pop_valid/pop_data come directly from registers. - // If 0, pop_valid/pop_data come directly from the muxes and may be unstable. parameter bit RegisterPopOutputs = 0, - // If 1, cover that the push_ready signal can be backpressured. - // If 0, assert that push backpressure is not possible. parameter bit EnableCoverPushBackpressure = 1, - // If 1, assert that push_valid is stable. - // Otherwise, cover that push_valid can be unstable. parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, - // If 1, assert that push_data is stable. - // Otherwise, cover that push_data can be unstable. parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, - // If 1, assert that push_dest_id is stable. - // Otherwise, cover that push_dest_id can be unstable. parameter bit EnableAssertPushDestinationStability = EnableAssertPushValidStability, - // If 1, assert that push_valid is 1 and all intermediate - // register stages are empty at end of simulation. parameter bit EnableAssertFinalNotValid = 1, - - localparam int DestIdWidth = $clog2(NumPopFlows) + localparam int DestIdWidth = br_math::clamped_clog2(NumPopFlows) ) ( input logic clk, input logic rst, @@ -57,17 +36,22 @@ module br_flow_xbar_fixed_fpv_monitor #( ); // ----------FV Modeling Code---------- - localparam int PushDestIdWidth = $clog2(NumPushFlows); logic [$clog2(NumPushFlows)-1:0] i, j; logic push_valid_i; logic push_valid_j; // pick a random pair of input/outout flow to check - logic [PushDestIdWidth-1:0] fv_push_id; + logic [DestIdWidth-1:0] fv_push_id; logic [DestIdWidth-1:0] fv_pop_id; `BR_ASSUME(fv_push_id_stable_a, $stable(fv_push_id) && fv_push_id < NumPushFlows) `BR_ASSUME(fv_pop_id_stable_a, $stable(fv_pop_id) && fv_pop_id < NumPopFlows) - `BR_FV_2RAND_IDX(i, j, NumPushFlows) + if (NumPushFlows > 1) begin : gen_ij + `BR_FV_2RAND_IDX(i, j, NumPushFlows) + end else begin : gen_ij0 + assign i = 0; + assign j = 0; + end + assign push_valid_i = push_valid[i] && (push_dest_id[i] == fv_pop_id); assign push_valid_j = push_valid[j] && (push_dest_id[j] == fv_pop_id); @@ -97,16 +81,18 @@ module br_flow_xbar_fixed_fpv_monitor #( ); // ----------FV assertions---------- - if (EnableCoverPushBackpressure) begin : gen_priority_checks - if (RegisterDemuxOutputs) begin : gen_lat - `BR_ASSERT(strict_priority_a, - (i < j) && push_valid_i && push_valid_j |=> !grant[fv_pop_id][j]) - end else begin : gen_lat0 - `BR_ASSERT(strict_priority_a, - (i < j) && push_valid_i && push_valid_j |-> !grant[fv_pop_id][j]) + if (NumPushFlows > 1) begin : gen_multiple_req + if (EnableCoverPushBackpressure) begin : gen_priority_checks + if (RegisterDemuxOutputs) begin : gen_lat + `BR_ASSERT(strict_priority_a, + (i < j) && push_valid_i && push_valid_j |=> !grant[fv_pop_id][j]) + end else begin : gen_lat0 + `BR_ASSERT(strict_priority_a, + (i < j) && push_valid_i && push_valid_j |-> !grant[fv_pop_id][j]) + end + end else begin : gen_check_no_conflict + `BR_ASSERT(no_conflict_a, !(push_valid_i && push_valid_j)) end - end else begin : gen_check_no_conflict - `BR_ASSERT(no_conflict_a, !(push_valid_i && push_valid_j)) end endmodule : br_flow_xbar_fixed_fpv_monitor diff --git a/flow/fpv/xbar/br_flow_xbar_lru_fpv_monitor.sv b/flow/fpv/xbar/br_flow_xbar_lru_fpv_monitor.sv index 8de5258dd..79e031cc3 100644 --- a/flow/fpv/xbar/br_flow_xbar_lru_fpv_monitor.sv +++ b/flow/fpv/xbar/br_flow_xbar_lru_fpv_monitor.sv @@ -7,38 +7,17 @@ `include "br_fv.svh" module br_flow_xbar_lru_fpv_monitor #( - // The number of input flows. Must be >=2. - parameter int NumPushFlows = 2, - // The number of output flows. Must be >=2. - parameter int NumPopFlows = 2, - // The width of the data bus. + parameter int NumPushFlows = 1, + parameter int NumPopFlows = 1, parameter int Width = 1, - // If 1, registers are inserted between the demux and mux to break up the - // timing path, increasing the cut-through latency by 1. Note that this - // results in NumPushFlows x NumPopFlows x Width bits of registers being - // inserted. parameter bit RegisterDemuxOutputs = 0, - // If 1, registers are inserted at the output of the muxes, ensuring that - // pop_valid/pop_data come directly from registers. - // If 0, pop_valid/pop_data come directly from the muxes and may be unstable. parameter bit RegisterPopOutputs = 0, - // If 1, cover that the push_ready signal can be backpressured. - // If 0, assert that push backpressure is not possible. parameter bit EnableCoverPushBackpressure = 1, - // If 1, assert that push_valid is stable. - // Otherwise, cover that push_valid can be unstable. parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, - // If 1, assert that push_data is stable. - // Otherwise, cover that push_data can be unstable. parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, - // If 1, assert that push_dest_id is stable. - // Otherwise, cover that push_dest_id can be unstable. parameter bit EnableAssertPushDestinationStability = EnableAssertPushValidStability, - // If 1, assert that push_valid is 1 and all intermediate - // register stages are empty at end of simulation. parameter bit EnableAssertFinalNotValid = 1, - - localparam int DestIdWidth = $clog2(NumPopFlows) + localparam int DestIdWidth = br_math::clamped_clog2(NumPopFlows) ) ( input logic clk, input logic rst, @@ -59,9 +38,8 @@ module br_flow_xbar_lru_fpv_monitor #( ); // ----------FV Modeling Code---------- - localparam int PushDestIdWidth = $clog2(NumPushFlows); // pick a random pair of input/outout flow to check - logic [PushDestIdWidth-1:0] fv_push_id; + logic [DestIdWidth-1:0] fv_push_id; logic [DestIdWidth-1:0] fv_pop_id; `BR_ASSUME(fv_push_id_stable_a, $stable(fv_push_id) && fv_push_id < NumPushFlows) `BR_ASSUME(fv_pop_id_stable_a, $stable(fv_pop_id) && fv_pop_id < NumPopFlows) diff --git a/flow/fpv/xbar/br_flow_xbar_rr_fpv_monitor.sv b/flow/fpv/xbar/br_flow_xbar_rr_fpv_monitor.sv index 4cf2f6261..98e77a0d0 100644 --- a/flow/fpv/xbar/br_flow_xbar_rr_fpv_monitor.sv +++ b/flow/fpv/xbar/br_flow_xbar_rr_fpv_monitor.sv @@ -7,38 +7,17 @@ `include "br_fv.svh" module br_flow_xbar_rr_fpv_monitor #( - // The number of input flows. Must be >=2. - parameter int NumPushFlows = 2, - // The number of output flows. Must be >=2. - parameter int NumPopFlows = 2, - // The width of the data bus. + parameter int NumPushFlows = 1, + parameter int NumPopFlows = 1, parameter int Width = 1, - // If 1, registers are inserted between the demux and mux to break up the - // timing path, increasing the cut-through latency by 1. Note that this - // results in NumPushFlows x NumPopFlows x Width bits of registers being - // inserted. parameter bit RegisterDemuxOutputs = 0, - // If 1, registers are inserted at the output of the muxes, ensuring that - // pop_valid/pop_data come directly from registers. - // If 0, pop_valid/pop_data come directly from the muxes and may be unstable. parameter bit RegisterPopOutputs = 0, - // If 1, cover that the push_ready signal can be backpressured. - // If 0, assert that push backpressure is not possible. parameter bit EnableCoverPushBackpressure = 1, - // If 1, assert that push_valid is stable. - // Otherwise, cover that push_valid can be unstable. parameter bit EnableAssertPushValidStability = EnableCoverPushBackpressure, - // If 1, assert that push_data is stable. - // Otherwise, cover that push_data can be unstable. parameter bit EnableAssertPushDataStability = EnableAssertPushValidStability, - // If 1, assert that push_dest_id is stable. - // Otherwise, cover that push_dest_id can be unstable. parameter bit EnableAssertPushDestinationStability = EnableAssertPushValidStability, - // If 1, assert that push_valid is 1 and all intermediate - // register stages are empty at end of simulation. parameter bit EnableAssertFinalNotValid = 1, - - localparam int DestIdWidth = $clog2(NumPopFlows) + localparam int DestIdWidth = br_math::clamped_clog2(NumPopFlows) ) ( input logic clk, input logic rst, @@ -59,9 +38,8 @@ module br_flow_xbar_rr_fpv_monitor #( ); // ----------FV Modeling Code---------- - localparam int PushDestIdWidth = $clog2(NumPushFlows); // pick a random pair of input/outout flow to check - logic [PushDestIdWidth-1:0] fv_push_id; + logic [DestIdWidth-1:0] fv_push_id; logic [DestIdWidth-1:0] fv_pop_id; `BR_ASSUME(fv_push_id_stable_a, $stable(fv_push_id) && fv_push_id < NumPushFlows) `BR_ASSUME(fv_pop_id_stable_a, $stable(fv_pop_id) && fv_pop_id < NumPopFlows)