synthesis optimizations
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user