『 how to make fpga router for high-speed networks』

40
1 How to make FPGA router for high-speed networks Keio University SFC Murai lab Takeshi Matsuya [email protected]

Upload: nubia

Post on 27-Jan-2016

126 views

Category:

Documents


2 download

DESCRIPTION

『 How to make FPGA router for high-speed networks』. Keio University SFC Murai lab Takeshi Matsuya [email protected]. Open Router Competition. INTEROP 2012 event at Makuhari Messe 13.June.2012 Theme Improve OpenRouter regardless of software or hardware. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 『 How to make FPGA router for high-speed networks』

1

『 How to make FPGA router for high-speed

networks 』Keio University SFC

Murai labTakeshi Matsuya

[email protected] 

Page 2: 『 How to make FPGA router for high-speed networks』

Open Router Competition

• INTEROP 2012 event at Makuhari Messe

• 13.June.2012

• Theme

• Improve OpenRouter regardless of software or hardware.

• http://www.interop.jp/2012/orc/

2

Page 3: 『 How to make FPGA router for high-speed networks』

WHAT’S FPGA?

3

RAM16MB

Address24bit

Data8bit

FPGA4LUT

Address4bit

Data1bit

Addr

A3(A)

A2(B)

A1(C)

A0(D)

Data

0 0 0 0 0 0

1 0 0 0 1 0

2 0 0 1 0 0

3 0 0 1 1 0

4 0 1 0 0 0

5 0 1 0 1 0

6 0 1 1 0 0

7 0 1 1 1 0

8 1 0 0 0 0

9 1 0 0 1 0

A 1 0 1 0 0

B 1 0 1 1 0

C 1 1 0 0 0

D 1 1 0 1 1

E 1 1 1 0 1

F 1 1 1 1 1

AB

CD

(A == 1 and B == 1) and (C == 1 or D == 1)

AND

AND

OR

Field Programmable Gate Array

16bit memory

Page 4: 『 How to make FPGA router for high-speed networks』

HI-SPEED NETWORK• Throughput• Wire speed• Low latency• Frame/Packet forwarding

4

Switch/Router(Interface speed)

Throughput Latency Note

Infiniband Switch Chip(2G bps)

Wire speed 200 ns(SDR)

http://en.wikipedia.org/wiki/InfiniBand

PCI Express Switch Chip (2.5G bps)

Wire speed 150 ns http://www.plxtech.com/products/expresslane/switches

L3 Switch(1G bps)

Wire speed 6,000 ns(64 Byte Frame)

Gigabit Interface64*8(ns) = 512(ns)

PC Router(1G bps)

≦ Wire speed 24,000 ns(64 Byte Frame)

Gigabit Interface64*8(ns) = 512(ns)

Page 5: 『 How to make FPGA router for high-speed networks』

FPGA Interface for Ethernet

5

SPEED BUS WIDTH@CLOCK

100M Ethernet 4bit @25MHz2bit @50MHz

Giga Ethernet 8bit @125MHz4bit @250MHz

10G Ethernet 64bit @156MHz32bit @312MHz

40G Ethernet 320bit @125MHz128bit @312.5MHz

100G Ethernet 320bit @312.5MHz

User logic6

4b

it

64b

it

PCSPMAPMD

PH

Y

Rece

ive

Tra

nsm

it

10G Ethernet

15

6M

Hz

Page 6: 『 How to make FPGA router for high-speed networks』

Implement Buffered Repeater

6

module repeater (input clock,input rx0_data_valid, // 0: invalid 1:

validinput [7:0] rx0_data, output reg tx1_enable, // 0: disable 1:

enableoutput reg [7:0] tx1_data

always @(posedge clock) beginif ( r0x_data_valid ) begin

tx1_enable <= 1;tx1_data <= rx0_data;

end else begintx1_enable <= 0;

endend

User logic(repeater.v)

rx_d

ata

8bit

tx_d

ata

8bit

PCSPMAPMD

PH

Y

Rece

ive

Tra

nsm

it

GigaPort #0

Clo

ck1

25

MH

z

GigaPort #1

Page 7: 『 How to make FPGA router for high-speed networks』

Routing

• Next hop IP address Lookup• FIB (Forwarding Information Base)

• Changing• Destination MAC address• TTL

• Recalculation• IP Header Checksum

• Filtering• Permit / Deny

• Priority Control• QoS

7

Page 8: 『 How to make FPGA router for high-speed networks』

8

IDEAL ROUTING LATENCYPHYRX

PROCESS

Giga Ethernet 8ns/cycle@125MHzDest

IPIP OPT

0-40 Byte

PMDPMAPCS

IP LO

OK

UP

SUMIP

Dest

MAC

TTLIP

SrcIP

FRAME

PROCESSDest

IPIP OPT

0-40 ByteSUM

IP

Dest

MAC

TTLIP

SrcIP

FRAMEPHYTX

PMDPMAPCS

Calc S

UM

180ns336ns

336 ~ 656ns

336 ~ 384ns

64ns

180+384+180 = 744ns ?

Rece

ive

Tra

nsm

it

Page 9: 『 How to make FPGA router for high-speed networks』

DESIGN

• IP Address Lookup

• Pipeline

• Priority Control

9

Page 10: 『 How to make FPGA router for high-speed networks』

IP ADDR LOOKUP• TCAM

• SRAM• Hash and sequential• Direct addressing

• Cache

10

RAMAddress Data CAMData Address

Page 11: 『 How to make FPGA router for high-speed networks』

CAM(Content Addressable

Memory)

• Examples• MAC address table• ARP table• CPU cache controller, TLB• Database engines

11

0012E258C9820023DFDFFAB60012F27C0AE0001192230842

search data(ex.0012F27C0AE0

)encoder

matchlines

※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf

port 4port 12port 7port 1

0123

CAM (48bit × 4 words) SRAM

deco

der

02

Page 12: 『 How to make FPGA router for high-speed networks』

TCAM(Ternary CAM)

• Examples• Forwarding Information Base• Access Control List• QoS List• Intrusion Prevention System

12

0101???? (1.1.?.?)080808?? (8.8.8.?)851B04??

(133.27.4.?)851B????(133.27.?.?)search data

(ex.133.27.4.130)

Priority

encoder

matchlines

※ http://www.pagiamtz.com/pubs/pagiamtzis-jssc2006.pdf

203.178.5.23203.178.1.5203.178.4.1203.178.9.19

0123

TCAM (32bit × 4 words) SRAM

deco

der

02

Next hop

Page 13: 『 How to make FPGA router for high-speed networks』

Hash and Sequential

13

Page 14: 『 How to make FPGA router for high-speed networks』

Direct addressing

14

RAM4GB

Address32bit

Data8bit

IP v4 Addr[31:0]

http://bgp.potaroo.net/as2.0/bgp-active.html

203.178.5.23203.178.1.5203.178.4.1203.178.9.19

SRAM

deco

der

Next hop

Basic idea

RAM8MB

Address23bit

Data4bit

IP v4 Addr[31:9]

Subnet/32

Subnet/24V4 Addr [8:8]

Page 15: 『 How to make FPGA router for high-speed networks』

C code

15

struct {uint32_t ip;char subnet;char next_hop_id;

} fib[1000000];unsigined char mem_table[64*1024*1024];

int write_fib() {for ( subnet = 2; subnet <= 28; ++subnet )

for ( i = 0; i <= fib_max; ++i )if ( fib[i].subnet == subnet ) {

ip_start = fib[i].ip & ~((1<<(32-subnet))-1);ip_end = fib[i].ip | ((1<<(32-subnet))-1);for (ip=(ip_start>>4); ip<=(ip_end>>4);++ip)

mem_table[ip] = fib[i].next_hop_id;}

}

uint32_t get_nexthop(uint32_t ip) {return ( next_hop[ mem_table[ip>>4].next_hop_id ] );

}

Page 16: 『 How to make FPGA router for high-speed networks』

Verilog code

16

always @(posedge sys_clk) begincase (frame_counter)

12'd00: eth_dest[47:40] <= dout[7:0];12'd01: eth_dest[39:32] <= dout[7:0];12'd02: eth_dest[31:24] <= dout[7:0];12'd03: eth_dest[23:16] <= dout[7:0];12'd12: eth_type[15:8] <= dout[7:0];12'd13: eth_type[7:0] <= dout[7:0];12'd30: ipv4_dest_ip[31:24] <= dout[7:0];12'd31: ipv4_dest_ip[23:16] <= dout[7:0];12'd32: ipv4_dest_ip[15: 8] <= dout[7:0];12'd33: begin

ipv4_dest_ip[ 7: 0] <= dout[7:0];if (forward_router == 1'b1 && bridge_mode == 1'b0)

beginip4lookup_req <= 1'b1;search_ip4 <= {ipv4_dest_ip[31:8], dout[7:0]};

endend

endend

Page 17: 『 How to make FPGA router for high-speed networks』

PIPELINE (1/2)

17

00 00 01 02 03 04 05 06 07 08

01 00 01 02 03 04 05 06 07

02 00 01 02 03 04 05 06

05 00 01 02 03

06 00 01 02

07 00 01

08 00

Stage

03 00 01 02 03 04 05

04 00 01 02 03 04

Page 18: 『 How to make FPGA router for high-speed networks』

PIPELINE (2/2)

18

00Read 29 30 31 32 33 34 35 36 37

01 28 29 30 31 32 33 34 35 36

02 27 28 29 30 31 32 33 34 35

35 00 00 00 00 00 00 00 01 02

36 00 00 00 00 00 00 00 00 01

37Write 00 00 00 00 00 00 00 00 00

Stage

03 26 27 28 29 30 31 32 33 34

04 25 26 27 28 29 30 31 32 33

Receive Destination IP addressRequest IP addr lookupReply IP addr lookupTransmit packet

Page 19: 『 How to make FPGA router for high-speed networks』

Verilog code

19

always @(posedge sys_clk) begindout01<={rd_valid,rx_fifo};dout02<=dout01;dout03<=dout02;dout04<=dout03;dout05<=dout04;dout06<=dout05;

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

dout39<=dout38;dout40<=dout39;dout41<=dout40;dout42<=dout41;if (rd_vald == 1’b1) begin

counter00 <= counter00 + 16’d1;case (counter00)

16'd00: ethr_dest[47:40] <= rx_fifo[7:0];16'd01: ethr_dest[39:32] <= rx_fifo[7:0];

endcaseelse

counter00 <= 16’d0;endif (dout42[8] == 1’b1) begin

counter42 <= counter42 + 16’d1;case (counter42)

16'd00: begintx_fifo <= {1'b1,etht_dest[47:40]};forward_port <= 16’b0000000000001000;

end16'd01: tx_fifo<= {1'b1,etht_dest[39:32]};16'd02: tx_fifo<= {1'b1,etht_dest[31:24]};

endcaseelse

counter42 <= 16’d0;end

end

Page 20: 『 How to make FPGA router for high-speed networks』

20

PRIORITY CONTROL1

FORW

ARD

IP DST

.....

IP SUM

IP TOS (0)

MAC Dest

.....

IP DST

.....

IP SUM

IP TOS (7)

MAC Dest

.....

Port#1(RX) Port#2(RX)

Port#3(TX)

FORW

ARD

FIFO

FIFO

FIFO

Page 21: 『 How to make FPGA router for high-speed networks』

21

PRIORITY CONTROL2

FORW

ARD

IP DST

.....

IP SUM

IP TOS (0)

IP DST

.....

IP SUM

IP TOS (7)

MAC Dest

.....

MAC Dest

.....

Port#1(RX) Port#2(RX)

Port#3(TX)

FORW

ARD

FIFO

FIFO

FIFO

Page 22: 『 How to make FPGA router for high-speed networks』

PIPELINE (2/2)

22

00Read 29 30 31 32 33 34 35 36 37

01 28 29 30 31 32 33 34 35 36

02 27 28 29 30 31 32 33 34 35

35 00 00 00 00 00 00 00 01 02

36 00 00 00 00 00 00 00 00 01

37Write 00 00 00 00 00 00 00 00 00

Stage

03 26 27 28 29 30 31 32 33 34

04 25 26 27 28 29 30 31 32 33

Adding frame TOS

Page 23: 『 How to make FPGA router for high-speed networks』

23

PRIORITY CONTROL3

FORW

ARD

IP DST

.....

IP SUM

FRAME TOS (0)

MAC Dest

.....

IP DST

.....

IP SUM

Port#1(RX) Port#2(RX)

Port#3(TX)

FORW

ARD

FRAME TOS (7)

MAC Dest

.....FIFO

FIFO

FIFO

Page 24: 『 How to make FPGA router for high-speed networks』

24

PRIORITY CONTROL4

FORW

ARD

IP DST

.....

IP SUM

FRAME TOS (0)

MAC Dest

.....

IP DST

.....

IP SUM

MAC Dest

.....

Port#1(RX) Port#2(RX)

Port#3(TX)

FORW

ARD

FIFO

FIFO

FIFO

Page 25: 『 How to make FPGA router for high-speed networks』

IMPLEMENT OF FIBNIC

25

Page 26: 『 How to make FPGA router for high-speed networks』

26

背景と目標• 高機能で入手が手軽な PC ルータ、しかし専用機に劣る転送能力

• pps(packet per second) 問題• 1パケットあたりにかけられる処理時間の問題

• バスとメモリの帯域問題• 高速 Ethernet に対する PCI Express 、メモリ帯域の問題

• ネットワークは発展途上• L 1のインターフェイス仕様は固定しているのに対し L 2/ L 3技術は変化が早い

• PC ルータの高機能と専用機の高性能のハイブリッド(いいとこどり)• PC NIC に L2/L3 スイッチの専用 ASIC に代わり自分で再構成可能な汎用 FPGAを採用

• オープンなハードウェア技術によって、個人でもアイディアがあれば専用機並(以上?)の性能をひきだすことが証明できたらいいなあ。。。

Page 27: 『 How to make FPGA router for high-speed networks』

27

pps 問題速度

Frame Size 64 Frame 1518

packet per second

time/packet

CPU clock/pkt※ @4GHz

pps

100M 148,809 pps 6,905 ns 27,600 clock 8,127 pps

Giga 1,488,095 pps 690 ns 2,760 clock 81,274 pps

10G 14,880,950 pps 69 ns 276 clock 812,743 pps

40G 59,523,800 pps 17 ns 68 clock3,250,972

pps

100G148,809,500

pps7 ns 28 clock

8,127,433 pps

※ 1 ポート、片方向通信の場合CPU コア数を増やしたり GPU 併用で処理の負担を軽減することができる

Page 28: 『 How to make FPGA router for high-speed networks』

28

バスとメモリの帯域問題DDR3-1600 12.8GB/s※1

PCI-Express G2×8 4GB/s

10G Ethernet 1.25GB/s

40G Ethernet 5GB/s

100G Ethernet 12.5GB/s

送信受信

0 10 20

※片方向通信

Page 29: 『 How to make FPGA router for high-speed networks』

29

概要図テスタ ルータ

Page 30: 『 How to make FPGA router for high-speed networks』

30

デモデモ 1 http://web.sfc.wide.ad.jp/~macchan/fibnic_demo1.mov

デモ 2(40.5 万ルート ) http://web.sfc.wide.ad.jp/~macchan/fibnic_demo2.mov

Page 31: 『 How to make FPGA router for high-speed networks』

31

IPv4 性能評価 ( 参考値 )64 バイトフレー

ム1518 バイトフレー

ム 条件

遅延(ns)

フレーム間GAP/pps

※ 1

遅延(ns)

フレーム間GAP/pps

ポート数IPv4 Route

NIC+PC ルータi5 2.8GHz (Linux

3.3.7)

24,144

270 byte365,497 pps

101,152

580 byte59,355

pps

Giga×2 ポート2 Route

FIBNIC+PC ルータCeleron2.53G(Lin

ux 3.3.7)976

12 byte1,488,095

pps976

12 byte81,274

pps

Giga×4 ポート405,452

Route

某社 L3 スイッチ 6,600

13 byte1,470,588

pps20,608

13 byte81,222

pps

Giga×4 ポート4 Route

※1 パケットをロストしない時のフレーム間ギャップ最小値( Ethernet の規格上は 12 が最小 )

※2 理論値と同じ

31

Page 32: 『 How to make FPGA router for high-speed networks』

32

IPv6 性能評価 ( 参考値 )80 バイトフレー

ム1518 バイトフレー

ム 条件

遅延(ns)

フレーム間GAP/pps

※ 1

遅延(ns)

フレーム間GAP/pps

ポート数

FIBNIC+PC ルータ

Celeron2.53G(Linux 3.3.7)

1,06412 byte

1,250,000 pps

1,06412 byte81,274

pps

Giga×4 ポート

某社 L3 スイッチ 6,552

13 byte1,237,624

pps20,480

13 byte81,222

pps

Giga×4 ポート

※1 パケットをロストしない時のフレーム間ギャップ最小値( Ethernet の規格上は 12 が最小 )

※2 理論値と同じ

32

Page 33: 『 How to make FPGA router for high-speed networks』

33

FIBNIC 遅延内訳

• FIBNIC 回路

• IP Lookup 、 Fowarding 、 Filtering 、Priority 処理

• DestIP までの 8+34 バイトフレーム

• IP ルーティングに必要な DestIP を受信するまでのフレーム内サイズ( 8 はプリアンプル部+StartFrameDelimiter )

• RGMII/GMII 変換回路

• 4bit@250MHz 、 8bit@125MHz 変換

• PHY チップ

• ケーブルの信号を ASIC や FPGA で接続可能なディジタル信号に変換

PHY チップ

RGMII/GMII 変換

DestIP までの8+34 バイト

フー

FIBNIC

320ns

40ns

336ns

280ns

IPv4 976ns IPv4(IPv6 1,064ns)

5cycle

42cycle

35cycle

40cycle

@125MHz

Page 34: 『 How to make FPGA router for high-speed networks』

34

まとめ• 市販の Gigabit Ether FPGA ボード上で H/W IPv4/IPv6 ルーティングが可能な PC 用

NIC を実装

• ワイヤーレートでのパケットルーティング

• 1,488,095 経路探索 /秒 ( IPv4 40 万経路時、回路単体では 125M 経路探索 /秒)

• ハードウェアの高速性とソフトウェアの高機能性の融合

• 簡単なパケットはハードウェア、複雑なプロトコルは NIC にて処理

• 10/40G 以上の高速 Ethernet を考慮した回路設計

• インターフェイスの入口から出口まで同じクロック、バス幅、ウェイト無し設計

• ハードウェア記述言語による回路の再構成

• フィルタリング、フォワーディング条件等。回路の再構成時間は数秒

• ワイヤーレートでの NAT 、トンネリング、4と6共存技術など色々できそう!?!

34

Page 35: 『 How to make FPGA router for high-speed networks』

35

オープンソースネットワークテスタ

•Magukara•FPGA ベースのオープンソースハードウェア

•Lattice ECP3 Versa Development Kit ($299ドル !!)

•1000Base-T, IPv4/v6 サポート

•URL: https://github.com/Murailab-arch/magukara

Page 36: 『 How to make FPGA router for high-speed networks』

Workshop 紹介

36

Page 37: 『 How to make FPGA router for high-speed networks』

37

ここから予備スライド

Page 38: 『 How to make FPGA router for high-speed networks』

PHY#0RX

PHY#0RX

※1 RX0GMII2FIFOGMII2FIFO9

※1 RX0GMII2FIFOGMII2FIFO9

InstanceModuleInstanceModule

FIFO/Memory

FIFO/Memory

PortPort※6 NIC0NIC

※6 NIC0NIC

※5 LOOKUPFIB※5 LOOKUPFIB

※2 RX0ROUTERROUTER

※2 RX0ROUTERROUTER

RX0_PHYQASFIFO9

RX0_PHYQASFIFO9

※3 TX0MIXERMIXER

※3 TX0MIXERMIXER

TX0_MIXQSFIFO9

TX0_MIXQSFIFO9

TX0_PHYQASFIFO9

TX0_PHYQASFIFO9

※4 TX0FIFO9TOGMIIFIFO9TOGMII

※4 TX0FIFO9TOGMIIFIFO9TOGMII

PHY#0TX

PHY#0TX

RX0-NC0SFIFO9

RX0-NC0SFIFO9

ARP/NDPARPNDPARP/NDPARPNDP

※7 PCI/PCIe CONTROLLER※7 PCI/PCIe

CONTROLLER

PHY#1TX

PHY#1TX

PHY#2TX

PHY#2TX

PHY#3TX

PHY#3TX

BUS

Rece

ive

Tra

nsm

ission

PHY#1RX

PHY#1RX

PHY#2RX

PHY#2RX

PHY#3RX

PHY#3RX

※3 TX1MIXERMIXER

※3 TX1MIXERMIXER

※3 TX2MIXERMIXER

※3 TX2MIXERMIXER

※3 TX3MIXERMIXER

※3 TX3MIXERMIXER

FIB6FIB6FIBFIB

※4 TX1FIFO9TOGMIIFIFO9TOGMII

※4 TX1FIFO9TOGMIIFIFO9TOGMII

※4 TX2FIFO9TOGMIIFIFO9TOGMII

※4 TX2FIFO9TOGMIIFIFO9TOGMII

※4 TX3FIFO9TOGMIIFIFO9TOGMII

※4 TX3FIFO9TOGMIIFIFO9TOGMII

※1 PHY とシステムクロック変換および PREAMBLE,SFD 等除去※2 フォワード先決定、フォワード時の Dest MAC 置換 &TTL の減算 &IP SUM 再計算、

ドロップ付きフォワード処理、 CRC 除去※3 ToS による優先度ミックスキューイング、ドロップ

※4 システムと PHY クロッック変換および PREAMBLE,SFD,CRC の付与※5 FIB もしくは ARP を調べ、 Dest MAC と転送先 PORT を決定する

※6 NIC としての基本動作※7 PCI としての基本動作

※1 PHY とシステムクロック変換および PREAMBLE,SFD 等除去※2 フォワード先決定、フォワード時の Dest MAC 置換 &TTL の減算 &IP SUM 再計算、

ドロップ付きフォワード処理、 CRC 除去※3 ToS による優先度ミックスキューイング、ドロップ

※4 システムと PHY クロッック変換および PREAMBLE,SFD,CRC の付与※5 FIB もしくは ARP を調べ、 Dest MAC と転送先 PORT を決定する

※6 NIC としての基本動作※7 PCI としての基本動作

RX-BUFDualPort RAM

RX-BUFDualPort RAM

TX-BUFDualPort RAM

TX-BUFDualPort RAM

RX0-TX0SFIFO

RX0-TX0SFIFO

RX1-TX0SFIFO

RX1-TX0SFIFO

RX2-TX0SFIFO

RX2-TX0SFIFO

RX3-TX0SFIFO

RX3-TX0SFIFO

NC0-TX0SFIFO

NC0-TX0SFIFO

RX0-TX1SFIFO

RX0-TX1SFIFO

RX1-TX1SFIFO

RX1-TX1SFIFO

RX2-TX1SFIFO

RX2-TX1SFIFO

RX3-TX1SFIFO

RX3-TX1SFIFO

NC1-TX1SFIFO

NC1-TX1SFIFO

RX0-TX2SFIFO

RX0-TX2SFIFO

RX1-TX2SFIFO

RX1-TX2SFIFO

RX2-TX2SFIFO

RX2-TX2SFIFO

RX3-TX2SFIFO

RX3-TX2SFIFO

NC2-TX2SFIFO

NC2-TX2SFIFO

RX0-TX3SFIFO

RX0-TX3SFIFO

RX1-TX3SFIFO

RX1-TX3SFIFO

RX2-TX3SFIFO

RX2-TX3SFIFO

RX3-TX3SFIFO

RX3-TX3SFIFO

NC3-TX3SFIFO

NC3-TX3SFIFO

RX0-ARP0SFIFO9

RX0-ARP0SFIFO9

Page 39: 『 How to make FPGA router for high-speed networks』

39

FPGA の再コンフィグレーション

• フィルタの条件は HDL 言語で FPGA の回路として記述可能。 Reconfiguration 時間は数秒。• IP 宛先が 192.2.3/24 でかつポートが 22 の場合パケットをド

ロップする記述if (ipv4_dest_ip[31:8]==24‘hc00203 && (ipv4_dest_port==16‘d22))

foward_port = 4‘b0000; // どのポートへも転送しない• iSCSI 宛のパケットは4番ポートへ転送する記述

if (ipv4_dest_port==16‘d3260)

foward_port = 4‘b1000; // 第4ポートへ転送する39

Page 40: 『 How to make FPGA router for high-speed networks』

40

NIC へ転送する条件HDL 記述(例)

• wire frame_type_ipv4 = (eth_type == 16'h0800);

• wire frame_type_ipv6 = (eth_type == 16'h86dd);

• wire forward_nic = (frame_type_ipv4 && (ipv4_dest_ip == interface_ipv4_addr || ipv4_dest_ip == 32'h0)) || eth_dest_addr[40] == 1'b || .............;