Contenu connexe Similaire à FPGA workshop (2012f): Network Tester (20) FPGA workshop (2012f): Network Tester3. Main topic
FPGA programming for beginners
Dev kit and tools
Tutorial 1: "LED"
Simulation tool and testbench
Tutorial 2: "Simulation"
IP core
Building on the command-line
FPGA design for Ethernet
overview, MII, RMII, timing chart, MDIO, RFC2544
Tutorial 3: "Delay measurement tool for network device"
Play with the measurement device
Next step
{Layer2, Layer3, IPv6, throughput, frame loss rate} support
4. Extra materials
a. PCI and PCI Express
overview, Bus (wishbone), sample code, debug, DMA and SR-IOV
Tutorial 5: "How to use PCI Express IP"
b. HTML5 for embedded system
Blob/Arraybuffer, websocket, node.js, HTML canvas
c. FPGA hot topics
FPGA development kit, Handmade 10G/40G/100G device, memory,
CAM/TCAM,HLS for FPGA, Embedded CPU
Reference list
5. Schedule
9/4
Main topic
9/5
Extra a:
Main topic PCI Express
8. 本ワークショップの進め方
Lattice社のFPGA開発キットを使ってFPGA開発を
一通り体験します 新規プロジェクト作成
HDLプログラミング
開発環境: Lattice Diamond
Lattice社のFPGA開発の統合環境
Editing, pin assign, syntax check, ピンアサイン
IP catalog, logic synthesis (論理合成), FPGA
configuration, etc.
コンパイル
RTLシミュレーション: ActiveHDL
Lattice Diamondに付属
Windowsのみ コンフィグレーション
今回のFPGAの開発手順
9. LatticeECP3 Versa Development Kit
FPGA開発キッド
Lattice LatticeECP3
1000BASE-T (2 port)
PCI Express x1 I/F
DDR SDRAM
SERDES I/F
開発ツール
Lattice Diamond 2.0
論理合成: Synplify
シミュレータ: Active-HDL
http://www.latticesemi.co.
価格: $99 → $299 jp/corporate/newscenter/newsletters/newsmay2011/ecp3
versadevelopmentkit.cfm
ユーザガイド (手元にダウンロードしてください)
PHY chip
http://www.latticesemi.com/documents/EB62.pdf
(Marvell
88E1119R)
10. How to install Lattice Diamond for Linux
# CentOS 6.3 (x86_64)
# Install dependent packages using yum
$ sudo rpm -ivh diamond_2_0-base-154-i386-linux.rpm
$ sudo /usr/local/diamond/2.0/ispfpga/bin/lin/lmutil lmhostid
# Get License file from Lattice web
$ sudo mv ~/Download/license.dat /usr/local/diamond/2.0/license/
$ cd /usr/local/diamond/2.0/bin/lin
$ cp -pi libftlils d2xx.so.1.0.4 libftd2xx.so.0
# Plug in the configure cable (USB)
$ lsusb
Bus 001 Device 002: ID 0403:6010 Future Technology Devices
International, Ltd FT2232C Dual USB-UART/FIFO IC
$ sudo /sbin/rmmod ftdi_sio
$ sudo /sbin/rmmod usbserial
$ export bindir="/usr/local/diamond/2.0/bin/lin"
$ source /usr/local/diamond/2.0/bin/lin/diamond_env
$ diamond
11. Tutorial 1: LED
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-1
基本的なFPGA開発の流れを学ぶ
LEDを点灯
DIPスイッチとLEDの連携
counter回路
18. Tutorial 1.1: LED
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-1
led_top.v led.lpf
module top ( BLOCK RESETPATHS ;
output [7:0] led BLOCK ASYNCPATHS ;
); IOBUF PORT "led_0" SITE=Y20 IO_TYPE=LVCMOS33 ;
assign led = 8'b10101010; IOBUF PORT "led_1" SITE=AA21 IO_TYPE=LVCMOS33 ;
endmodule IOBUF PORT "led_2" SITE=U18 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_3" SITE=U19 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_4" SITE=W19 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_5" SITE=V19 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_6" SITE=AB20 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_7" SITE=AA20 IO_TYPE=LVCMOS33 ;
22. Tutorial 1.2: LED+DIP switch
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-1
switch_top.v switch.lpf
module top ( BLOCK RESETPATHS ;
input [7:0] switch BLOCK ASYNCPATHS ;
, output [7:0] led IOBUF PORT "led_0" SITE=Y20 IO_TYPE=LVCMOS33 ;
); IOBUF PORT "led_1" SITE=AA21 IO_TYPE=LVCMOS33 ;
assign led = switch; IOBUF PORT "led_2" SITE=U18 IO_TYPE=LVCMOS33 ;
endmodule IOBUF PORT "led_3" SITE=U19 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_4" SITE=W19 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_5" SITE=V19 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_6" SITE=AB20 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_7" SITE=AA20 IO_TYPE=LVCMOS33 ;
LOCATE COMP "switch_0" SITE "J7" ;
LOCATE COMP "switch_1" SITE "J6" ;
LOCATE COMP "switch_2" SITE "H2" ;
LOCATE COMP "switch_3" SITE "H3" ;
LOCATE COMP "switch_4" SITE "J3" ;
LOCATE COMP "switch_5" SITE "K3" ;
LOCATE COMP "switch_6" SITE "J2" ;
LOCATE COMP "switch_7" SITE "J1" ;
23. Tutorial 1.3: LED+counter
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-1
counter_top.v counter.lpf
module top ( BLOCK RESETPATHS ;
input clock BLOCK ASYNCPATHS ;
, input reset_n IOBUF PORT "led_0" SITE=Y20 IO_TYPE=LVCMOS33 ;
, output [7:0] led IOBUF PORT "led_1" SITE=AA21 IO_TYPE=LVCMOS33 ;
); IOBUF PORT "led_2" SITE=U18 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_3" SITE=U19 IO_TYPE=LVCMOS33 ;
reg[31:0] counter = 32'd0; IOBUF PORT "led_4" SITE=W19 IO_TYPE=LVCMOS33 ;
wire reset = ~reset_n; IOBUF PORT "led_5" SITE=V19 IO_TYPE=LVCMOS33 ;
assign led = ~counter[31:24]; IOBUF PORT "led_6" SITE=AB20 IO_TYPE=LVCMOS33 ;
IOBUF PORT "led_7" SITE=AA20 IO_TYPE=LVCMOS33 ;
always @(posedge clock) begin LOCATE COMP "reset_n" SITE "A21" ;
if (reset) LOCATE COMP "clock" SITE "L5" ;
counter <= 32'd0; IOBUF PORT "clock" IO_TYPE=LVDS25
else DIFFRESISTOR=OFF DIFFDRIVE="NA" ;
counter <= counter + 32'd1;
end
endmodule
25. Tutorial 2: simulation
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-2
counter_tb.v
`timescale 1ns / 1ns
module top_tb;
reg clock;
reg reset_n;
wire[7:0] led;
initial begin
$dumpfile("counter.vcd");
$dumpvars(0, top_tb);
end
initial begin
$monitor($realtime,,"ps %h %h %h ",clock,reset_n,led);
end
top top_tb (
.clock(clock)
, .reset_n(reset_n)
, .led(led)
);
initial reset_n = 1'b0;
initial clock = 1'b0;
always #1
clock = ~clock;
initial begin
#10 reset_n = 1'b1;
#300 $finish;
end
28. Tutorial 2: simulation
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-2
# OSX: `brew install gplcver icarus-verilog gtkwave`
# icarus verilog + gtkwave
$ iverilog -o counter_sim counter_tb.v counter_top.v
$ vvp counter_sim
$ gtkwave counter.vcd
# GPL Cver + gtkwave
$ cver counter_tb.v counter_top.v
$ gtkwave counter.vcd
29. IP core
パッケージ化された回路情報
ハードIP
予めFPGA内に組み込まれて提供されるIP
ソフトIP
RTLレベルで提供,またはゲートレベルに論理合成されRTLがブラック
ボックス化されて提供されるIP
IPの例:
CPU, FIFO, FFT, SRAM I/F, PCIe I/F, Ethernet MAC, etc.
http://opencores.org ではIPがOSSライセンスで提供されている
Lattice DiamondではIPカタログであるIPExpressを使ってIPを使う
31. How to use IPexpress
Project Path, File Name, Module Outputを入力してCustomize
33. How to use IPexpress
File -> Add -> Existing File
34. How to use IPexpress
生成された{file name}.ipxを選択して'Add'
35. How to use IPexpress
IPの{file name}_tmpl.vにネット名称が記述されているので,それを基にIPを使
用する.tb_{file name}_tmpl.vなども参考になる
36. Building on the Command Line
GUIを使わずに論理合成する
1. {project name}.tclに作業内容を記述
2. $ diamondc {project name}.tcl > output.log
Xilinx ISEでも大体同じことが可能
prj_project open "/home/sora/proj/led.ldf"
prj_run Synthesis -impl led
prj_run Translate -impl led
prj_run Map -impl led
prj_run PAR -impl led
prj_run PAR -impl led -task PARTrace
prj_run Export -impl led -task Bitgen
prj_project close
tclスクリプトの例
38. Ethernet physical layer
今回作成するネットワークテスタに必要となる物理層を中心に解説
特に今回はMIIさえわかれば大丈夫
データリンク層
MAC MAC: media access control
RS: Reconciliation Sublayer
RS MII: Media Independent Interface
PHYの外部インタフェース
MII PCS: Physical Coding Sublayer
データの符号化 , AutoNeg
PCS PMA: Physical Medium Attachment
物理層 PHY シリアル・パラレル変換
PMA PMD: physical medium dependent
アナログ・デジタル変換
PMD MDI:
コネクタ (EX: RJ-45)
MDI MEDIUM:
伝送媒体 (EX: UTP, 光ファイバ)
MEDIUM
OSI 参照モデルとの対比
39. Ethernet frame
8B
Preamble
Preamble:
正確には Preamble '1010'が56bit分 +
SFD (Start Frame Delimiter)である
Ethernet header '10101011'の合計64bit (8byte).
端末間の送受信タイミングの調整用
64B~1518B
FCS:
IP header Ethernet frameのCRCチェックサム
Inter Frame Gap:
送信フレーム間のインターバルとして96 bit
Payload times空ける必要がある
46B~1500B
FCS (CRC)
12B~
Inter Frame Gap
40. Media Independent Interface (MII)
Ethernetの多様な物理媒体と論理層を切り離すために用意されたレイヤ1と
レイヤ2間のインタフェース仕様
MIIを理解することで,FPGAに接続されたPHY Chipと自由にやり取りが可能
になる
Ethernetの転送速度ごとにそれぞれインタフェースの仕様が決められている
40G以降の実際のインタフェースはIPの仕様依存
10 Mbps 100 Mbps 1000 Mbps 10 Gbps 40 Gbps 100 Gbps
MII MII GMII XGMII XLGMII CGMII
2.5 MHz 25 MHz 125 MHz 156.25 MHz 625 MHz 1.5625 GHz
4 bit 4 bit 8 bit 64 bit 64 bit 64 bit
転送速度ごとのMIIとその仕様 (動作周波数と信号線数)
41. MIIの信号一覧
TXCLK input 10/100 Mbps用送信clock
送信 TXD0~3 output 送信フレームデータ
TXEN output フレーム出力時に'1'
TXER output 送信障害通知時に'1'
RXCLK input 受信用Clock
RXD0~3 input 受信フレームデータ
RXDV input フレーム受信時に'1'
受信 RXER input 受信障害通知時に'1'
COL input パケット衝突時に'1' (半二重のみ)
CS input キャリアセンス時に'1' (半二重のみ)
MDC output マネージメントclock
マネージメント
MDIO inout マネージメントインタフェース(送受信)
42. MII: timing chart
Ethernet Frame部のみLSB(下位4bit)->MSB(上位4bit)で送信しているのに注目
Data (1byte目) collision
下位 4bit 上位 4bit
preamble FCS[3:0]
preamble + SFD FCS[7:4]
'0101' '1101'
43. GMIIの信号一覧
GTXCLK input 1000 Mbps用送信Clock (125MHz)
TXCLK input 10/100 Mbps用送信clock
送信 TXD0~7 output 送信フレームデータ
TXEN output フレーム出力時に'1'
TXER output 送信障害通知時に'1'
RXCLK input 受信用Clock
RXD0~7 input 受信フレームデータ
RXDV input フレーム受信時に'1'
受信 RXER input 受信障害通知時に'1'
COL input パケット衝突時に'1' (半二重のみ)
CS input キャリアセンス時に'1' (半二重のみ)
MDC output マネージメントclock
マネージメント
MDIO inout マネージメントインタフェース(送受信)
45. Reduced Media Independent Interface (RMII)
100M (MII)が16ポートだけでも信号線が256本必要
そこでMII/GMIIの信号線を半分したインタフェースRMII/RGMIIが一般的に利
用されている
RMIIは,動作周波数を2倍にする代わりに信号線を半分にしたインタフェー
ス
RGMIIは周波数を変えずにClockの立ち上がりと立ち下りの両エッジでデー
タ転送することで信号線数を半分にする
100 Mbps 1000 Mbps
RMII RGMII
50 MHz 125 MHz
2 bit 4 bit
46. Delay measurement tool for network device
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
FPGAでネットワークテスタを作る動機
ショートパケット (64byte)ワイヤーレートでテストがしたい
クロックレベルの計測 (1000BASE-Tで8ns単位)
自作ネットワークデバイスのデバッグには必要
FPGA
I/F: Port 0 I/F: Port 1
IP address: IP address:
10.0.20.105/24 10.0.21.105/24
I/F: Port 0 I/F: Port 1
IP address: IP address:
10.0.20.1/24 10.0.21.1/24
DUT: Device Under Test DUT
47. Delay measurement tool for network device
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
LatticeECP3 versa kitはPHY Chipが乗っているのでそれを利用
PHY chip: Marvell 88E1119R
今回はDUTの正確な遅延の計測のためMAC相当の機能はIP coreを使わず
に自作
GMII DATA LED TX
PHY chip RJ45
LED RX
MDIO LEDs
FPGA GMII DATA LED TX
PHY chip RJ45
LEDs LED RX
MDIO
FPGAでの実装部とPHYチップの関係
48. Delay measurement tool for network device
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
注意点
今回の実装は10/100M Ethernetを実装しません
1000M Ethernetのみをサポートします
LatticeECP3 Versa Development Kitは,LANポートがデフォルト無効化されていま
す.
LANポート#1はJ10(ジャンパー),LANポート#2はJ12(ジャンパー)をショートから
オープンにすることで有効化してください
49. Delay measurement tool for network device
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
PHYチップのピンアサイン (ユーザガイド p12より)
50. Tutorial 3.1: ethrecv (前半部分)
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
受信したEthernetフレームからDIPスイッチで選択されたバイト位置のデータをLEDで表示
module top (
input clk
, input rst_n
// Ethernet PHY#1 TX
, input phy1_125M_clk
, input phy1_tx_clk
, output wire phy1_rst_n = 1'b1
, output wire phy1_gtx_clk = 1'b0
, output wire phy1_tx_en = 1'b0
, output wire[7:0] phy1_tx_data = 8'b0
// Ethernet PHY#1 RX
, input phy1_rx_clk
, input phy1_rx_dv
, input phy1_rx_er
, input [7:0] phy1_rx_data
, input phy1_col
, input phy1_crs //carrier sense
// Ethernet PHY#1 MII
, output wire phy1_mii_clk = 1'b0
, inout wire phy1_mii_data = 1'b0
// Switch/LED
, input [7:0] switch
, output [7:0] led
);
51. Tutorial 3.1: ethrecv (後半部分)
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
受信したEthernetフレームからDIPスイッチで選択されたバイト位置のデータをLEDで表示
ethrecv.lpfファイルはスライドに入りきらないので,ソースコードをレポジトリから持ってきてください
reg[10:0] counter;
reg[7:0] rx_data[0:2047];
assign led[7:0] = ~rx_data[switch];
always @(posedge phy1_rx_clk) begin
if (rst_n == 1'b0) begin
counter <= 11'd0;
end else begin
if (phy1_rx_dv) begin
rx_data[counter] <= phy1_rx_data;
counter <= counter + 11'd1;
end else
counter <= 11'd0;
end
end
endmodule
52. Tutorial 3.2: ethsend
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
reg [7:0] tx_data;
assign phy1_tx_data = tx_data;
always @(posedge phy1_125M_clk) begin
if (reset_n == 1'b0) begin ARPブロードキャストパケットを定期的に送信する
tx_data <= 11'h0;
tx_en <= 1'b0; CRCの計算をしていないので一般的な機器ではエ
counter <= 12'd0; ラーフレームになる
end else begin
case (counter)
12'h00: begin
tx_data <= 8'h55;
tx_en <= 1'b1;
end
12'h01: tx_data <= 8'h55; // Preamble
12'h02: tx_data <= 8'h55;
12'h03: tx_data <= 8'h55;
12'h04: tx_data <= 8'h55;
12'h05: tx_data <= 8'h55;
12'h06: tx_data <= 8'h55;
12'h07: tx_data <= 8'hd5; // Preable + Start Frame Delimiter
12'h08: tx_data <= 8'hff; // Destination MAC address = FF-FF-FF-FF-FF-FF-FF
12'h09: tx_data <= 8'hff;
...
12'h14: tx_data <= 8'h08; // Protocol Type = ARP (0x0806)
12'h15: tx_data <= 8'h06;
...
12'h47: tx_data <= 8'h00;
12'h48: begin
tx_en <= 1'b0;
tx_data <= 8'h00;
end
default: tx_data <= 8'h0;
endcase
counter <= counter + 12'd1;
end
end
53. Tutorial 3.3: ethsendのシミューレション
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
"Signal name"の"phy1_tx_data"がEthernet送信PHYで"55 55 D5"がプリアンプルとSFD
"FFFFFFFFFFFF"が宛先MAC、"00301BA0A48E"が送信MAC、"0806"がARPプロトコル
54. Tutorial 3.4: ethsend + crc
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
CRC生成回路はopencoresの10_100_1000 Mbps tri-mode ethernet MACプロジェクトのコードを
利用[link] assign crc_init = (counter == 12'h08);
wire [31:0] crc_out;
reg crc_rd;
assign crc_data_en = ~crc_rd;
crc_gen crc_inst (
.Reset(~reset_n)
, .Clk(phy1_125M_clk)
, .Init(crc_init)
, .Frame_data(tx_data)
, .Data_en(crc_data_en)
, .CRC_rd(crc_rd)
, .CRC_end()
, .CRC_out(crc_out)
);
always @(posedge phy1_125M_clk) begin
...
12'h44: begin // Frame Check Sequence
crc_rd <= 1'b1;
tx_data <= crc_out[31:24];
end
12'h45: tx_data <= crc_out[23:16];
12'h46: tx_data <= crc_out[15:8];
12'h47: tx_data <= crc_out[7:0];
12'h48: begin
tx_en <= 1'b0;
crc_rd <= 1'b0;
tx_data <= 8'h00;
end
55. Tutorial 3.5: measure (ethsend + ethrecv)
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-4
2つのLANポートを使って送信と受信を行い、間に接続したHUBやケーブルのパケット転送遅延
を測定
56. RFC2544
Benchmarking Methodology for Network Interconnect Devices
ネットワークデバイスの基本的な性能テスト方法をまとめたRFC
L2, L3, FWといった一般的なネットワーク機器のテストベンチの方法は大体
RFC化されている
今回作成するテスタはRFC2544を参考にしている程度
フレームサイズなど各種パラメータに困った時に参考にしています
Reference
RFC1242 - Benchmarking Terminology for Network Interconnection Devices
RFC5180 - IPv6 Benchmarking Methodology for Network Interconnect Devices
RFC6201 - Device Reset Characterization
57. テストフレームのフォーマット
8B
Preamble
Ethernet frame
Protocol type
ARP: 0x0806
ARP header
64B
Magic code
0xCC00CC00CC
Payload 48 bit
46B Global counter
FCS (CRC) 32 bit
12B
Inter Frame Gap Padding
計測フレーム 計測パケットのペイロード
59. DUT
UTP cable
10, 20, 30, 60, 180 cm
Switching hub (1000Base-T)
BUFFALO LSW2-GT-5NSR
60. Next step 1:
L3 機器を測る
現在の実装の問題点
受信ポートであるPort 1から何もパケットを出さないため,DUTであるL3
機器がPort 1のMAC addressを学習しない(MAC addressテーブルに載
らない) ⇛ ルーティングされず計測できない
実装案1 (いんちきだけど実装が楽)
予めPort 1の対向ポートのMAC Addressを調べる
TX clockを使って1秒程度のglobal clockを作成
global clockに合わせてARP応答パケットを出す
実装案2
Port 1のRXでARP requestを見張りARP要求msgに応答
ヘッダフィールド値は[TCP/IP Vol.2]などを参照
61. Next step 2:
IPv6 対応デバイスを測る
必要な実装内容
FPGAにMODE機能を実装
DIPスイッチなどでIPv4/v6モードの切り替え
IPv6版の計測パケットを実装 (Protocol type: 0x86dd)
NDP (Neighbor Discovery Protocol)を実装
63. PCI
PCI(パラレル)の性能限界
32/64ビットのパラレル転送はすべての信号がほぼ同時に到着しなけれ
ばならない(等長配線が必要).
信号の到達時間には500ps-1nsくらいの差がうまれ,受信側がスキュー
(到達タイミングのズレ)を考慮しなければならない
64. PCI Express
現在のI/O界のDe facto standardなbusプロトコル STP (1byte)
最近のFPGAではハードIPでPCI Expressが搭載
⇛自作PCIeデバイスは今が始め時! SEQ# (2byte)
TLP (Transaction Layer Packet): TLPヘッダ
トランザクション層のパケット (3~4DW)
DLLP (Data Link Layer Packet):
データリンク層のパケット
ソフトウェア層 TLPデータ
PLP (Physical Layer Packet):
(PCI互換) (0~1024DW)
物理層のパケット
トランザクション層 ECRC (0 or 1DW)
データリンク層 LCRC (1DW)
物理層 END (1byte)
PCI Expressの3階層 PCI Expressのパケット構造
65. PCI Express + FPGA
FPGA+PCI Expressの代表的な構成
(Ethernetの物理層と比較してみてください)
PMAには高速なシリアルパラレル変換が可能なSERDESを利用
Serial:2.5GHz <-> Parallel:250MHz
トランザクション層を理解すればIPを使ってデバイス開発可能
トランザクション層
FPGA PCIe
データリンク層
MAC
PIPE PHY
PIPE I/F FPGA
Chip
PCIe
物理層
PCS
代表的な構成
PMA 最近は大体上の構成
PCI Express lane
66. PCI Express: TLP
TLPパケットはTLPヘッダ部(3 or 4WD)+TLPデータ部(0~4096バイト)で構成される
トランザクションの種類は以下の8種類 (typeフィールドで指定)
ポスト: 返信(コンプリーション)を必要とする転送要求
ノンポスト: 返信を必要としない転送要求
トランザクションの種類 動作 データ・ペイロード
メモリ・リード ノンポスト なし
メモリ・ライト ポスト あり
I/O・リード ノンポスト なし
I/O・ライト ノンポスト あり
コンフィグレーション・リード ノンポスト なし
コンフィグレーション・ライト ノンポスト あり
コンプリケーション ノンポスト (read時)なし/(write時)あり
メッセージ ポスト なし/あり
67. PCI Express: TLPヘッダ構造
TLPパケットはTLPヘッダ部(3 or 4WD)+TLPデータ部(0~4096バイト)で構成される
トランザクションの種類は以下の8種類 (typeフィールドで指定)
ポスト: 返信(コンプリーション)を必要とする転送要求
ノンポスト: 返信を必要としない転送要求
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|FMT| Type |R| TC | R |T|E|AT | R | data length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| | Last,1st DW BE|
+ Header (3DW) +
| |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -+
| Header (4DW) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATA payload (0~4096 byte) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Digest (Option) |
68. PCI Express: リンクとレーン
物理層 (PHY) リンク 物理層 (PHY)
レーン TXP0/TXN0
RXP0/RXN0
TXP1/TXN1
ポート
ポート
RXP1/RXN1
TXP2/TXN2
RXP2/RXN2
TXPn/TXNn
RXPn/RXNn
69. (参考) シリアル通信のエンベデッド・クロック
8b/10b:
PCIe (1.1, 2.0), Ethernet 〇〇BASE-*X*, Infiniband (SDR, DDR,
QDR), USB 3.0, SATA
64b/66b:
Ethernet 〇〇BASE-*R*, Infiniband FDR
128b/130b:
PCIe 3.0
70. PCI/PCI Express: Debug
PCIまわりのバグ = OSクラッシュ
PCIのコーディングには1フロッピーMS-DOSが便利
redpciコマンドでbase addressを確認
memoryコマンドでI/OメモリマップしたFPGAのレジスタを確認
MS-DOSを使うメリット
OSがクラッシュしても再起動が早い
詳しくは[PCIデバイス設計入門]を参照
71. PCI/PCI Express: Debug
REDPCI コマンド .... PCI情報を表示する
例) REDPCI /F .... PCI情報の詳細を表示する
PCI Vendor IDの一覧 [link], Device IDの一覧 [link], Device classの一覧 [link]
73. Tutorial 4.1: FPGAでPCI Expressを使う
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-5
IPexpressを使ってPCIeのIPを生成,PCIコンフィグレーション空間部のみを実装
今回はIPに用意されているWishbone I/Fを使ってPCIeにアクセス
MS-DOSを使ってコンフィグレーション空間を確認
PCI read/writeの記述が無いのでPCIeにアクセスするとOSがクラッシュ
マニュアルはこちら[link]
Portのリストはマニュアルの12から23ページのtable2-1を参照
Transmit TLP I/F
Receive TLP I/F
PCI Express
PCI Express lanes Configuration Status
IP Core
I/F (tutorial 5.1)
Wishbone I/F
(tutorial 5.2)
(参考) XilinxなどではARM社のAXI4 I/F経由でIPにアクセスできます
74. Tutorial 4.1: FPGAでPCI Expressを使う
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-5
IPexpressを使ってPCIeのIPを生成
75. Tutorial 4.1: FPGAでPCI Expressを使う
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-5
IPexpressを使ってPCIeのIPを生成
76. Tutorial 4.1: FPGAでPCI Expressを使う
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-5
IPexpressを使ってPCIeのIPを生成
77. Tutorial 4.1: FPGAでPCI Expressを使う
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-5
IPexpressを使ってPCIeのIPを生成
78. Tutorial 4.1: FPGAでPCI Expressを使う
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-5
IPexpressを使ってPCIeのIPを生成
79. Tutorial 4.2: FPGAでPCI Expressを使う
source code: https://github.com/sora/fpga-workshop-2012f/tree/master/tutorial-5
Wishboneバス経由でPCI Express上のI/Oメモリ空間へ回路をマッピング(read only)
コードは複雑に見えますがほとんどが定型のコードです
reg[15:0] wb_dat;
reg wb_ack;
always @(posedge clk_125 or negedge core_rst_n) begin
if (!core_rst_n) begin
wb_dat <= 16'h0;
end else begin
if (pcie_cyc & pcie_stb) begin
wb_dat <= pcie_adr[15:0];
end
end
end
always @(posedge clk_125 or negedge core_rst_n) begin
if (!core_rst_n) begin
wb_ack <= 0;
end else begin
wb_ack <= pcie_cyc & pcie_stb & (~wb_ack);
end
end
assign pcie_dat_i = wb_dat;
assign pcie_ack = wb_ack;
assign led_out = 14'h0;
80. PCI/PCI Express: DMA and SR-IOV
Direct Memory Access (DMA)
ペリフェラルが直接メモリバスを操作して,メインメモリにアクセスする仕組み
レイテンシが低いがスループットが高い
Kintex-7 dev kitにDMA EngineのIPが付属
Single Root I/O Virtualization (SR-IOV)とマルチファッション
PCI-SIGによるPCIデバイスのIO仮想化サポートのための規格
Xilinx 7シリーズから本格対応開始
Vertex-7 XTはPCIe Gen3のHard IPで一部機能をサポート
Kintex-7はSoft IPで対応予定?(詳細不明)
82. HTML5を使うモチーベーション
Embedded systemのフロントエンド
フロントエンドも1から自分でやるのはしんどい
今時のリッチなUIを使いたい
組み込みシステム全体の検証はとても大変
HW/SWのバグ,HWの相性や故障,ツールの仕様(バグ),etc.
データ視覚化を用いた簡易デバック環境の構築
技術的な背景
HTML5 websocket, canvasの登場
Javascriptによる豊富な可視化ライブラリ
websocketがバイナリデータのサポート
node.jsの登場 (node-mmapなど便利モジュールもたくさん)
c++によるシステム関数のモジュール(v8)が簡単に作成可能
83. PCI/PCIeデバイス向けHTML5の使い方例
FPGAのレジスタをブラウザから読み書きする
1. FPGAの任意のregisterをPCIのI/Oメモリ空間にマッピング
2. FPGAボードのレジスタをPCI/PCIe経由でmmap
3. mmapした物理メモリ空間をWebsocketでブラウザに転送
Read: ブラウザで受け取ったバイナリデータをJavascriptの変数に変換
して表示
Write: ブラウザ側でHTMLの入力フォームを用意して入力された値をレ
ジスタを書き込む
ブラウザを使う利点
Websocketを使うことで簡単に双方向通信が実現可能
Javascriptの豊富なライブラリが使える
84. 構成例
FPGA Host PC
Ethernet
Browser
DUT PCI/PCIe
pin ory
Ethernet
m mem
g
ap
I/O
websocket
user
registers
mmap node.js
86. 例: テスタのUI PCI I/O Memory MappingしたFPGA上
のレジスタをHTMLからread/write
テスタの計測結果をwebsocket経由でリア
ルタイムに表示 (数ms)
87. 例: node.js
var fs = require('fs');
var wsserver = require('ws').Server;
var mmap = require('mmap');
var express = require('express')
var D = require('util').debug;
var app, fd, buf, wss;
var BASE_ADDR = 0xe9000000;
var MSIZE = 0x80;
// setup: http server
app = express.createServer();
app.use(express.static(__dirname + '/public'));
app.listen(8081);
// setup: websocket server
wss = new wsserver( {server: app} );
// setup: fd
try {
fd = fs.openSync('/dev/mem', 'w+');
} catch (e) {
D('cannot open: /dev/mem: ' + e);
process.exit(1);
}
// setup: mmap
try {
buf = mmap.map(MSIZE, mmap.PROT_READ|mmap.PROT_WRITE, mmap.MAP_SHARED, fd, BASE_ADDR);
} catch (e) {
D('cannot mmap: ' + e);
process.exit(1);
}
...
89. FPGA dev kit for network device:
Xilinx Kintex-7 FPGA Connectivity Kit
発表されたばかり.10Gデバイスを自作したい人向け
Kintex-7 (28nmプロセス), SFP+ 5 port (本体1 port + FMC module 4 ports),
SFP+ module 2 units, fiber cable
価格: $2,895
90. FPGA dev kit for network device:
NetFPGA-1G, NetFPGA-10G
Stanford中心のネットワークデバイス特化型の総合FPGAプラットフォーム
ツールや一般的なリファレンスデザインなどを含めたパッケージ
ACMコミュニティで時々ワークショップが行われている
NetFPGA 1G
1G ethernet x4, 4.5MB ZBT SRAM, PCI-X, Virtex II Pro 50
NetFGPA 10G
10G ethernet x4, 27MB QDRII SRAM, PCI Express x8, Virtex5
*10Gは別途PCS/PMAのIPが必要
91. Handmade 10G device
2012年は自作10Gデバイス元年
SFP+インタフェースを持つFPGAキットが登場
(NetFPGA-10G, Xilinx Kintex-7, etc.)
SFP拡張モジュール (FMC)も各ベンダ向けに出
FPGA
ている
User logic
必要なIP core FIFO I/F
PCS/PMA
MAC (IP or 自作)
10GではFPGA内でPHY機能を処理
10G MAC XGMII
ルータやFWのような高機能機器には必要 PCS/PMA (IP core)
Serial I/F
SFP+ module
一般的な構成
92. Memory (for network device)
必要に応じてメモリを選択
SRAM
ZBT, RLDRAM, QDR, etc
最新の情報はeetimesを参照[link]
書きかけ
93. CAM/TCAM
module tcam ( ...
input clk
, input rst wire[depth-1:0] bits;
, input iena genvar i;
, input [width-1:0] idata generate
, input [width-1:0] iprefix for (i=0; i<width; i=i+1) begin: gen
, input [width-1:0] isearch_data //assign bits[i] = !(data[i] ^ search[i]); // <- BCAM
, output match assign bits[i] = !(data[i] ^ isearch_data[i]) | !prefix[i];
); end
endgenerate
reg[width-1:0] data;
reg[width-1:0] prefix; always @(posedge clk) begin
if (rst)
always @(posedge clk) begin match <= 1'b0
if (rst) begin else
data <= {width{1'b0}}; match <= (& bits) & iena;
prefix <= {width{1'b0}}; end
end else begin
if (iena) begin
data <= idata;
prefix <= iprefix;
end
end
end
...
94. High-Level Synthesis (HLS) for FPGA
FPGA向けのHLS環境が少しずつ登場
Xilinx Vivado HLS (C/C++/SystemC)
http://www.xilinx.com/support/documentation/sw_manuals/xilinx2012_2/ug902-vivado-
high-level-synthesis.pdf
Impulse C (ANSI C)
Arista 7124FX Application Switchのdev kitに年間ライセンスが付属
その他 (主にASIC向けだが,FPGAにも対応)
Bluespec, LabVIEW FPGAモジュール, etc.
今後の動向
Altera OpenCL (OpenCL)
http://www.altera.co.jp/b/opencl.html
Oracle JDK 9 (Java) #本当?
http://www.oracle.com/technetwork/jp/ondemand/java/jdw-2-2-1390077-ja.pdf
95. Embedded CPU
FPGA Soft CPU
Xilinx MicroBlaze, PicoBlaze
Altera Nios, Nios II
Lattice LatticeMico32
OpenRISC
LEON (SPARC V8)
組み込み向けCPU
ARM
Intel Atom E6シリーズ
はぜやまさんがAtom+FPGA dev kitを持ってくるらしい
CPU+FPGA
Xilinx Zynq (Cortex-A9 dual core 1MHz)
96. Reference list (1/4)
● PCI 関係資料
○ "PCIデバイス設計入門-PCIバス原理からHDLによるIC設計&デバッグ手法まで", イン
ターフェース編集部, CQ出版
● PCI Express 関係資料
○ Interface 2009/1-, "連載「徹底解説 作ればわかるPCI Express」" 全22回, 内藤竜治,
CQ出版
■ 図書館でInterfaceのバックナンバを複写できる
○ "PCI Express設計の基礎と応用", 畑山仁, CQ出版
○ Lattice Semiconductor, "PCI Express 2.0 x1, x4 Endpoint IP Core User’s
Guide", http://www.latticesemi.com/documents/ipug75.pdf
○ Altera, "PCI Express 高性能リファレンス・デザイン", http://www.altera.co.
jp/literature/an/an456_j.pdf
● Ethernet 関係資料
○ "Ethernetのしくみとハードウェア設計技法", Interface編集部, CQ出版
○ IEEE-SA -IEEE Get 802 Program - 802.3: Ethernet,
http://standards.ieee.org/about/get/802/802.3.html
97. Reference list (2/4)
● Verilog-HDL 関係資料
○ "わかるVerilog HDL入門―文法 基礎から論理回路設計、論理合成、実装まで", 木村
真也, CQ出版
○ FPGAボードで学ぶ組込みシステム開発入門 [Altera編], 小林優, 技術評論社
○ Xilinx "XSTユーザガイド (UG627)",
http://japan.xilinx.com/support/documentation/sw_manuals/xilinx12_3/xst.pdf
● Kernelとドライバまわり資料
○ "Linuxカーネル解析入門[増補版]", 平田豊, 工学社
○ "Linuxデバイスドライバプログラミング", 平田豊, ソフトバンククリエイティブ
● TCP/IP 関係資料
○ "詳解TCP/IP(Vol.2) 実装", Gary R. Wright (原著), W.Richard Stevens (原著), 徳田 英
幸 (翻訳), 戸辺 義人 (翻訳), ピアソンエデュケーション
98. Reference list (3/4)
● PC-Bus 関係資料 (AXI4のおすすめ資料募集中)
○ CMU "18‐447 Lecture 12:Busses and I/O", James C. Hoe:
http://users.ece.cmu.edu/~jhoe/course/ece447/S11handouts/L12.pdf
○ OpenRISC SoC "Wishbone B4 - WISHBONE System-on-Chip (SoC)
InterconnectionArchitecturefor Portable IP Cores", http://cdn.opencores.
org/downloads/wbspec_b4.pdf
● 組み込み全般
○ "Modern Embedded Computing: Designing Connected, Pervasive", Media-Rich
Systems, Peter Barry, Patrick Crowley, Morgan Kaufmann
■ 紹介Slide (PDF): http://embedded.communities.intel.
com/servlet/JiveServlet/previewBody/7158-102-1-2404/Modern-
Embedded-Computing-Designing-Connected-Pervasive-Media-Rich-
Systems.pdf
■ # takeiさんから頂きました
99. Reference list (4/4):
● General network device
○ RFC1242 - Benchmarking Terminology for Network Interconnection Devices
○ RFC2544 - Benchmarking Methodology for Network Interconnect Devices
○ RFC6201 - Device Reset Characterization
● IPv6
○ RFC5180 - IPv6 Benchmarking Methodology for Network Interconnect Devices
● L2 Switch
○ RFC2889 - Benchmarking Methodology for LAN Switching Devices
● Firewall
○ RFC3511 - Benchmarking Methodology for Firewall Performance
● IP Multicast
○ RFC3918 - Methodology for IP Multicast Benchmarking
102. テストフレームのフォーマット
Preamble
フロントエンドからPaddingサイズを調整する
ことでフレームサイズの調整が可能(最小値
Ethernet frame 64byte)
Inter Frame Gapを変更することで,フレーム
Protocol type 到達タイミングの調節が可能 (推奨 12 clock,
IPv4: 0x0800 最小値 0 clock)
IPv6: 0x86dd
将来的にはHost PCからpcapファイルを
FPGAのregisterにPCIe経由でロードして全パ
IP header ラメータ変更可能を検討(Hardware版tcp
replay)
UDP header Magic code
0xCC00CC00CC
48 bit
Payload
Global counter
FCS (CRC) 32 bit
Padding
Inter Frame Gap ...
計測フレーム 計測パケットのペイロード