synthesis optimizations

This commit is contained in:
Blaise Tine
2021-06-17 16:43:43 -07:00
parent 1e677c8e5e
commit 57143f5889
16 changed files with 173 additions and 229 deletions

View File

@@ -48,7 +48,7 @@ module VX_priority_encoder #(
VX_onehot_encoder #(
.N (N),
.REVERSE (REVERSE)
) b (
) onehot_encoder (
.data_in (onehot),
.data_out (index),
`UNUSED_PIN (valid)

View File

@@ -3,7 +3,8 @@
module VX_rr_arbiter #(
parameter NUM_REQS = 1,
parameter LOCK_ENABLE = 0,
parameter LOG_NUM_REQS = $clog2(NUM_REQS)
parameter LOG_NUM_REQS = $clog2(NUM_REQS),
parameter FAST = 1
) (
input wire clk,
input wire reset,
@@ -23,6 +24,58 @@ module VX_rr_arbiter #(
assign grant_onehot = requests;
assign grant_valid = requests[0];
end else if (FAST == 1) begin
wire [NUM_REQS-1:0] req_masked;
wire [NUM_REQS-1:0] grant, grant_masked, grant_unmasked;
/* verilator lint_off UNOPTFLAT */
wire [NUM_REQS-1:0] mask_higher_pri_reqs;
/* verilator lint_off UNOPTFLAT */
wire [NUM_REQS-1:0] unmask_higher_pri_reqs;
wire no_req_masked;
reg [NUM_REQS-1:0] pointer_reg;
// Simple priority arbitration for masked portion
assign req_masked = requests & pointer_reg;
assign mask_higher_pri_reqs[NUM_REQS-1:1] = mask_higher_pri_reqs[NUM_REQS-2:0] | req_masked[NUM_REQS-2:0];
assign mask_higher_pri_reqs[0] = 1'b0;
assign grant_masked[NUM_REQS-1:0] = req_masked[NUM_REQS-1:0] & ~mask_higher_pri_reqs[NUM_REQS-1:0];
// Simple priority arbitration for unmasked portion
assign unmask_higher_pri_reqs[NUM_REQS-1:1] = unmask_higher_pri_reqs[NUM_REQS-2:0] | requests[NUM_REQS-2:0];
assign unmask_higher_pri_reqs[0] = 1'b0;
assign grant_unmasked[NUM_REQS-1:0] = requests[NUM_REQS-1:0] & ~unmask_higher_pri_reqs[NUM_REQS-1:0];
// Use grant_masked if there is any there, otherwise use grant_unmasked.
assign no_req_masked = ~(| req_masked);
assign grant = ({NUM_REQS{no_req_masked}} & grant_unmasked) | grant_masked;
// Generate arbiter pointer update
wire mask_ptr_sel = (| req_masked) & (!LOCK_ENABLE || enable);
wire unmask_ptr_sel = (| requests) & (!LOCK_ENABLE || enable);
// Pointer update
always @(posedge clk) begin
if (reset) begin
pointer_reg <= {NUM_REQS{1'b1}};
end else if (mask_ptr_sel) begin // select if masked arbiter used
pointer_reg <= mask_higher_pri_reqs;
end else if (unmask_ptr_sel) begin // select if unmasked arbiter used
pointer_reg <= unmask_higher_pri_reqs;
end
end
VX_onehot_encoder #(
.N (NUM_REQS)
) onehot_encoder (
.data_in (grant),
.data_out (grant_index),
`UNUSED_PIN (valid)
);
assign grant_onehot = grant;
assign grant_valid = (| requests);
end else begin
reg [LOG_NUM_REQS-1:0] grant_table [NUM_REQS-1:0];

View File

@@ -83,7 +83,7 @@ module VX_skid_buffer #(
end
if (pop && !use_buffer) begin
data_out_r <= data_in;
end else if (pop) begin
end else if (ready_out) begin
data_out_r <= buffer;
end
end