2021-05-21 09:34:16 +08:00
|
|
|
/******************************************************************************
|
|
|
|
* DO WHAT THE FUCK YOU WANT TO AND DON'T BLAME US PUBLIC LICENSE *
|
|
|
|
* Version 3, April 2008 *
|
|
|
|
* *
|
|
|
|
* Copyright (C) 2019 Luke Wren *
|
|
|
|
* *
|
|
|
|
* Everyone is permitted to copy and distribute verbatim or modified *
|
|
|
|
* copies of this license document and accompanying software, and *
|
|
|
|
* changing either is allowed. *
|
|
|
|
* *
|
|
|
|
* TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION *
|
|
|
|
* *
|
|
|
|
* 0. You just DO WHAT THE FUCK YOU WANT TO. *
|
|
|
|
* 1. We're NOT RESPONSIBLE WHEN IT DOESN'T FUCKING WORK. *
|
|
|
|
* *
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
// Really something like this should be in a utility library (or the language!),
|
2021-05-21 10:46:29 +08:00
|
|
|
// but Hazard3 is supposed to be self-contained
|
2021-05-21 09:34:16 +08:00
|
|
|
|
2021-05-21 10:46:29 +08:00
|
|
|
module hazard3_priority_encode #(
|
2021-05-21 09:34:16 +08:00
|
|
|
parameter W_REQ = 16,
|
|
|
|
parameter W_GNT = $clog2(W_REQ) // do not modify
|
|
|
|
) (
|
|
|
|
input wire [W_REQ-1:0] req,
|
|
|
|
output wire [W_GNT-1:0] gnt
|
|
|
|
);
|
|
|
|
|
|
|
|
// First do a priority-select of the input bitmap.
|
|
|
|
|
|
|
|
reg [W_REQ-1:0] deny;
|
|
|
|
|
|
|
|
always @ (*) begin: smear
|
|
|
|
integer i;
|
|
|
|
deny[0] = 1'b0;
|
|
|
|
for (i = 1; i < W_REQ; i = i + 1)
|
|
|
|
deny[i] = deny[i - 1] || req[i - 1];
|
|
|
|
end
|
|
|
|
|
|
|
|
wire [W_REQ-1:0] gnt_onehot = req & ~deny;
|
|
|
|
|
|
|
|
// As the result is onehot, we can now just OR in the representation of each
|
|
|
|
// encoded integer.
|
|
|
|
|
|
|
|
reg [W_GNT-1:0] gnt_accum;
|
|
|
|
|
|
|
|
always @ (*) begin: encode
|
2021-06-04 03:03:43 +08:00
|
|
|
reg [W_GNT:0] i;
|
2021-05-21 09:34:16 +08:00
|
|
|
gnt_accum = {W_GNT{1'b0}};
|
|
|
|
for (i = 0; i < W_REQ; i = i + 1) begin
|
|
|
|
gnt_accum = gnt_accum | ({W_GNT{gnt_onehot[i]}} & i[W_GNT-1:0]);
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
assign gnt = gnt_accum;
|
|
|
|
|
2021-05-21 10:46:29 +08:00
|
|
|
endmodule
|