Skip to content

Commit 4d705e5

Browse files
committed
Merge commit 'b1e1ec64f13dda135b3042c56099bb39eed4e660'
2 parents dbfdaad + b1e1ec6 commit 4d705e5

File tree

15 files changed

+1046
-275
lines changed

15 files changed

+1046
-275
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,94 @@
11

2+
import dii_package::dii_flit;
3+
24
module dii_buffer
3-
#(parameter WIDTH=16,
4-
parameter SIZE=4,
5-
parameter FULLPACKET=0)
5+
#(
6+
parameter BUF_SIZE = 4, // length of the buffer
7+
parameter FULLPACKET = 0
8+
)
69
(
7-
input clk,
8-
input rst,
9-
10-
dii_channel.slave in,
11-
dii_channel.master out
12-
);
13-
14-
// Signals for fifo
15-
logic [WIDTH-1:0] fifo_data [0:SIZE-1]; //actual fifo
16-
logic [SIZE-1:0] fifo_first; //actual fifo
17-
logic [SIZE-1:0] fifo_last; //actual fifo
18-
logic [WIDTH-1:0] nxt_fifo_data [0:SIZE-1];
19-
logic [SIZE-1:0] nxt_fifo_first;
20-
logic [SIZE-1:0] nxt_fifo_last;
21-
22-
reg [SIZE:0] fifo_write_ptr;
23-
24-
logic pop;
25-
logic push;
26-
logic full_packet;
27-
28-
logic [SIZE-1:0] valid;
29-
always_comb @(*) begin : valid_comb
30-
integer i;
31-
// Set first element
32-
valid[SIZE-1] = fifo_write_ptr[SIZE];
33-
for (i = SIZE - 2; i >= 0; i = i - 1) begin
34-
valid[i] = fifo_write_ptr[i+1] | valid[i+1];
35-
end
36-
end
10+
input clk, rst,
11+
output logic [$clog2(BUF_SIZE):0] packet_size,
12+
13+
input dii_flit flit_in,
14+
output flit_in_ready,
15+
output dii_flit flit_out,
16+
input flit_out_ready
17+
);
3718

38-
assign full_packet = |(fifo_last & valid);
3919

40-
assign pop = out.valid & out.ready;
41-
assign push = in.valid & in.ready;
20+
localparam ID_W = $clog2(BUF_SIZE); // the width of the index
4221

43-
assign out.data = fifo_data[0][WIDTH-1:0];
44-
assign out.first = fifo_data[0][WIDTH+1];
45-
assign out.last = fifo_data[0][WIDTH];
46-
assign out.valid = !FULLPACKET ? !fifo_write_ptr[0] : full_packet;
22+
// internal shift register
23+
dii_flit [BUF_SIZE-1:0] data;
24+
reg [ID_W:0] rp; // read pointer
25+
logic reg_out_valid; // local output valid
26+
logic flit_in_fire, flit_out_fire;
4727

48-
assign in.ready = !fifo_write_ptr[SIZE];
28+
assign flit_in_ready = (rp != BUF_SIZE - 1) || !reg_out_valid;
29+
assign flit_in_fire = flit_in.valid && flit_in_ready;
30+
assign flit_out_fire = flit_out.valid && flit_out_ready;
4931

50-
always @(posedge clk) begin
51-
if (rst) begin
52-
fifo_write_ptr <= {{SIZE{1'b0}},1'b1};
53-
end else if (push & !pop) begin
54-
fifo_write_ptr <= fifo_write_ptr << 1;
55-
end else if (!push & pop) begin
56-
fifo_write_ptr <= fifo_write_ptr >> 1;
57-
end
58-
end
59-
60-
always @(*) begin : shift_register_comb
61-
integer i;
62-
for (i=0;i<SIZE;i=i+1) begin
63-
if (pop) begin
64-
if (push & fifo_write_ptr[i+1]) begin
65-
nxt_fifo_data[i] = in.data;
66-
nxt_fifo_first[i] = in.first;
67-
nxt_fifo_last[i] = in.last;
68-
end else if (i<SIZE-1) begin
69-
nxt_fifo_data[i] = fifo_data[i+1];
70-
end else begin
71-
nxt_fifo_data[i] = fifo_data[i];
72-
end
73-
end else if (push & fifo_write_ptr[i]) begin
74-
nxt_fifo_data[i] = in.data;
75-
nxt_fifo_first[i] = in.first;
76-
nxt_fifo_last[i] = in.last;
77-
end else begin
78-
nxt_fifo_data[i] = fifo_data[i];
32+
always_ff @(posedge clk)
33+
if(rst)
34+
reg_out_valid <= 0;
35+
else if(flit_in.valid)
36+
reg_out_valid <= 1;
37+
else if(flit_out_ready && rp == 0)
38+
reg_out_valid <= 0;
39+
40+
always_ff @(posedge clk)
41+
if(rst)
42+
rp <= 0;
43+
else if(flit_in_fire && !flit_out_fire && reg_out_valid)
44+
rp <= rp + 1;
45+
else if(flit_out_fire && !flit_in_fire && rp != 0)
46+
rp <= rp - 1;
47+
48+
always @(posedge clk)
49+
if(flit_in_fire)
50+
data <= {data, flit_in};
51+
52+
generate // SRL does not allow parallel read
53+
if(FULLPACKET != 0) begin
54+
logic [BUF_SIZE-1:0] data_last_buf;
55+
56+
always @(posedge clk)
57+
if(rst)
58+
data_last_buf = 0;
59+
else begin
60+
if(flit_out_fire)
61+
data_last_buf[rp] = 1'b0;
62+
if(flit_in_fire)
63+
data_last_buf = {data_last_buf, flit_in.last && flit_in.valid};
64+
end
65+
66+
// extra logic to get the packet size in a stable manner
67+
logic [BUF_SIZE:0] data_last_shifted;
68+
assign data_last_shifted = {1'b0,data_last_buf} << BUF_SIZE - rp;
69+
70+
function logic [ID_W:0] find_first_one(input logic [BUF_SIZE:0] data);
71+
automatic int i;
72+
for(i=BUF_SIZE; i>0; i--)
73+
if(data[i]) return i;
74+
return BUF_SIZE;
75+
endfunction // size_count
76+
77+
assign packet_size = BUF_SIZE + 1 - find_first_one(data_last_shifted);
78+
always_comb begin
79+
flit_out.valid = |data_last_buf;
80+
flit_out.last = data[rp].last;
81+
flit_out.data = data[rp].data;
82+
end
83+
end else begin // if (FULLPACKET)
84+
assign packet_size = 0;
85+
always_comb begin
86+
flit_out.valid = reg_out_valid;
87+
flit_out.last = data[rp].last;
88+
flit_out.data = data[rp].data;
7989
end
8090
end
81-
end
82-
83-
always @(posedge clk) begin : shift_register_seq
84-
integer i;
85-
for (i=0;i<SIZE;i=i+1) begin
86-
fifo_data[i] <= nxt_fifo_data[i];
87-
fifo_first[i] <= nxt_fifo_first[i];
88-
fifo_last[i] <= nxt_fifo_last[i];
89-
end
90-
end
91-
91+
endgenerate
92+
9293
endmodule // dii_buffer
9394

0 commit comments

Comments
 (0)