[Q2HB] Avalon Streaming Interconnect Components

[Altera][Q2HB] Avalon Streaming Interconnect Components

Component Overview

refer to: "Volume 4: SOPC Builder, Section III. Interconnect Components, Chapter 12, Avalon Streaming Interconnect Components"

readyレイテンシが異なる,source/sinkインタフェースに対応します.timing adapterは,ready信号とvalid信号を除いた全ての信号をペイロードのように処理し,souceからsinkへ単純に駆動します.タイミングアダプタの挙動を以下に記します.

  • source:ready, sink:not ready (データ入力がこない)\sourceはbackpressureを返しますが,sinkは応答する必要がない.sourceインタフェースへのready入力は論理1に直結される.
  • source:not ready, sink:ready (出力先busy?)\sink(取り込み側)はbackpressureが適用されるが,sourceは応答できない.sourceはvalidだがsinkがnot readyのときに,アダプタが妨げてデータロスをさせないための機能はない.アダプタはシミュレーション時のエラーメッセージを提供し,データが恒常的に失われるならばエラーを示す.\ユーザーがwarningの存在を確認し,接続を許可される.
  • source/sinkともにbackpressure対応, soureよりsinkのreadyレイテンシのほうが大きい.(入力が遅い)\souce(排出側)がreadyアサートやデアサートへ応答するのは,sinkがreadを要求するよりも早い.sourceとsinkの,readyサイクルが同じに見えるようにするために,readyレイテンシの差に等しいパイプラインステージ数が,sink backからsouceへのreadyパスに挿入される.
  • source/sinkともにbackpressure対応, soureよりsinkのreadyレイテンシのほうが小さい.(出力しきれない)\souce(排出側)が,sinkの条件を満たしてreadyアサートやデアサートへ応答するのは不可能.readyレイテンシの差に等しい深さのバッファが,sourceが時間内に応答できないことを補うために挿入される.\# あふれないか?

Instantiating the Timing Adapter in SOPC Builder

  • Input Interface Parameters
    • Support Backpressure with the ready signal\Checkすると,backpressure機能を追加する.
    • Ready Latency\ready信号が使われるとき,この値はready信号がアサートされたときとvalid dataが駆動されたときの間のサイクル数をさします.
    • Include valid signal\valid信号を含むときにCheckしてください.これをoffにすることは,データ受信が常に許可となることを意味します.
  • Output Interface Parameters
    • Support Backpressure with the ready signal\Checkすると,backpressure機能を追加する.
    • Ready Latency\ready信号が使われるとき,この値はready信号がアサートされたときとvalid dataが駆動されたときの間のサイクル数をさします.
    • Include valid signal\valid信号を含むときにCheckしてください.これをoffにすることは,データ送出が常に許可となることを意味します.
  • Common to Input and Output Interfaces
    • Channel Signal Width (bits)\チャネルsignalの幅を入力します.4つのチャネル幅は16チャネルまで許容します.チャネル信号の最大幅は8bitです.チャネル未使用時は0をセットしてください.
    • Max Channel\インタフェースがサポートするチャネル数の最大値をセットしてください.値は0~255が有効です.
    • Data Bits Per Symbol\シンボルあたりのビット数を入力します.
    • Data Symbols Per Beat\有効な転送ごとのシンボル数を入力します.
    • Include Packet Support\インタフェースがパケットプロトコルをサポートするときにonにしてください.
    • Include Empty Signal\endofpacket信号を含んだ,サイクル中のemptyシンボル数を指定するためにこの信号を使えます.number of symbols per beatが1なら不要です.
    • Error Signal Width (Bits)\エラー信号の幅を入力します.有効な値は0~31bitです.未使用時は0としてください.
    • Error Signal Description\エラービットそれぞれの記述を入力します.記述フィールドはセミコロンで分割します.接続が作られるためには,sourceとsinkのエラービットの記述が合致しなければなりません.ビットが不整合とすることのできる適合については,12-9の"Error Adapter"を参照ください.
Refer to “Error Adapter” on
page 12-9 for the adaptations that can be made when the bits do not
match. Lissy: I wrote this using common sense. Please check.

★pdf化前のreviewメモが残されている気がする.





注意事項

英語力の弱い人が適当に訳しています.
自分では意味がわかるようにとれたものと,そうでないものとがあります.概要理解の参考にしていただければ幸いですが,オリジナルの英文を参照されることを強く推奨いたします.
また,自分なりに理解して解説したり,参照した資料などへのリンクも記述していますが,ALTERA社の検閲は入っておりません.
入門者の敷居を下げるべく,説明文の誤り指摘や修正案等のコメントをいただけますと幸いです.

[Q2HB] Scatter-Gather DMA Controller Core(SG-DMA)

[Altera][Q2HB][IP] Scatter-Gather DMA Controller Core(SG-DMA)

Component Overview

refer to: Section IV. Peripherals Chapter 21, Scatter-Gather DMA Controller Core

以下のデータ転送を行うことができる.

  • メモリ→メモリ転送
  • データストリーム→メモリ
  • メモリ→データストリーム

不連続なメモリアドレスでも,転送用のデスクリプタを与えることで自発的に転送を行う.NiosII processorに対しては,HALシステムライブラリから,ドライバが提供されており,提供ドライバを使うことで当コアへのアクセスができる.

機能説明省略

Instantiating the Core in SOPC Builder

MegaWizardを使うことでインスタンス化(具体化)する.

ParameterLegal ValuesDescription
Transfer modeMemory To Memory
Memory To Stream
Stream To Memory
使い方を設定する
Allow unaligned transfersOn/Off@On:word alignmentされていない転送を許可する(performance劣化)
Enable burst transfersOn/OffBurst転送(R/W)を有効にする(@On)
Read burstcount signal width1 - 16Burst Read時のburst幅を設定する
Write burstcount signal width1 - 16Burst Write時のburst幅を設定する
Data width8, 16, 32, 64Avalon-MM read/write portのバス幅
Source error width0 - 7Avalon-ST source portのエラー信号数
Sink error width0 - 7Avalon-ST sink portのエラー信号数
Data transfer FIFO depth2, 4, 8, 16, 32, 64burst無効時のメモリ→メモリ転送におけるDMA内部FIFOの段数

SG-DMAコアは,システム内で高スループットを保障するためには,高い優先度が他のコンポーネントよりも高く(IRQの値を低く)すべきである.


Software Programming Model

  • altera_avalon_sgdma_regs.h\コアレジスタマップの定義.low-levelアクセスのときに参照されたい.
  • altera_avalon_sgdma.h\bufferコントロール・ステータス制御用API,ビットフィールド定義?
  • altera_avalon_sgdma.c\SG-DMA制御コアの関数定義と実装.
  • altera_avalon_sgdma_descriptor.h\コアのデスクリプタ定義.low levelでハードアクセスするためのシンボル・ビットフィールドなどの定義.


注意事項

英語力の弱い人が適当に訳しています.
自分では意味がわかるようにとれたものと,そうでないものとがあります.概要理解の参考にしていただければ幸いですが,オリジナルの英文を参照されることを強く推奨いたします.
また,自分なりに理解して解説したり,参照した資料などへのリンクも記述していますが,ALTERA社の検閲は入っておりません.各自自己責任においてご利用ください.
入門者の敷居を下げるべく,説明文の誤り指摘や修正案等のコメントをいただけますと幸いです.

[Q2HB] Avalon-MM Pipeline Bridge

[Altera][Q2HB][IP] Avalon-MM Pipeline Bridge

Component Overview

Avalon-MM Pipeline Bridgeは,そのMasterとSlaveの間にレジスタを挿入します.SOPC Builder systemにおいて,register-to-register delay(レジスタ間データ遅延)がsystem interconnect fabric内で生じた場合に,pipeline bridgeを入れることで遅延を削減し,fMAXを満足するようにできるかもしれません.
分離される信号は以下のとおり.

  • MsterからSlaveへの信号(address,write data,control signals)
  • SlaveからMsterへの信号(read data,waitrequest(Optional))

# かなり意訳.レイテンシ増加はあるだろうが,レジスタを挟むのでtiming解析の視点では遅延時間短縮が図れる.

Avalon-MM pipelineを使うことで,トポロジー制御を,pipelineステージを追加することなく行える.pipelineを生成させないためには,"Pipeline Options"を全てノーチェックとする.

★caution
レイテンシ無しのpipeline bridgeは,パイプライン読み出しをサポートしているSlaveには使用できません.

A pipeline bridge with no latency cannot be used with slaves that support pipelined reads.

もしSlaveが読み出しレイテンシを有さないのであれば,パイプラインステージ無しでは接続できません.なぜならば,pipeline bridgeのslaveポートは,"read data valid"信号を有するためです.パイプライン読み出しコンポーネントは,読み出しレイテンシ無しにはできません.

[Pipeline options] Pipeline Stages and Effects on Latency
以下の三種類の信号グループに対して,レジスタを挟むかどうかを指示します.

  • Insert one pipeline stage for master-to-slave signals
    (address, writedata, write, read, byteenable, chipselect, burstcount(optional))
  • Insert one pipeline stage for slave-to-master signals
    (readdata, readdatavalid)
  • Insert one pipeline stage for waitrequest signals
    (waitrequest)

pipeline stageを挿入した際の影響は以下のとおり.

  • 各方向で,1サイクルだけレイテンシが増加する.
  • Bridgeのmaster側の書き込み転送は,Bridgeのslave側の書き込み転送から切り離される(decoupled).
    ∵Avalon-MM Write転送はslaveからのACKを待たないので.
  • waitrequestレジスタステージを含めると,waitrequest信号がアサートされたときに,master-to-slave信号のレイテンシが追加で1サイクル増加します.

Burst Support
Bridgeは,設定可能な最大burst長で,burstをサポートします.burstサポートと設定したとき,最大burst長を上限として,master-slave間でburstを伝えます.
burstサポートを無効にした場合は,burst lengthを1とすることと等価です.この場合,system interconnect fabricは自動的にmaster-to-bridge burstをシーケンシャルな個々の転送に展開します.




注意事項

英語力の弱い人が適当に訳しています.
自分では意味がわかるようにとれたものと,そうでないものとがあります.概要理解の参考にしていただければ幸いですが,オリジナルの英文を参照されることを強く推奨いたします.
また,自分なりに理解して解説したり,参照した資料などへのリンクも記述していますが,ALTERA社の検閲は入っておりません.各自自己責任においてご利用ください.
入門者の敷居を下げるべく,説明文の誤り指摘や修正案等のコメントをいただけますと幸いです.

[Altera][QSF] OUTPUT_ENABLE_GROUP

2008/12/01FPGA::QuartusIIimport

[Altera][QSF] OUTPUT_ENABLE_GROUP

Syntax

set_instance_assignment -name OUTPUT_ENABLE_GROUP -to <to> -entity <entityname> <value>


Description

output enable group numberを指定したノードに設定します.

このオプションをONにすることは,Vref入力や双方向端子が存在するときに,Fitterに,指定されたノードをVrefグループで駆動される端子数の最大数の要求を違反しないため,output enable groupとして見るように伝えます.

双方向端子において,Fitterは全ての可能なピンを決定します.このことは,どの双方向ピンも,VREFグループ内の全ての双方向ピンのOutputEnable時に"in"として駆動されないときに,潜在的に"out"に駆動されることをさします.

For bidirectional pins,
 the Fitter determines all possible pins
  that may potentially drive out
   when any bidirectional pin is driving in by looking at the output enable of all the bidirectional pins in the VREF group.

この挙動は,Vrefグループが出力の最大数を上回る結果となり,フィットしない結果となる.'Output Enable Group'オプションを有効にすることは,ユーザに,指定したピンに対してoutput enable groupを指定することを許可します.このように,ユーザはデザイン内のピンが同時に"in"と"out"に駆動されるかを指定することを許可します.

Fitterは,Output Enable Groupを指定されることで,pinが分割されたOutput Enable Groupである時か,Output Enable Groupではない時に,pinが潜在的にoutputであることのみ考えます.どんなpinも"in"に駆動されないときに,VREFグループ内のoutputとなる総数を下げることができます.

結果的に,Fitterは双方向ピンの潜在的なoutput総数を数えない.また,法的な範囲(in the legal range)でのVREFグループのoutput数を数えない.

ユーザは,FitterがVREFグループのピンのoutput enable groupを検出できなかったときに,このオプションを onにするべきでしょう.例えば,Output Enableがステートマシンや組み合わせ回路から来るときが該当します.VREFグループが保障するoutput数に関する詳細な情報について,デバイスファミリのデータシートを参照ください.AlteraのWEBサイトのLiteratureセクションにあります.


Type

Integer


Device Support

省略.Cyclone1,2,3 と Stratix系は大丈夫でしょう

Notes

This assignment supports wildcards.




注意事項

英語力の弱い人が適当に訳しています.自分では意味がわかるようにとれたものと,そうでないものとがあります.概要理解の参考にしていただければ幸いですが,オリジナルの英文を参照されることを強く推奨いたします.

2008/12/01(月)[QuartusII][SOPC] DDR SDRAM High Performance Controller

[QuartusII][SOPC] DDR SDRAM High Performance Controller

基本

基本的には,ALTERAから出ているUsers Guide~(External DDR Memory PHY Interface Megafunction User Guide (ALTMEMPHY))file:"altmemphy.pdf"~を参照すれば使い方がわかるはずです.


はまったところ

使用するIPのユーザーズガイドは目を通すべし

DDRcontrollerにおいては,2つの制約ファイルが用意されていました.いろいろと調べる羽目になったけれども,SOPC Builderを純粋に使って幾分には,ユーザーズガイドに沿って作業を進めれば乗り越えられたようです...

具体的には,以下のファイルが生成されます.

<module-name>_phy_ddr_timing.sdc
<module-name>_phy_ddr_pins.tcl
 where <module-name> := SOPC Builder の "module name"に記述した名称

SDCファイルはprojectにTimeingQuestへ渡すように設定が必要です.
tclについては,外部端子設定を行うマクロがついています.v7.2のpicture viewerを元にPin Assignment Editorで設定をしてしまったので,使用感は今のところわかりません.scriptを見る感じでは,module階層をたどって外部ピンまで探し出し,ドライブ設定(SSTL-2),電流設定(8mA~Max.まで機能ごとに設定),OutpuEnableGroup設定を行うようです.結果的にどうすべきかのメモを置いておきます.

  • OutpuEnableGroupの設定~1

以下の信号全てを同一グループとし,I/O Bankの制約に引っかからないように制御する.

mem_dq[0..15], mem_dqs[0..1], mem_dm[0..1]
  • OutpuEnableGroupの設定~2

以下の信号全てを同一グループとし,I/O Bankの制約に引っかからないように制御する.

led[0..3]
  • Current_Strengthを設定する
    • Maximum Current
      mem_dq[0..15], mem_addr[0..] //全部
      
    • 12mA
      mem_cs_n, mem_ras_n, mem_cas_n, mem_cke, mem_we_n, mem_clk, mem_clk_n
      mem_ba[0..1], mem_dm[0..1], mem_dqs[0..1]
      

動作クロックがわからない

SOPC BuilderでControllerを貼り付けるが,Clock domainの設定に留意する点がある.DDR controllerの動作クロックは,configurationで自動的にPLLを使ってクロックを生成させる方法をとると,inputするreferenceクロックとほぼ無関係*1に動作する.
このため,本IPの出力クロックを使わないのであれば,Clock Brdigeを加える必要がある.また,本IPはSlave portしか存在しない.このSlavePortの動作クロックは,以下のシンボルのクロックで駆動される.Master Portも同じくロックで駆動する必要がある*2

<DDRcontroller-Module-Name>_sysclk
 where <DDRcontroller-Module-Name> := "Module Name"の欄に入力した文字列

失敗の具体例

システム要件

CPU clock=100MHz
DDR clock=133MHz/66.5MHz
 CPU-DDR間には Clock Bridgeを設置
  BridgeのSlave(CPU側)は CPU clockを設定
  BridgeのMaster(DDR側)は CPU clockを設定(※ここが誤り)

Timing Analysisの結果,以下のようなcritical warningが出る.

Info: Path #1: Setup slack is -3.478 (VIOLATED)
  Info: ===================================================================
  Info: From Node    : Nios2_NoDDR:Nios2_NoDDR_inst|Nios2_NoDDR_clock_1:the_Nios2_NoDDR_clock_1|Nios2_NoDDR_clock_1_slave_FSM:slave_FSM|slave_write_request
  Info: To Node      : Nios2_NoDDR:Nios2_NoDDR_inst|Nios2_NoDDR_clock_1:the_Nios2_NoDDR_clock_1|unxslave_write_requestxx3
  Info: Launch Clock : Nios2_NoDDR_inst|the_pll0|the_pll|altpll_component|auto_generated|pll1|clk[0]
  Info: Latch Clock  : Nios2_NoDDR_inst|the_ddrsdram|ddrsdram_controller_phy_inst|alt_mem_phy_inst|ddrsdram_phy_alt_mem_phy_inst|clk|pll|altpll_component|auto_generated|pll1|clk[1]
  Info: 
  Info: Data Arrival Path:
  Info: 
  Info: Total (ns)  Incr (ns)     Type  Element
  Info: ==========  ========= ==  ====  ===================================
  Info:     30.000     30.000           launch edge time
  Info:     32.932      2.932  R        clock network delay
  Info:     33.037      0.105     uTco  Nios2_NoDDR:Nios2_NoDDR_inst|Nios2_NoDDR_clock_1:the_Nios2_NoDDR_clock_1|Nios2_NoDDR_clock_1_slave_FSM:slave_FSM|slave_write_request
  Info:     33.037      0.000 FF  CELL  Nios2_NoDDR_inst|the_Nios2_NoDDR_clock_1|slave_FSM|slave_write_request|q
  Info:     33.192      0.155 FF    IC  Nios2_NoDDR_inst|the_Nios2_NoDDR_clock_1|unxslave_write_requestxx3~feeder|datad
  Info:     33.255      0.063 FF  CELL  Nios2_NoDDR_inst|the_Nios2_NoDDR_clock_1|unxslave_write_requestxx3~feeder|combout
  Info:     33.255      0.000 FF    IC  Nios2_NoDDR_inst|the_Nios2_NoDDR_clock_1|unxslave_write_requestxx3|d
  Info:     33.305      0.050 FF  CELL  Nios2_NoDDR:Nios2_NoDDR_inst|Nios2_NoDDR_clock_1:the_Nios2_NoDDR_clock_1|unxslave_write_requestxx3
  Info: 
  Info: Data Required Path:
  Info: 
  Info: Total (ns)  Incr (ns)     Type  Element
  Info: ==========  ========= ==  ====  ===================================
  Info:     30.064     30.064           latch edge time
  Info:     29.960     -0.104  R        clock network delay
  Info:     29.820     -0.140           clock uncertainty
  Info:     29.827      0.007     uTsu  Nios2_NoDDR:Nios2_NoDDR_inst|Nios2_NoDDR_clock_1:the_Nios2_NoDDR_clock_1|unxslave_write_requestxx3
  Info: 
  Info: Data Arrival Time  :    33.305
  Info: Data Required Time :    29.827
  Info: Slack              :    -3.478 (VIOLATED)
  Info: ===================================================================

Launch ClockがCPU clock,Latch clockがDDR controller IPが生成したPLLクロックである.Launch/Latchが逆のケースもあり,そもそも異なるclock domainの信号が交錯している段階で異常.特にCELL名から,WRITE要求信号がViolationしているので,ありえない.
FIFOによるclock分離部分のfalse_path設定やmulticycle_path設定忘れなどではないところに注意.無視してよいものと悪いものの判断ができるようになる必要がある.そのためには同期系回路はどのクロックで駆動されているのかを把握し,clock domain境界はどこにあり,そこはどうやって回避しているのかを把握しておくこと.
位相保障をしつつクロックを整数倍にしていれば,setup/hold条件を満足させることもできるだろう.本システムの場合,100MHzと133MHz(またはその半分)で駆動しているため,必ずエラーとなる.


ポート属性の認識誤り

port attribute に留意する.
特に外部portへの接続時に,inout属性を指定する必要のある端子がある.

.mem_clk_n_to_and_from_the_ddrsdram  (),
.mem_clk_to_and_from_the_ddrsdram    (),
.mem_dq_to_and_from_the_ddrsdram     (),
.mem_dqs_to_and_from_the_ddrsdram    (),

CLKが双方向にする必要というのが理解しきれていないが,cycloneとして必要という認識.
PLLにfeebackしているのかpair clockとして位相を合わせるのに使っているのか,documentを追いかけ切れていない.

DQはデータ信号なので双方向,DQSについては,データ送出側がドライブすることになるので,双方向である必要がある.
DDRになってから,driveするデバイスが入れ替わるようになったようなので,SDRAMだけの知識だけで挑んだのでミスった.

なお,DRAM系の情報としては,ELPIDAが公開している製品情報から教材となるPDFを得られる.和文documentが充実していて非常にありがたい.


失敗の具体例

dqsのポート設定を誤ってoutportとして接続したとき,Synthesisまで通ってしまった.
その後のTimingQuestによるtiming analysisで,TimeQuestがassertionでこけた.(QuartusII v8.1, WEB edition)
本件,属性違いに気づかずALTERA my supportにてSRを出してしまったが,Work Aroundとして"inout"にしてくださいといわれて気づいた.

HDLの仕様上,ポート接続時の属性チェックはなされない模様ですね.Tri-stateを考えると,出力同士が衝突してもおかしくないし,記述自体もinoutでぶら下げたりしてますからね...
そんなわけで,moduleを使うにはmoduleの動作概要の理解とinput/output/inout属性の確認,今回のように外部デバイスと接点がある場合も,その信号の意味等を理解しておくほうが無難です.
SOPC Builderはあくまでもサポートツールであり,その下にあるフレームを理解しなくては,自力でprojectを作り上げることすらできなさそうです.

*1 : 入力クロックにロックするが,位相差はできてしまう.

*2 : 同一クロックを用いない場合は,setup/hold条件を満たすようなクロックを生成する必要があるだろう.