Skip to content

Commit e4c97ca

Browse files
committed
Allow single push to either port 1 or 2
1 parent 1137d8f commit e4c97ca

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

pifo-design/src/flow_scheduler.sv

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,23 +103,26 @@ module FlowScheduler #(parameter SIZE = 10, parameter FLOWS = 10) (
103103
for ( int i = 0; i < SIZE; i++ ) valids[i] <= 0;
104104
end
105105
else begin
106-
// swap if push_2's rank < push_1's rank
106+
// swap if
107+
// 1) both pushes are valid and push_2's rank < push_1's rank
108+
// 2) push_2 is valid but push_1 isn't
107109
for ( int i = 0; i < 2; i++ ) begin
108-
if ( push_valid_C[1] && push_rank_C[1] < push_rank_C[0] ) begin
110+
if ( push_valid_C[1] && ((push_rank_C[1] < push_rank_C[0]) || !push_valid_C[0]) ) begin
109111
insert_idx_S[i] <= insert_idx_C[1 - i];
110112
push_value_S[i] <= push_value_C[1 - i];
111113
push_rank_S[i] <= push_rank_C[1 - i];
112114
push_flow_S[i] <= push_flow_C[1 - i];
115+
push_valid_S[i] <= push_valid_C[1 - i];
113116
end
114117
else begin
115118
insert_idx_S[i] <= insert_idx_C[i];
116119
push_value_S[i] <= push_value_C[i];
117120
push_rank_S[i] <= push_rank_C[i];
118121
push_flow_S[i] <= push_flow_C[i];
122+
push_valid_S[i] <= push_valid_C[i];
119123
end
120124
end
121125

122-
push_valid_S <= push_valid_C;
123126
pop_valid_S <= pop_valid_C;
124127

125128
if ( push_valid_C[0] && push_valid_C[1] )

pifo-design/tb/tb_flow_scheduler.cpp

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,13 @@
1111
#define SIZE 10
1212
#define WAVEFORM "flow_scheduler.vcd"
1313

14-
enum class Op { Push, Pop, PushPush, Nop };
14+
enum class Op {
15+
Push1, // single push through push port 1
16+
Push2, // single push through push port 2
17+
Pop,
18+
PushPush, // dual push through both ports
19+
Nop
20+
};
1521

1622
struct FlowValue {
1723
unsigned int flow;
@@ -48,21 +54,25 @@ std::vector<Cmd> generate_commands(int num_cmds) {
4854

4955
for (int i = 0; i < num_cmds; i++) {
5056
Cmd cmd;
51-
if (!size || size == SIZE) // to avoid over/underflow
52-
cmd.op = !size ? Op::Push : Op::Pop;
57+
if (size == SIZE) // to avoid overflow
58+
cmd.op = Op::Pop;
59+
else if (!size) // to avoid underflow
60+
cmd.op = rand() % 2 ? Op::Push1 : Op::Push2;
5361
else {
54-
int rng = rand() % 4;
55-
switch (rng) {
62+
switch (rand() % 5) {
5663
case 0:
57-
cmd.op = Op::Push;
64+
cmd.op = Op::Push1;
5865
break;
5966
case 1:
60-
cmd.op = Op::Pop;
67+
cmd.op = Op::Push2;
6168
break;
6269
case 2:
63-
cmd.op = size == SIZE - 1 ? Op::Push : Op::PushPush;
70+
cmd.op = Op::Pop;
6471
break;
6572
case 3:
73+
cmd.op = size == SIZE - 1 ? Op::Push1 : Op::PushPush;
74+
break;
75+
case 4:
6676
cmd.op = Op::Nop;
6777
break;
6878
}
@@ -79,7 +89,8 @@ std::vector<Cmd> generate_commands(int num_cmds) {
7989

8090
int delta;
8191
switch (cmd.op) {
82-
case Op::Push: delta = 1; break;
92+
case Op::Push1:
93+
case Op::Push2: delta = 1; break;
8394
case Op::Pop: delta = -1; break;
8495
case Op::PushPush: delta = 2; break;
8596
case Op::Nop: delta = 0; break;
@@ -103,10 +114,14 @@ std::vector<FlowValue> compute_expected(std::vector<Cmd> cmds) {
103114

104115
for (Cmd cmd : cmds) {
105116
switch (cmd.op) {
106-
case Op::Push:
117+
case Op::Push1:
107118
pifo.push(cmd.data_1);
108119
break;
109120

121+
case Op::Push2:
122+
pifo.push(cmd.data_2);
123+
break;
124+
110125
case Op::Pop:
111126
out.push_back(pifo.top().flow_value);
112127
pifo.pop();
@@ -167,8 +182,8 @@ std::vector<FlowValue> simulate(std::vector<Cmd> cmds, const char* waveform) {
167182
else {
168183
Cmd cmd = *it;
169184

170-
dut->push_1 = cmd.op == Op::Push || cmd.op == Op::PushPush;
171-
dut->push_2 = cmd.op == Op::PushPush;
185+
dut->push_1 = cmd.op == Op::Push1 || cmd.op == Op::PushPush;
186+
dut->push_2 = cmd.op == Op::Push2 || cmd.op == Op::PushPush;
172187
dut->pop = cmd.op == Op::Pop;
173188

174189
dut->push_rank_1 = cmd.data_1.rank;
@@ -224,8 +239,12 @@ int main(int argc, char** argv, char** env) {
224239
r_2 = c.data_2.rank,
225240
f_2 = c.data_2.flow_value.flow;
226241
switch (c.op) {
227-
case Op::Push:
228-
printf("push(v=%u, f=%u, r=%u)\n", v_1, f_1, r_1);
242+
case Op::Push1:
243+
printf("push(v=%u, f=%u, r=%u) (port 1)\n", v_1, f_1, r_1);
244+
break;
245+
246+
case Op::Push2:
247+
printf("push(v=%u, f=%u, r=%u) (port 2)\n", v_2, f_2, r_2);
229248
break;
230249

231250
case Op::Pop:

pifo-design/tb/tb_rank_store.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ std::vector<Cmd> generate_commands(int num_cmds) {
5353
cmd.op = Op::Push;
5454
}
5555
else {
56-
int rng = rand() % 4;
57-
switch (rng) {
56+
switch (rand() % 4) {
5857
case 0: cmd.op = Op::Push; break;
5958
case 1: cmd.op = Op::Pop; break;
6059
case 2:

0 commit comments

Comments
 (0)