2009/01/14(水)[HDL][Quartus II] constant function

[Quartus II][HDL]今日の不思議:constant functionが作れない?

状況

parameter化を行うため,カウンタに必要なビット数を得たいと考えた.同様のVHDL実装は,FPGAの部屋で紹介されていました.どこかで見かけたなぁと思ったら,Verilog2001-LRMの"constant function"の使い方として紹介されていました.

ところが,QuartusII v8.1(SOPC Builderのmodule登録時のAnalysis)にてsynthesisを試みたところ,エラーが出てきました.エラーはVerilog codeの中にコメントで記します.

妄想

function文が,constantを返すと認識していないようですねぇ.\QuartusIIの制限事項にでも記載されているのかしら(未確認).Verilog-2001対応のはずですよね...

とりあえずcounter変数をintegerとして逃げました.regでビット幅を指定すると,余計なレジスタを作らないので安心なのですが.integerならbit幅違いや定数のビット数指定が抜けてもwarningが出ないので見た目が気持ち良いというか何というか….

	parameter CLK_DIVIDER = 2 ;
	localparam CLK_DIVIDER_WIDTH = clogb2(CLK_DIVIDER) ;
	// Error: Error (10192):
	// Verilog HDL Defparam Statement error at avalonif_dai.v(49):
	// value for parameter "CLK_DIVIDER_WIDTH" must be constant expression File: ----


//////////////////////////////////////////////////////////////////////
// Verilog LRM "10.3.5 Use of constant functions"
//

// define the clogb2 function
  function integer clogb2;
    input depth;
    integer i,result;
    begin
      for (i = 0; 2 ** i < depth; i = i + 1)
        result = i + 1;
      clogb2 = result;
    end
  endfunction

参考(VHDLでのLOG2実装例)

ttp://www.opencores.org/cvsweb.cgi/~checkout~/AVR_Core/VHDL/AVRuCPackage.vhd?rev=1.1.1.4;content-type=text%2Fplain

勝手に持ってきたのでこっそりと(ぇ

-- Functions
function LOG2(Number : positive) return natural is
  variable Temp : positive := 1;
  begin
    if Number=1 then
      return 0;
    else
      for i in 1 to integer'high loop
        Temp := 2*Temp;
          if Temp>=Number then
            return i;
          end if;
      end loop;
    end if;
end LOG2;
-- End of functions

[MAVA] Avalon-ST interface仕様概要

2009/01/08FPGA::QuartusIIimport

[Altera][MAVA] Avalon-ST interface仕様概要

waveformは参照資料を見てください.WEBだけに頼るのは危険です:)

参照資料

"Avalon Interface Specifications" "Document Version: 1.1", "Document Date: October 2008", file:(mnl_avalon_spec.pdf) "6. Avalon Streaming Interfaces"

語彙

Avalon Streaming System

Avalon Streaming Systemは,1つ以上のAvalon-STコネクションを含むシステムです.Avalon-STコネクションは,sourceインタフェースから,sinkインタフェースへとデータを転送するものです.


Avalon Streaming Components

Avalon-STインタフェースを使う基本的なシステムは,コンポーネントと呼ばれる複数の機能モジュールを含みます.システムデザイナは,システムを実装するために,コンポーネントを設定・互いに接続します.

Source and Sink Interfaces and Connections

2つのコンポーネントを接続するとき,データはsource interfaceからsink interfaceに流れます.sinkインタフェースに接続されたsourceインタフェースの組み合わせは,接続(connection)として参照されます.

Backpressure

Backpressureは,sinkがsourceにデータ送信を停止するために通知できるようなメカニズムです.sinkは,基本的には,sinkのFIFOフルのときやsinkの出力ポートが停滞したときにデータの流れを止めるためにbackpressureを使います.
※backpressureはオプションです.

Transfers and Ready Cycles

転送(transfer)は,sourceインタフェースからsinkインタフェースへ伝播されるデータと制御のオペレーションです.データインタフェースでは,"ready cycle"は,sinkが転送可能な間のサイクルです.

Symbol

シンボルは,データの分割できない最小単位です.ほとんどのパケットインタフェースでは,シンボルはByte(バイトサイズ)です.1つ以上のシンボルが,1サイクル中に転送されるデータの1単位を構成します.

Channel

チャネル(channel)は,情報が2つのポート間を行き交うような,物理的または論理的なパスやリンクです.

Packet

パケット(packet)は,互いに転送されるデータと制御信号の集合です.パケットは,ルータを助けるためにヘッダを含むかもしれません.そして,他のネットワークデバイスは,正しい受けてにパケットを向けます(流します).パケットフォーマットは,アプリケーションにより定義されます.この仕様で定義されません.Avalon-STパケットは,可変長に定義できたり,コネクション間でインタリーブさせることもできます.Avalon-STインタフェースでは,パケットの使用はオプションです.



Signals~インタフェース信号("6.2.Avalon-ST Interface Signals")

Signal Type width DIR description
ready1sink->sourceHighでsinkがデータを受け取れることを示します.\サイクルN時にアサートした場合,"N+readyLatency"サイクルにsourceからdataを乗せてvalid信号が振ってくるでしょう.\backpressureを使うときは必須.readyの無いモジュールはbackpressure非対応(フロー制御なし)
valid1source->sinksourceがassertした場合,そのサイクルでデータが有効であることを示す.\valid信号が無ければ,毎サイクルごとのデータは有効である.
data1-256source->sinkバルクデータ.値の意味はアプリケーションに依存する
channel0-8source->sinkカレントサイクルの送信先チャネル番号を乗せる
error1-255source->sinkパラメタerrorDescriptorで定義するエラー情報

Packet Transfer Signals

startofpacket1source->sinkパケット転送の開始時に1クロックだけアサートされる
endofpacket1source->sinkパケット転送の最終クロックにアサートされる
empty0-8source->sinkEndOfpacketサイクル時に,無効なシンボル数を通知する.\1beatで1シンボル転送の場合は,使用されない.EOFサイクル以外は解釈しない(無効です)

Avalon-ST Interface Properties(6.3)

Namedefault value 有効範囲 description
dataBitsPerSymbol81-512シンボルあたりのビット数を定義する.Byte単位であれば8bitとなる
readyLatency00-8ready信号のassertion/deassertion間の関係を定義する
maxChannel00-255データインタフェースがサポート可能な最大チャネル数
errorDescriptor0list of string..error信号の各ビットに付随するエラーを示す語のリストです.\語数はエラー信号のビット数と同じでなければなりません.並び順に上位ビットに適用されます.\例えば,"crc,overflow"と記述した場合,bit[1]がCRC errorを,bit[0]がoverflow errorを示します.

6.4.Typical Data Transfers

6.5.Data Transfer without Backpressure

6.6.Data Transfer with Backpressure

ハンドシェーク方法(with "Backpressure")データ受信側が,ready(sink->source)をドライブする.アサートされていればデータを受け取れる状態にある.吐き出し側がデータを有し,受け側がreadyをアサートしていれば,チャネル番号,データ,エラー信号を乗せて,valid(source->sink)をアサートする.
アサートされていないときは,固定サイクルのレイテンシ待ちを入れるみたい??

同じ土管で,チャネル番号を設けることができるが,使用方法はアプリケーション依存である.

  • 例1:ポートナンバーとして使う
  • 例2:ページナンバーとして使う
  • 例3:timeslotインジケータとして使う

チャネル信号を使う場合は,各有効なサイクルにおけるデータ転送の全てが同じチャネルに属する.source(吐き出し側)は,成功した有効なサイクルで,異なるチャネルに変えるかもしれません.

"Backpressure"未使用のときは,souce側は"ready"信号をチェックしない.


6.7.Packet Data Transfers

前述のAvalon-STに加えて,下記の信号を要します."startofpacket","endofpacket","empty"信号が追加されます.いずれも source->sink です.

  • startofpacket
    パケット転送の開始タイミングを示します.
  • endofpacket
    パケット転送の終了タイミングを示します.
  • empty\endofpacketがアサートされたサイクルで参照する.複数シンボルを転送し,残りカスの数をのせる.(Specの絵を見たほうがわかりよいでしょう)



注意事項

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

2009/01/06(火)[SOPC] 長船さんのMMC/SPIインタフェース

はじめに

SPIコアのコメントで,長船さんからSDカードアクセスまで動作した実績のIPを開示いただいた.これをNEEKに組み込んでみようというネタ.

動作確認ができたのでクローズ.HDL開示は別記事にて予定...



問題発生

いただいたVHDLコードをとりこんで,SOPC Builderで論理合成をパス.しかし,Nios II IDEで作ったコードをダウンロード実行してもSDカードのIDLEへの遷移が確認できず(デバッガによるトレース).

実績のあるIPであることから,端子割付やタイミング設定が怪しまれる.ModelSimは,WEB editionだとVerilog-HDLとVHDLの混在シミュレーションができない*1

勉強もかねて,Verilog-HDLへの移植を行うこととした.


*1 : ModelSIM SE以上でないといけないハズ...?

やったこと/やってること/やろうとしていること

やったこと~1

  • 机上確認
    • Verilog移植\OK@6/Jan./2009\長船さんから公開していただいたSPI interface IPを元に移植.FatFSも最近のものへと置換した.\レジスタ初期化漏れをsimulationで検出し,修正済み.\(実使用上は問題ない.合成時にロジックが増えるかもしれないので,ゲート数削減のためにリセット時未初期化にしたのかもしれない.)\OK@7/Jan./2009\tclを手動編集:set_interface_property avalon_slave_0 addressSpan 1024\TOPレベルモジュールのport宣言でin/outを間違っていた.\Timeout検出用のカウンタ(FRC)の実装漏れ….あとで処理しようとして放置していた.ボケとる.
    • Simulation確認\たぶんOK@6/Jan./2009\制御レジスタへのアクセス,SCKtxdatレジスタの変化を確認できた.
    • ピンアサイン確認\SDまわり問題なしぽい.@1650訂正\TOP moduleにて,DI/DOを逆に接続していた.下表のようにまとめてみると間違いに気づけるわ….\本日実機を持ってきていないのでここまで.\参考:NEEKの端子一覧(まとめなおして移動するかも?)
SD pin symbol name Direction HSMC name HSMC pin FPGA pin name
CMD/DIHC_SD_CMDFPGA.outputHSMC_D3HSMC#44FPGA-L6
DAT/DOHC_SD_DATFPGA.inputHSMC_D5HSMC#48FPGA-M3
DAT3/CSHC_SD_DAT3FPGA.outputHSMC_D8HSMC#53FPGA-N8
CLKHC_SD_CLKFPGA.outputHSMC_TX_p8HSMC#101FPGA-M2

  • 実機確認
    • signal測定\レベル確認(アナログ),SCK確認,SDI確認(SD挿入時).(TxDataは0xFFなので変化しない)
    • タイミング確認(実時間)\\

何か出ているならロジアナで吸い上げてタイミングを確認する.

    • SD応答確認

期待通りならSDカードを取り替えたりして確認する.

やったこと~2

ModelSim(WebEdition)にて,タイミング確認.

  • DMA機能を使わず,SPI部のみを使った動作確認\→正常に動作した
  • DMA機能のステートマシンチェック\→シミュレーションレベルでは正常そう
  • DPRAMアクセス\write機能が無かったのでエイヤで実装した.\byte enableを使ってBYTEアクセスを許容し,write時にもDMA転送ができるように見越しても良いだろう.

最終日のオチ

  • Verilogへの移植の際に実装漏れ,実装ミスがあった.
  • MegaWizardで生成したDualport RAMブロックについても,出力段にレジスタを入れていたため,リードレイテンシ2でのCPU読み出しが成功するときとしないときがあった.\NiosII IDEから8bit/16bit/32bitアクセスを行った際に,連続・ステップ実行・Memory Dumpで読み出せる値が変化したことから明確になった.

※32bit接続のIPであっても,NiosIIのDynamicBUS sizing?により必要な値(BYTE)だけを正しく取得することができた.おそらくarbitorのあたりでうまいことやってるのだろう.



メモ

SPI/MMCインタフェースIPの移植

Avalon-MM I/Fの参考にさせていただきました.Quartus II 8.1の SOPC builderにある,Wizardを使ったりしながら再構築.tclファイルを作らせるために,Wizardを使ったほうが便利かもしれません(慣れればテキストのほうが早いか?).

当初はAvalon-MMの読み出しにレイテンシ2としていたのが不思議であったが,メモリセルのレイテンシであることが理解できた.レジスタリードについては,常にデコードしており,chipselect信号がアサートされればreaddataに正しい値が出力される.

レイテンシ0の場合って,前段のDDがアドレス・制御信号を出した次のクロックで出力をラッチするんですよね...アービタも通るし,配置制約として効いてきそうな気がしますねぇ.

動作としては,SDからリード時に,IP内のDPRAMへ指定ワード数だけデータ転送を行うIPでした.CPUのポーリング動作が要らないので便利そうです.
書き出しはCPU転送になっているようですが,現状読み出ししか考えて無いので問題なし.

拡張してAvalon-ST source portとしてデータクラスタだけ吐き出せると旨いかもしれないですね.ストリーミング再生時,CPUを介さずに音声なり動画なりを再生させることができそう.
まだまだ先の話ですがtp252_shock



モジュールのアドレス空間

offset symbol description
0statusSPIステータス,送受信データ(8bit)
1divideSPI clockに用いるmodule入力クロックの分周比(FofSCK = 入力周波数/divide/2)
2timerタイムアウト検出用ダウンカウンタ(module input clockで動作).0で止まる
3reserved0(予約/現実装ではstatusが見える)
4dmastatusDMAステータス
5~reserved[123](予約)
128~readbuff[128]DMA転送バッファ(現状読み出しのみ)

※offsetは,32bit word指定.CPUからのアドレスは x4して見える.※使用メモリ256Word = 1024Byte = 10bit

ビットフィールド

status(MMC IF status)
bit description mmc_spi.hシンボル
31-16const zero-
15割込み許可フラグ1:mmc_irq_enable
14-13const zero-
12MMC I/F FRCゼロフラグ1:mmc_zf_bitmask
11MMC-Write Protect1:mmc_wp_bitmask
10MMC-Card Detection1:mmc_cd_bitmask
9MMC I/F転送フラグ(0書き込みで転送開始要求)1:mmc_commexit / 0:mmc_commstart
8MMC Chip Select(Active Low)1:mmc_selnegete / 0:mmc_selassert
7-0MMC I/F受信データ8bitデータ.読み出し=RxData,書き込み=TxData(txdataのリードバック不可)
dmastatus
bit description mmc_spi.hシンボル
31-16const zero-
15DMA function IRQ enable bit(1:enable, 0:disable)mmc_dmairq_enable
14assert(0->1) when transfer-endsmmc_dmadone_bitmask
131:受信データエラー@SPImmc_dmade_bitmask
121:受信タイムアウト@SPImmc_dmato_bitmask
11const zero-
10w1:転送開始,r1:転送中/r0:転送終了mmc_dmastart
9const zero-
8-0転送バイト数-

[Altera][Q2HB] Quartus II Integrated Synthesis

2009/01/06FPGA::QuartusIIimport

[Altera][Q2HB] Quartus II Integrated Synthesis

参照資料

"Quartus II Handbook Version 8.1", "Volume 1: Design and Synthesis", "Section III. Synthesis"

Synthesis Options

Optionの設定方法

Synthesis Attributes
  • Synthesis Attributes in Verilog-1995 (Example 8–21.)
    // synthesis <attribute> [ = <value> ]
    または
    /* synthesis <attribute> [ = <value> ] */
    

※ALTERA IP CORE や SOPC Builderの自動生成は,Verilogの場合コレになる.

  • Synthesis Attributes in Verilog-2001 and SystemVerilog
    (* <attribute> [ = <value> ] *)
    
Synthesis Directives
// synthesis <directive> [ <value> ]
または
/* synthesis <directive> [ <value> ] */

また,注意書きとして,以下のように記述されているので注意されたい.

Verilog HDL is case-sensitive; therefore, all synthesis directives are also case-sensitive.


オプション

Ignore translate_off and synthesis_off Directives

//synthesis translate_off この区間の記述はシミュレーションのみに影響を与える.//synthesis translate_on

Read Comments as HDL

//synthesis read_comments_as_HDL on // この区間のコメントにある記述は,synthesis時のみに有効となる.// Quartus IIのみか?(ModelSimは無視しているし.目的はシミュレーション記述とビヘイビア?とを混在させるため.)//synthesis read_comments_as_HDL off



注意事項

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

2008/12/22(月)[QuartusII] WEB editionでJTAGクロックにremoval error

[QuartusII] WEB editionでJTAGクロックにremoval error

前回,[QuartusII] TimeQuestのaltera_reserved_tckのremoval errorということで,長船さんにコメントをいただいた件を検証してみた.
タイトルに答えを書いている気がしないでもないが...(汗;

Subscription Licenseが有効な場合

各種IPもライセンスvalidateされている状態なので,JTAG接続の必要は無い.
結果としては,SRからの回答もあったように,removal timing errorの発生も無い.
むしろ,altera_reserved_tckがclockとしてリストアップされない.Technology MapViewerにて,PostMapping後の該当回路周辺を見てみると,以下のようになっていた.

Q2_TMV_01.png

なんかaltera_internal_jtagのポートが記憶と異なる...


Subscription Licenseが無効な場合(WEB edition)

いわゆるWEB editionでも見てみた.

Q2_TMV_02.png

どうだろうか.赤枠で囲った3つのポートが増えていることがわかるだろう.

  • SHIFTUSER
  • CLKDRUSER
  • UPDATEUSER

timing errorを出していたのはこの余計な信号生成とかが絡んでいるせいと思われる.また,発生する条件も,これら追加された信号のあたりと推定するため,通常動作中には悪影響はなく,JTAG切断時やtime out時にタイミング違反となる可能性があるのかもしれない.

したがって,本件は問題ナシとしてcloseする.

この辺りを見てしまうと,NiosIIライセンスなしでQuartus II/SOPC Builderを使い続けるのは,色々とライセンス問題で泣かされそうな予感がしてくる.

評価に影響がないように... と考えるとあれか,30日の機能評価版を使えということか.WEBで情報が少ない理由はココにあるのかもしれないな...

儂はどう動くべきなんだろうかな.

Nios IIコアを捨てて,テキトウなCPUコアを持ってくるのも一つだろう.SOPC BuilderのGUIは捨てるのが惜しいので,Avalonシステムは継承したいところだな...

とりあえずもう少し何かカタチができるまでは続けよう...

いただいたIPを使ってファイルアクセスを試したいところですが,中間フォロー資料を先に作らせていただきたく.今週中には第一報を出します.*1

*1 : 期限切るのがお約束.でも,守れない期限を吐き捨てるのは見積もり誤り.