Skip to content

Commit b3cb54e

Browse files
committed
add Dual A/B decode paths
1 parent 0ff2bfa commit b3cb54e

File tree

3 files changed

+169
-100
lines changed

3 files changed

+169
-100
lines changed

gtksav/olittletoe.sav

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,46 @@
11
[*]
22
[*] GTKWave Analyzer v3.3.34 (w)1999-2012 BSI
3-
[*] Mon Jun 11 17:54:20 2012
3+
[*] Wed Jul 18 15:11:46 2012
44
[*]
55
[dumpfile] "bin/olittletoe.lxt"
66
[savefile] "gtksav/olittletoe.sav"
7-
[timestart] 260000
8-
[size] 1920 1178
7+
[timestart] 0
8+
[size] 1920 1174
99
[pos] -1 -1
10-
*-21.175619 6930000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
10+
*-18.175619 797000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
1111
[treeopen] Tcp_test.
1212
[sst_width] 197
1313
[signals_width] 294
1414
[sst_expanded] 1
1515
[sst_vpaned_height] 356
16-
@28
17-
Tcp_test.tcp.CLOCK[0]
18-
Tcp_test.tcp.newpkt[0]
19-
@22
20-
Tcp_test.tcp.data[7:0]
21-
@25
22-
Tcp_test.tcp.data[7:0]
23-
@24
24-
Tcp_test.tcp.pos[7:0]
2516
@200
2617
-counters
18+
@28
19+
Tcp_test.tcp1.CLOCK[0]
2720
@22
28-
Tcp_test.tcp.counterEthMACNotUs[7:0]
29-
Tcp_test.tcp.counterEthTypeARP[7:0]
30-
Tcp_test.tcp.counterEthTypeErr[7:0]
31-
Tcp_test.tcp.counterEthTypeIPV4[7:0]
32-
Tcp_test.tcp.counterEthTypeIPV6[7:0]
33-
Tcp_test.tcp.counterEthIPTypeTCP[7:0]
21+
Tcp_test.tcp1.data[7:0]
22+
@28
23+
Tcp_test.tcp1.dataValid[0]
24+
Tcp_test.tcp1.newpkt[0]
3425
@200
3526
-flags
3627
@22
37-
Tcp_test.tcp.IPV4_IHeaderLen[3:0]
38-
Tcp_test.tcp.IPV4_Size[15:0]
39-
Tcp_test.tcp.IPV4_PCOL[6:0]
40-
Tcp_test.tcp.tcpDataOff[3:0]
41-
Tcp_test.tcp.tcpData[15:0]
42-
@28
43-
Tcp_test.tcp.tcpFlagACK[0]
44-
Tcp_test.tcp.tcpFlagFIN[0]
45-
Tcp_test.tcp.tcpFlagPSH[0]
46-
Tcp_test.tcp.tcpFlagRST[0]
47-
Tcp_test.tcp.tcpFlagSYN[0]
48-
Tcp_test.tcp.tcp_matches[0]
28+
Tcp_test.tcp1.pos[7:0]
29+
Tcp_test.tcp1.mda[5:0]
30+
Tcp_test.tcp1.mdb[5:0]
31+
Tcp_test.tcp1.mea[5:0]
32+
Tcp_test.tcp1.meb[5:0]
33+
@29
34+
Tcp_test.tcp1.msa[5:0]
35+
@22
36+
Tcp_test.tcp1.msb[5:0]
4937
@200
5038
-output
51-
@22
52-
Tcp_test.tcp.outData[7:0]
5339
@28
54-
Tcp_test.tcp.outDataValid[0]
40+
Tcp_test.tcp1.gappedA[0]
5541
@22
56-
Tcp_test.tcp.tcpSeq[31:0]
57-
Tcp_test.tcp.tcpSeqBuf[31:0]
42+
Tcp_test.tcp1.tcpSeqA[31:0]
5843
@28
59-
Tcp_test.tcp.gapped[0]
44+
Tcp_test.tcp1.tcp_matchA[0]
6045
[pattern_trace] 1
6146
[pattern_trace] 0

littletoe/tcp.v

Lines changed: 83 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,30 @@ module Tcp
2020
input newpkt,
2121
input dataValid,
2222
input [7:0] data,
23-
input [15:0] tcp_src_port,
24-
input [31:0] tcp_src_ip,
25-
input [15:0] tcp_dst_port,
26-
input [31:0] tcp_dst_ip,
2723

28-
output reg outDataValid = 0,
24+
// per session
25+
input [15:0] tcpA_src_port,
26+
input [31:0] tcpA_src_ip,
27+
input [15:0] tcpA_dst_port,
28+
input [31:0] tcpA_dst_ip,
29+
30+
input [15:0] tcpB_src_port,
31+
input [31:0] tcpB_src_ip,
32+
input [15:0] tcpB_dst_port,
33+
input [31:0] tcpB_dst_ip,
34+
2935
output reg [7:0] outData = 0,
36+
output reg outDataPayload = 0,
37+
output reg outDataMatchA = 0,
38+
output reg outDataMatchB = 0,
39+
3040
output reg outnewpkt = 0,
3141
output reg [7:0] mss = 0,
32-
output reg gapped = 0
42+
output reg gappedA = 0,
43+
output reg gappedB = 0,
44+
45+
output tcp_matchA,
46+
output tcp_matchB
3347
);
3448

3549
localparam [6:0] sIDLE = 6'd000;
@@ -160,16 +174,26 @@ module Tcp
160174
reg tcpFlagFIN = 0;
161175
reg [15:0] tcpData = 0;
162176
reg [3:0] tcpDataOff = 0;
163-
reg [31:0] tcpSeq = 0;
164177
reg [31:0] tcpSeqBuf = 0;
165178

179+
reg [31:0] tcpSeqA = 0;
180+
reg [31:0] tcpSeqB = 0;
181+
166182
// we don't need to reset these in sIDLE as they are asigned before tcp_matches is read
167-
reg ms0=0,ms1=0,ms2=0,ms3=0,ms4=0,ms5=0; // match src ip+port
168-
reg md0=0,md1=0,md2=0,md3=0,md4=0,md5=0; // match src ip+port
169-
reg me0=0,me1=0,me2=0,me3=0,me4=0,me5=0; // match src MAC
183+
reg [5:0] msa=0; // match src ip+port
184+
reg [5:0] mda=0; // match src ip+port
185+
//reg [5:0] mea=0; // match src MAC
170186

171-
wire tcp_matches = ms0 && ms1 && ms2 && ms3 && ms4 && ms5 &&
172-
md0 && md1 && md2 && md3 && md4 && md5;
187+
reg [5:0] msb=0; // match src ip+port
188+
reg [5:0] mdb=0; // match src ip+port
189+
//reg [5:0] meb=0; // match src MAC
190+
191+
//reg msb0=0,msb1=0,msb2=0,msb3=0,msb4=0,msb5=0; // match src ip+port
192+
//reg mdb0=0,mdb1=0,mdb2=0,mdb3=0,mdb4=0,mdb5=0; // match src ip+port
193+
//reg meb0=0,meb1=0,meb2=0,meb3=0,meb4=0,meb5=0; // match src MAC
194+
195+
wire tcp_matchA = (& msa) && (& mda);
196+
wire tcp_matchB = (& msb) && (& mdb);
173197

174198
// counters
175199
reg [7:0] counterEthTypeARP = 0;
@@ -293,32 +317,39 @@ module Tcp
293317
sIPV4_IPSRC0: begin
294318
pos <= sIPV4_IPSRC1;
295319
IPV4_IHeaderLen <= IPV4_IHeaderLen - 1; // pipelined sub4 4bytes
296-
ms0 <= (data == tcp_src_ip[31:24]);
320+
msa[0] <= (data == tcpA_src_ip[31:24]);
321+
msb[0] <= (data == tcpB_src_ip[31:24]);
297322
end
298323
sIPV4_IPSRC1: begin
299324
pos <= sIPV4_IPSRC2;
300-
ms1 <= (data == tcp_src_ip[23:16]);
325+
msa[1] <= (data == tcpA_src_ip[23:16]);
326+
msb[1] <= (data == tcpB_src_ip[23:16]);
301327
end
302328
sIPV4_IPSRC2: begin
303329
pos <= sIPV4_IPSRC3;
304-
ms2 <= (data == tcp_src_ip[15:8]);
330+
msa[2] <= (data == tcpA_src_ip[15:8]);
331+
msb[2] <= (data == tcpB_src_ip[15:8]);
305332
end
306333
sIPV4_IPSRC3: begin
307334
pos <= sIPV4_IPDST0;
308-
ms3 <= (data == tcp_src_ip[7:0]);
335+
msa[3] <= (data == tcpA_src_ip[7:0]);
336+
msb[3] <= (data == tcpB_src_ip[7:0]);
309337
end
310338
sIPV4_IPDST0: begin
311339
pos <= sIPV4_IPDST1;
312340
IPV4_IHeaderLen <= IPV4_IHeaderLen - 1; // pipelined sub5 4bytes
313-
md0 <= (data == tcp_dst_ip[31:24]);
341+
mda[0] <= (data == tcpA_dst_ip[31:24]);
342+
mdb[0] <= (data == tcpB_dst_ip[31:24]);
314343
end
315344
sIPV4_IPDST1: begin
316345
pos <= sIPV4_IPDST2;
317-
md1 <= (data == tcp_dst_ip[23:16]);
346+
mda[1] <= (data == tcpA_dst_ip[23:16]);
347+
mdb[1] <= (data == tcpB_dst_ip[23:16]);
318348
end
319349
sIPV4_IPDST2: begin
320350
pos <= sIPV4_IPDST3;
321-
md2 <= (data == tcp_dst_ip[15:8]);
351+
mda[2] <= (data == tcpA_dst_ip[15:8]);
352+
mdb[2] <= (data == tcpB_dst_ip[15:8]);
322353
end
323354
sIPV4_IPDST3: begin
324355
// if options, loop through OPTIONS0-3 to skip 32bit words, else
@@ -334,7 +365,8 @@ module Tcp
334365
default: pos <= sIPV4_TYPE_ERR;
335366
endcase
336367
else pos <= sIPV4_OPTION0;
337-
md3 <= (data == tcp_dst_ip[7:0]);
368+
mda[3] <= (data == tcpA_dst_ip[7:0]);
369+
mdb[3] <= (data == tcpB_dst_ip[7:0]);
338370
end
339371
// IPv4 OPTIONS loop
340372
sIPV4_OPTION0: begin
@@ -387,19 +419,23 @@ module Tcp
387419
sTCP_SRCP0: begin
388420
pos <= sTCP_SRCP1;
389421
counterEthIPTypeTCP <= counterEthIPTypeTCP + 1;
390-
ms4 <= (data == tcp_src_port[15:8]);
422+
msa[4] <= (data == tcpA_src_port[15:8]);
423+
msb[4] <= (data == tcpB_src_port[15:8]);
391424
end
392425
sTCP_SRCP1: begin
393426
pos <= sTCP_DSTP0;
394-
ms5 <= (data == tcp_src_port[7:0]);
427+
msa[5] <= (data == tcpA_src_port[7:0]);
428+
msb[5] <= (data == tcpB_src_port[7:0]);
395429
end
396430
sTCP_DSTP0: begin
397431
pos <= sTCP_DSTP1;
398-
md4 <= (data == tcp_dst_port[15:8]);
432+
mda[4] <= (data == tcpA_dst_port[15:8]);
433+
mdb[4] <= (data == tcpB_dst_port[15:8]);
399434
end
400435
sTCP_DSTP1: begin
401436
pos <= sTCP_SEQ0;
402-
md5 <= (data == tcp_dst_port[7:0]);
437+
mda[5] <= (data == tcpA_dst_port[7:0]);
438+
mdb[5] <= (data == tcpB_dst_port[7:0]);
403439
end
404440
// it's mandatory to buffer the SEQuence number as we don't know whether to latch
405441
// to tcpSeqNum (SYN) or compare for gaploss (!SYN)
@@ -468,45 +504,49 @@ module Tcp
468504
end
469505
endcase
470506

471-
if (pos == sETH_MACD0) me0 <= data == mac[47:40];
472-
if (pos == sETH_MACD1) me1 <= data == mac[39:32];
473-
if (pos == sETH_MACD2) me2 <= data == mac[31:24];
474-
if (pos == sETH_MACD3) me3 <= data == mac[23:16];
475-
if (pos == sETH_MACD4) me4 <= data == mac[15:8];
476-
if (pos == sETH_MACD5) me5 <= data == mac[7:0];
477-
478-
// load TCP data size assuming no IPV4 options, no TCP options, then decrement during any optional states
479-
if (pos == sIPV4_ID0) begin
480-
tcpData <= IPV4_Size - SZ_IP_TCP_NOOPTIONS;
481-
end else if (pos == sIPV4_OPTION0 || pos == sIPV4_OPTION1 || pos == sIPV4_OPTION2 || pos == sIPV4_OPTION3
482-
|| pos == sTCP_OPT0 || pos == sTCP_OPT1 || pos == sTCP_OPT2 || pos == sTCP_OPT3
483-
|| pos == sTCP_DATA ) begin
484-
tcpData <= tcpData - 1;
485-
end
507+
// if (pos == sETH_MACD0) me0 <= data == mac[47:40];
508+
// if (pos == sETH_MACD1) me1 <= data == mac[39:32];
509+
// if (pos == sETH_MACD2) me2 <= data == mac[31:24];
510+
// if (pos == sETH_MACD3) me3 <= data == mac[23:16];
511+
// if (pos == sETH_MACD4) me4 <= data == mac[15:8];
512+
// if (pos == sETH_MACD5) me5 <= data == mac[7:0];
513+
514+
end
486515

516+
// load TCP data size assuming no IPV4 options, no TCP options, then decrement during any (valid) optional states
517+
if (pos == sIPV4_ID0) begin
518+
tcpData <= IPV4_Size - SZ_IP_TCP_NOOPTIONS;
519+
end else if ((pos == sIPV4_OPTION0 || pos == sIPV4_OPTION1 || pos == sIPV4_OPTION2 || pos == sIPV4_OPTION3
520+
|| pos == sTCP_OPT0 || pos == sTCP_OPT1 || pos == sTCP_OPT2 || pos == sTCP_OPT3
521+
|| pos == sTCP_DATA ) && dataValid) begin
522+
tcpData <= tcpData - 1;
487523
end
488524

489525
// don't raise outnewpkt for SYN/ACK (packets with no data payload)
490526
// When tcpDataOff has reduced to 5, we have consumed all the TCP header.
491527
// Independantly, there might not be any tcp payload ("data") in the packet.
492-
outnewpkt <= tcp_matches && dataValid && (
528+
outnewpkt <= dataValid && (
493529
( (pos == sTCP_URG1) && (tcpData != 0) && (tcpDataOff == 5) ) ||
494530
( (pos == sTCP_OPT3) && (tcpData != 0) && (tcpDataOff == 5) )
495531
);
496532

497-
outDataValid <= dataValid && tcp_matches && pos == sTCP_DATA;
533+
outDataMatchA <= dataValid && tcp_matchA && pos == sTCP_DATA;
534+
outDataMatchB <= dataValid && tcp_matchB && pos == sTCP_DATA;
535+
outDataPayload <= dataValid && pos == sTCP_DATA;
498536
outData <= data;
499537

500538
// some elements of the design are idempotent so can be repeated while a state is held
501539
// waiting for dataValid. Bring out to this block.
502540

503541
if (pos == sTCP_WINSZ0) begin
504542
if (tcpFlagSYN) begin
505-
tcpSeq <= tcpSeqBuf;
543+
if (tcp_matchA) tcpSeqA <= tcpSeqBuf;
544+
if (tcp_matchB) tcpSeqB <= tcpSeqBuf;
506545
end else begin
507546
// no SYN... so tcpSeqBuf should match our "calculated" tcpSeq which has been
508547
// incremented by the last data payload
509-
gapped <= (tcpSeqBuf != tcpSeq);
548+
gappedA <= (tcpSeqBuf != tcpSeqA) && tcp_matchA;
549+
gappedB <= (tcpSeqBuf != tcpSeqB) && tcp_matchB;
510550
end
511551
end
512552

0 commit comments

Comments
 (0)