[UG] DDR and DDR2 SDRAM High-Performance Controller User Guide

[SOPC][UG][IP] DDR_SDRAM_HP

refer to:"DDR and DDR2 SDRAM High-Performance Controller User Guide (ug_ddr_ddr2_sdram_hp.pdf)"

注意事項(document内部から場所を問わず抜粋)

論理合成時には,あらかじめTcl制約スクリプトを実行しておく必要がある.

_pin_assignments.tcl.


ライセンス制約

OpenCore Plus Evaluationの場合:
time-limited device programming fileを生成する.このため,"Tethered"または"Untethered"による実行となる.時間制限にのみ縛られる場合*1か,JTAGケーブルにより接続されている状態が維持されている必要があります.


Functional Description

Signals
Symbol説明
global_reset_n input)DDRSDRAMコントローラへの非同期リセット入力.全てのリセット信号は,この信号を同期化したものからなる.この信号がローレベルの間は,完全にALTMEMPHY megafunction(PLLも含む)をリセット状態にする.
pll_ref_clk (Input)PLLへのリファレンスクロック入力.
phy_clk (Output)megafunctionのユーザ向けシステムクロック.DDR high-performance controllerとの入出力信号は,このクロックに同期して行う必要がある.
reset_phy_clk_n (Output)ユーザへのリセット信号.この信号は,phy_clkクロックドメインに同期してアサート・デアサートされる.
aux_full_rate_clk (Output)ALTMEMPHY megafunctionがユーザに提供している代替クロック(alternative clock).このクロックは,外部メモリインタフェースのように常に同じ周波数で走ります.\half-rate modeでは,このクロックはphy_clkの2倍の周波数で,2x clockが必要なときはいつも使えます.\full-rate modeでは,このクロックはphy_clk信号と同じPLL出力で駆動されます.
aux_half_rate_clk (Output)ユーザ向け代替クロック.このクロックは常に外部メモリの半分の周波数で走っています.\フルレートモードのとき,このクロックはphy_clkの周波数の半分として使うことができます.例えば,half-rate bridge側に使うことができます.\ハーフレートモードのとき,このクロックはphy_clk信号のように,PLL出力と同じもので駆動されます.
dll_reference_clk (Output)外部でインスタンス化されるDLLに引き込まれる基準クロック.
reset_request_n (Output)PLL出力がロックしていないときに示すリセット要求信号.他のシステムレベルリセットコントローラへの入力の,リセット要求としてこの信号を使う.PLLがロックしていない間は,この信号は常にローレベルです.\コレを使うどんなリセット回路も,レベル検出よりは立下りエッジでリセット要求を検出すべきではない.(=レベルでやれ?)
soft_reset_n (Input)SOPC Builderのためのエッヂ検出リセット入力で,使用するか,他のシステムリセット回路によって制御される.この信号は,PHYに対して完全なリセットをアサートする要因となるが,PHYで使われているPLLには使われない.
oct_ctl_rs_value (Input)ALTMEMPHY信号は,シリアル終端の値を与えます.ALT_OCT megafunction出力"Seriesterminationcontrol"に接続されるべきです.
oct_ctl_rt_value (Input)ALTMEMPHY信号は,パラレル終端の値を与えます.ALT_OCT megafunction出力"Parallelterminationcontrol"に接続されるべきです.
dqs_delay_ctrl_import (Input)このALTMEMPHYインスタンス内で,他のALTMEMPHYインスタンスのDLLを使うことを許可します.DLLつきのALTMEMPHYインスタンスの外部ポートを,他のALTMEMPHYインスタンスの入力ポートへ接続してください.




Creating A Simulation Testbench Environment



*1 : この場合は全てのライセンスにおいてUntetheredもしくはライセンス有りである必要がある.

注意事項

英語力の弱い人が適当に訳して抜粋,補強しています.
あやしいな,と思ったらご指摘いただけますと幸いです.
なお,オリジナルの英文を参照されることを強く推奨いたします.

[Q2HB] PLL

[SOPC][IP] PLL

refer to:"Volume 5: Embedded Peripherals","Section VI. Clock Control Peripherals", "31. PLL Core"

Core Overview

Avalon-MM I/Fをもつ,Stratixシリーズ/Cycloneシリーズ搭載のオンチップPLLコアである.PLLコンポーネントは,Mega FunctionのALTPLLを用いており,ラッパーコアとなる.SOPC Builderから実装するメリットとしては,status/control signalをMMレジスタからアクセス・参照することができる.

用途は,システム全域のクロック生成・モジュールの一部に供給するクロックの生成,である.


Function Description

PLL Status and Control Signals

ALTPLL Mega Fuctionはパラメタライズされていることから,ステータス・コントロール信号は可変長となる.所望のステータス信号・コントロール信号をSOPC Builder systemモジュール外に出すことができる.排他的に,Avalon-MM レジスタ経由でアクセスができる.

設定方法は,Instantiating the Core in SOPC Builderを参照のこと.


System Reset Considerations

FPGAのコンフィレグレーションにおいて,PLLコアは自動的にリセットします.PLLに与えられたリセット回路は,SOPC Builder systemモジュール全域へのリリースを解除する前に,PLLがロックすることを保障します.

注:PLLをリセットすることは,関連するSOPC Builder system moduleをリセットします.


Instantiating the Core in SOPC Builder

PLLコアは,ALTPLL Mega Functionを用いています.MegaWizardインタフェースを用いて,ユーザがステータス・コントロール信号の接続を指定します.
"PLL Setting"にて,ALTPLL MegaWizardを起動します.ここで,[1]Parameter Settingの"Inputs/Lock"ページで,"Lock output"グループに, Create "locked" outputチェックボックスがあります.これにチェックを入れると,PLL lock状態の信号が,SOPC Buidlerシステムモジュールのtop level moduleに出力されます.

その後,"Interface Page"にて,それの信号を出力する先を選択することができます.(registerかexportか)


ALTPLL NameInput / OutputAvalon-MM PLL Wizard NameDefault BehaviorDescription
aresetinputPLL Reset Inputデバイスコンフィグレーション時のみPLL初期化PLLおよびシステムモジュールをリセットする
pllenainputPLL Enable Input常にenablePLLをenableにする信号..
pfdenainputPFD Enable Input位相-周波数検出器は有効検出器を有効にする.クロックリファレンスを切り替えるときに使う?
lockedoutputPLL Locked Output-入力クロックにPLLがロックしたときにアサートされる

※aresetは,PLLのみをリセットするのではなく,SOPC Builder system module全域をリセットします.


注意事項

英語力の弱い人が適当に訳して抜粋,補強しています.
あやしいな,と思ったらご指摘いただけますと幸いです.
なお,オリジナルの英文を参照されることを強く推奨いたします.

[MAVA] Avalon-MMの仕様

[Altera][MAVA]Avalon-MMの仕様

referto: mnl_avalon_spec.pdf

Signals

Avalonシステムでは,全ての信号はアクティブ-Highとなっている.postfixが"-n"と表記している信号は,アクティブ-Lowとして参照が可能な信号である.

基本的な信号
Signal TypeWidthDirDescription
read,read_n1In読み出し要求.アサートされていればreaddataを要求されている.
write,write_n1In書き込み要求.writedataが有効.
address1-32In当該I/Fのデータ幅を1としてアドレッシングされる.\'1'であっても,16bit幅なら2byte目,32bit幅なら4byte目相当となる
readdata8*2**N(N=0-7)Outslaveからmasterへ出力するデータ信号.
writedata8*2**N(N=0-7)Inmasterからslaveへ出力されるデータ信号.
byteenable,byteenable_n2**N(N=0-7)Inバイトレーンを指定する.\データ幅が複数バイトのときに,アサートされているビットに対応したバイト値が有効であることを示す.
begintransfer1Inwaitrequest信号にかかわらず,書く転送の最初のサイクルにアサートされる.
Wait-state信号
Signal TypeWidthDirDescription
waitrequest,waitrequest_n1Outread/write要求に応答できないときに,slaveによってアサートされる.アサートされたとき,slaveへの制御信号(begintransferとbeginbursttransferを除く)は値を維持する.\Avalon-MM slaveは,アイドルサイクルの間,waitrequestをアサートすべきです.\Avalon-MM master mayは,waitrequestがアサートされたときにトランザクションを初期化すべきです.\Avalon-MM slaveのデザインは,この可能性を考慮に入れなければなりません.

サンプルのチャートをみると,masterからのreadrequest/writerequestがアサートされたときに脊髄反射する必要があるみたい.コンポーネント自身がデータの準備ができていない場合に,デアサートしておいたほうが無難かもしれん.masterが常にwaitrequestを受けていても問題が無いかはわからんけど.

# 参照していないだろうし大丈夫かなぁ


Pipeline Signals
Signal TypeWidthDirDescription
readdatavalid,readdatavalid_n1Outパイプライン読み出し転送の可変長レイテンシに使われます.readdata信号が,前の読み出し要求に対する応答の有効なデータを含んでいることを示すために,slaveによってアサートされます.\readdatavalidを有するslaveは,要求を受けたそれぞれの読み出しサイクルのために,読み出しの受領とreaddatavalidのアサートの間に,この信号を1サイクル以上のレイテンシだけアサートする必要があります.

Burst Signals
Signal TypeWidthDirDescription
burstcount1-32Inburstの1サイクル目の間,burstcountはバースト転送回数を示します.burstcountのポート幅がNの場合,サイズ2**(N-1)の最大バースト数がエンコードできます.\burstcount信号は全体の転送に一定のままで残っています.(Figureでは1stサイクルだけなんだが)
beginbursttransfer1Inburst転送の開始のとき,burstの1サイクル目のためにアサートされます.\この信号はwaitrequestの値に関係なく,1サイクル後にデアサートされます.

Flow Control Signals
Signal TypeWidthDirDescription
readyfordata1Outペリフェラルがwrite転送準備を整えたことを示します.
dataavailable1Outペリフェラルがread転送準備を整えたことを示します.

Reset Signals
Signal TypeWidthDirDescription
resetrequest,resetrequest_n1OutペリフェラルにAvalon-MMシステム全体をリセットすることを許可します.システムリセット信号を生成するために,全てのリセット信号が互いにORされます.

Slave Interface Properties

NameDef.Value有効範囲説明
readLatency00-63読み出しレイテンシが固定の場合に使用されるレイテンシの値.\readdatavalid信号が含まれる場合は未使用となる.
writeWaitTime00-1000slaveがwriteを許容するまでのサイクル数を示す.タイミングは,slaveがwaitrequestをwriteWaitTimeサイクルだけアサートしたようになる.

waitrequest信号が含まれる場合は未使用となる.|

readWaitTime10-1000slaveがread応答するまでのサイクル数を示す.タイミングは,slaveがwaitrequestをreadWaitTimeサイクルだけアサートしたようになる.
maximumPendingRead Transactions11-64slaveによってqueueに入れることができる最大のread要求数.
burstOnBurstBoundariesOnlyfalsetrue/falseもしtrueにするならば,このインタフェースで提供されるburst転送が,burstサイズの倍数となるアドレスから始まることが保障される.\(使い手が保障するのか?よくわからん)
linewrapBurstsfalsetrue/falsetureの場合,slaveがインクリメンタルバーストに変えて,line wrapping burstを実装していることを示します.\wrapping burstについて,アドレスがburst境界に達したときに,下位のビットだけが,アドレシングに使用される必要があるように,以前のburst境界にラップバックします.\Ex.) burst境界が32byteで32bit幅のインタフェースがアドレス0x0Cにアクセスするwrapping burstは,次の順にアクセスを行う.(burst sizeより大きいビットは変化しないことに注意)\0xC, 0x10, 0x14, 0x18, 0x1C, 0x00, 0x04, 0x08
maxBurstSize164slaveが許容する最大burstサイズ
bridgesToMasternull同じコンポーネントのAvalon-MM masterslaveとmasterから構成され,特定のbyteまたはbytesを要求するslaveへのアクセスで,masterは同じbyteまたはbytesを要求するような特徴を持つAvalon-MMブリッヂ.
associatedClock--このslave I/Fが同期化するクロックインタフェース名.


注意事項

英語力の弱い人が適当に訳して抜粋,補強しています.
あやしいな,と思ったらご指摘いただけますと幸いです.
なお,オリジナルの英文を参照されることを強く推奨いたします.

2008/12/11(木)[FPGA][ModelSIM] シミュレーションとライセンス

[SOPC] Model-Simによるシミュレーション

設定~ModelSimのライセンス

最初のインストールでQuartusIIしか入れていなかったため,ModelSim AlteraEditionを入れる.ライセンスが無いといわれたので,その追加方法についてメモを残しておく.


SOPC Builderにて,[System Generation]タブのOptionグループの"Simulation. Create project simulator files."をcheckする.

  1. "Run Simulator"を押下するとModelSimが起動する模様.

(ModelSimのインストール,ライセンスの取得は必須である.)

QuartusIIの,メニュー"Tool"→ "License Setup.." → "WebLicense Update"ボタンを押下すると,ALTERAのサイトに接続しにいきます.ALTERA WEB SITEのアカウントを取得しておき,LOGINします.
ユーザ情報を確認した後に,"ModelSim WEB edition"のライセンスも必要か問うているチェックボックスがあるので,忘れずにチェックを入れておきます.ライセンスファイルはメールで送られてきますので,コレを任意のフォルダに保存して,LM license managerがそれを参照するように設定します.
ユーザによっては,すでにxilinxやLM license managerを使用する製品を利用されているかもしれません.

マイコンピュータ→(右クリック)→ property → "詳細徹底"タブ → "環境変数"ボタン → ユーザの環境変数またはシステム環境変数
ここを参照して,下記の変数の値を修正します.存在しなければ新規に作成します.
QuartusIIに限れば,Option Dialogにて,"Use LM_LICENSE_FILE"の指定ができるチェックボックスが存在します.
ModelSimにはソレが無いため,環境変数の設定が必須となります.
ライセンスファイルが存在しない場合は,ここで記すような解決策の定時をダイアログで受けることになるでしょう.


環境変数

MGLS_LICENSE_FILE
LM_LICENSE_FILE

複数のファイルや,ライセンスサーバ(@)を参照する場合は,セミコロン';'で区切ります.

設定が正しくできているかどうかは,スタートメニューからたどって,"ModelSim-Altera 6.3g_p1 (Quartus II 8.1)"を実行します.
コマンド待ち受け画面("transcript")が出てくるので,ここで"lmutil lmdiag"と入力します.出力例を以下に示します.(IPやNETBIOS名を'x'で塗り替えています)

>lmutil lmdiag

# 
# This license can be checked out
# -----------------------------------------------------
# 
# Enter <CR> to continue: "adwu" v1.31, vendor: armlmd
#   License server: xxxxxxxx
#   floating license no expiration date
# 
#   Requests from the same USER/HOST/DISPLAY do not consume a new license
# 
# This license can be checked out
# -----------------------------------------------------
# -----------------------------------------------------
# License file: 8224@xxxxxxxx
# -----------------------------------------------------
# -----------------------------------------------------
# License file: C:\altera\xxxxxxxxxxxx__0-xxxx3015308023.dat
# -----------------------------------------------------
# "quartus_lite" v2009.05, vendor: alterad
#   uncounted nodelocked license, locked to ethernet address "xxxxxxxxxxxx"  expires: 15-may-2009
# 
# This is the correct node for this node-locked license
# -----------------------------------------------------
# 
# Enter <CR> to continue: "alteramtiwe" v2009.05, vendor: mgcld
#   uncounted nodelocked license, locked to ethernet address "xxxxxxxxxxxx"  starts: 9-dec-2008,   expires: 15-may-2009
# 
# This is the correct node for this node-locked license
# -----------------------------------------------------
# -----------------------------------------------------
# License file: C:\altera\xxxxxxxxxxxx__0-xxxx42759966265.dat
# -----------------------------------------------------
# "quartus_lite" v2008.12, vendor: alterad
#   uncounted nodelocked license, locked to ethernet address "xxxxxxxxxxxx"  expires: 15-dec-2008
# 
# This is the correct node for this node-locked license
# -----------------------------------------------------

この例では,旧ファイルも残っているようで,複数のライセンスが見て取れます.
一部ライセンスサーバからも取得してきており,ADSのライセンスも見受けられます.(各種ツールの名称が並びますが,個々では無関係なので省略しました.)
ModelSimのライセンスは,"alteramtiwe"であると考えられます.QuartusIIは"quartus_lite"でしょう.これらの文字列が見えない,または,"License file: "で,取得したライセンスファイル名がない場合は,どこかの設定が誤っているか,設定終了後にアプリを起動していないのかもしれません.



[SOPC][ModelSim] 不定値伝播

気持ちよくシミュレーションを実行すると,不定値が伝播しており,testbenchモジュールで $stopコマンドが発令された.cpu coreのあたりで,ddr_sdramからの信号のようだ.タイミングはreset_nがネゲートされたあたりで,PLL unlock状態なのが問題のように思える.

現状は,system clockとddrclockの2系統があり,これらの安定化を待つようなシステムになっているのかは不明である.少なくともシミュレーションで不定値が伝播してきているので,下記のいずれかの問題が生じていると考えられる.

  • 自動生成されるテストベンチが不正
  • PLL lock状態までシステムをとめるような仕組みが存在しない\これはこれで問題な気がする.どこかのサンプルでPLLをSOPCからはずしていた理由はコレか...
  • シミュレーション実行において手順が抜け落ちている?\ALTERAセミナ資料どおりにやってるはず...

実機+JTAGがぶら下がっている状態では動いているので,PLL安定後は正常動作する模様です.
初期起動時の不安定性がシミュレーションにより予見されたということでしょうかね.

妄想レベルでの対策は,すべてのPLL出力が安定(lock信号がアサートされるまで)は,NiosIIシステム全体をリセット状態にしておくことですね.SOPC builderにより生成されたモジュールへのリセット信号が,本当の全域リセットと,PLLブロックへ入っている?リセットと区別されていることが条件になりますねぇ.もしくはPLLブロックをSOPC Builderから離して生成するか.そうなるとdynamicなclock制御ができなくなるか.
そんなことするのは当面先のことになるし,clock domain境界の処理をどうすべきかを検討する必要がありますが.クロック・モジュールリセットの集中管理が必須となってくるでしょうねぇ.そんなことできるかな...

LRM読解(Chap.11)

2008/12/10Verilog::文法import

11. 名前つきblockとtaskの無効化 ~ Disabling of named blocks and tasks

'disable'文は,Verilog HDLの手続き上の記述の構造化された本質を維持している間,併発してアクティブな手続きの実行(activity)を終了することに関する能力を与えます.

disable文は,taskの命令を全て実行する前に終了させることや,loop文からのbreakすることや,loop文のほかの反復とともに連続するため命令をスキップすること,のメカニズムを与えます.ハードウェア割込みやglobal resetのような例外状態をハンドリングするのに有用です.

disable_statement ::= (From Annex A - A.6.5)
    disable hierarchical_task_identifier ;
  | disable hierarchical_block_identifier ;

それぞれの様式のdisable文は,taskまたは名前付けされたブロックを終了します.処理は,blockに続く命令から,または,後のtask enabling文により再開します.また,名前つきblock内や,task内で有効になった,全ての活動(activities)は,終えられるものとします.

task enable文がネストしていて(1つのtaskがほかのtaskをenableにするような場合),一方が他方をまだenbaleにしていないならば,連鎖の中でtaskをdisableにすることは,下位の連鎖全てのtaskをdisableにすることである.

If task enable statements are nested that is, one task enables another,
 and that one enables yet another
  then disabling a task within the chain
   shall disable all tasks downward on the chain.

taskが1回以上enableにされるならば,そのようなtaskを無効にすることは,そのtaskの全ての起動が無効にされるものとします.(disableのqueingされたものが全て消える,という意味かしら??)

If a task is enabled more than once, then disabling such a task shall disable all activations of the task.

taskがdisableにされるなら,taskによって開始されるかもしれない以下の活動(activities)の結果は定義されません:

  • output引数とinout引数の結果
  • スケジューリングされたけれども実行されていないノンブロッキング代入
  • 手続き型連続代入(assign文とforce文)

disbale文は,disable文に含まれる,特殊なblockやtaskをdisableするのに,blockとtask内で使えます.disbale文は,function内の名前つきblockをdisableにすることができます.function内のdisable文があるところでは,blockかtaskをdisableにします.この挙動は未定義です.

automatic task中に,automatic taskまたはblockを無効化することは,タスクのすべての同時発生の実行のための通常のタスクのように続きます.(意味わからん)

Disabling an automatic task or a block inside an automatic task 
It proceeds as for regular tasks for all concurrent executions of the task.

例1) 本例は,blockが自身をdisableする方法を示します.

begin : block_name
  rega = regb;
  disable block_name;
  regc = rega; // この代入は実行されることはない.
end

例2) 本例は,disable文を,名前つきblockで,前方goto文と似たように使うことを示します(意訳).disable文の後の,次の命令文は,名前つきblockに続くものとなります.

begin : block_name
  ...
  ...
  if (a == 0)
    disable block_name;
  ...
end // 名前つきblockの終端
// 名前つきblockの後のコードから継続実行する
  ...

例3) この例は,taskからの早期returnのように使うdisable文を示します.しかし,diable文を使ってtask自身をdisableにすることは,プログラミング言語で見つけるようなreturn文のための速記(short-hand)ではありません.

task proc_a;
begin
  ...
  ...
  if (a == 0)
    disable proc_a; // trueであれば返る.
  ...
  ...
end
endtask

例4) この例は,C言語のcontinue/break文の2つと同じように使うdisable文を示します.例は,名前つきblockが,ループカウンタがnに達するまで繰り返すか,変数aがbの値にセットされるまで実行される,制御コードを示します.名前つきブロック"break"は,a==bになるまで実行するようなコードを含んでいます.このポイントでは,"disable break;"文が,blockの実行を終了します.名前つきブロック"continue"は,for loopのそれぞれの繰り返しを実行するコードを含んでいます.毎回,このコードは"disable continue;"命令をh実行し,"continue"blockを終了します.そして,次のfor loopの反復処理へ移ります.

"continue"blockの反復制御には,命令文セットは,a!=0であれば実行する.他の命令セットは,a!=bであれば実行する.(訳注:要はこの文だけ.)

begin : break
  for (i = 0; i < n; i = i+1) begin : continue
    @clk
      if (a == 0) // "continue" loop
        disable continue;
      <statements>
      <statements>
    @clk
      if (a == b) // "break" from loop
        disable break;
      <statements>
      <statements>
  end
end

例5) この例は,resetイベントが起きたときの,タイミング制御とtask"action"を同時実行を無効にするdisable文を示します.? being used to disable concurrently a sequence of timing controls and the task action, when the reset event occurs.

例は,"event_expr"と名づけられたシーケンシャルブロックと,イベント"reset"の発生を待つdisable文とから成るfork/join blockを示します.シーケンシャルブロックと,reset待ちとは,並行して実行します."event_expr"ブロックは,イベント"ev1"とイベント"trig"の三回の発生を待ちます.これら4つのイベントが生じて,さらに'd'時間単位経過したときに,task"action"が実行します.イベント"reset"がおきたとき,シーケンシャルブロック内のイベントにかかわらず,task"action"を含めて,fork/joinブロックは終了します.

fork
  begin : event_expr
    @ev1;
    repeat (3) @trig;
    #d action (areg, breg);
  end
  @reset disable event_expr;
join

例6) 次の例は,再トリガ可能な単安定のビヘイビア記述の例です.名前がつけられた"retrig"イベントは,単安定時間周期で再開します."retrig"が,250時間単位以内で起こり続けていると,Qは1となります.

always begin : monostable
  #250 q = 0;
end

always @retrig begin
  disable monostable;
  q = 1;
end


(個人的まとめ)
diable/continue文は,シミュレーションモデルで使うと効果的かもしれない.ハードウェア記述で使うのはナンセンスだろう.(合成できるかどうかも怪しいか. パラメータを使ってコンパイル時にのみインスタンスを複数生成することなんかには使えそう.)