|
| 1 | +// Copyright 2020 ETH Zurich and University of Bologna. |
| 2 | +// Solderpad Hardware License, Version 0.51, see LICENSE for details. |
| 3 | +// SPDX-License-Identifier: SHL-0.51 |
| 4 | + |
| 5 | +// Author: Fabian Schuiki <[email protected]> |
| 6 | +// Author: Paul Scheffler <[email protected]> |
| 7 | + |
| 8 | +`include "common_cells/registers.svh" |
| 9 | +`include "common_cells/assertions.svh" |
| 10 | + |
| 11 | +module credit_counter #( |
| 12 | + parameter int unsigned NumCredits = 0, |
| 13 | + /// Whether credit is full or empty on reset |
| 14 | + parameter bit InitCreditEmpty = 1'b0, |
| 15 | + /// Derived parameters *Do not override* |
| 16 | + parameter int unsigned InitNumCredits = InitCreditEmpty ? '0 : NumCredits, |
| 17 | + parameter type credit_cnt_t = logic [$clog2(NumCredits):0] |
| 18 | +) ( |
| 19 | + input logic clk_i, |
| 20 | + input logic rst_ni, |
| 21 | + |
| 22 | + output credit_cnt_t credit_o, |
| 23 | + |
| 24 | + input logic credit_give_i, |
| 25 | + input logic credit_take_i, |
| 26 | + input logic credit_init_i, // Reinitialize (soft-reset) credit; takes priority |
| 27 | + |
| 28 | + output logic credit_left_o, |
| 29 | + output logic credit_crit_o, // Giving one more credit will fill the credits |
| 30 | + output logic credit_full_o |
| 31 | +); |
| 32 | + |
| 33 | + credit_cnt_t credit_d, credit_q; |
| 34 | + logic increment, decrement; |
| 35 | + |
| 36 | + assign decrement = credit_take_i & ~credit_give_i; |
| 37 | + assign increment = ~credit_take_i & credit_give_i; |
| 38 | + |
| 39 | + always_comb begin |
| 40 | + credit_d = credit_q; |
| 41 | + if (decrement) credit_d = credit_q - 1; |
| 42 | + else if (increment) credit_d = credit_q + 1; |
| 43 | + end |
| 44 | + |
| 45 | + `FFARNC(credit_q, credit_d, credit_init_i, InitNumCredits, clk_i, rst_ni) |
| 46 | + |
| 47 | + assign credit_o = credit_q; |
| 48 | + assign credit_left_o = (credit_q != '0); |
| 49 | + assign credit_crit_o = (credit_q == NumCredits-1); |
| 50 | + assign credit_full_o = (credit_q == NumCredits); |
| 51 | + |
| 52 | + `ASSERT_NEVER(CreditUnderflow, credit_o == '0 && decrement) |
| 53 | + `ASSERT_NEVER(CreditOverflow, credit_o == NumCredits && increment) |
| 54 | + |
| 55 | +endmodule |
0 commit comments