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