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

[Q2HB] PIO Core

[Altera][Q2HB][IP] PIO Core

refer to:"Volume 5: Embedded Peripherals","Section I. Off-Chip Interface Peripherals","Chapter 9, PIO Core"


Function Description

各PIOコアは最大32のI/Oポートを提供します.マイクロプロセッサのようなインテリジェントホストが,Avalon-MMインタフェースのレジスタマップに対して読み書きすることで,PIOポートを制御します.ホストの制御下において,PIOコアは入力のデータを取り込んだり,データを出力(駆動)します.PIOポートがI/O端子に直接接続されるとき,ホストはPIOコアの制御レジスタに書き込むことで,Tri-stateにすることができます.

SOPC Builderで生成した場合には,ユーザに見える2つの仕様を持ちます.

  • MMインタフェース経由で見える,data,direction,interrupt-mask,edgecaptureレジスタ
  • 1~32のI/O port(FPGA内部への接続でも,FPGA外部端子への接続も可能です.)

Instantiating the PIO Core in SOPC Builder

Basic Settings
WidthI/Oポートの幅を指定します.1~32の値が設定できます.
Direction以下に示すテーブル(Direction Settings)から機能を選択します.
Output Port Reset Value出力ポートのリセット値を指定できます.正しい値の幅は,ポート幅に依存します.

Direction Settings

Bidirectional (tristate) portsこのモードでは,PIO bitはデータの駆動と取得のためにデバイス端子を共有します.各端子の方向は独立して選択可能です.FPGA I/Oをtrie-state状態にするには,directionは入力にします.
Input ports onlyこのモードでは,PIOポートは取り込み入力のみです.
Output ports onlyこのモードでは,PIOポートは出力駆動のみです.
Both input and output portsこのモードでは,入出力ポートのバスが分離し,n bitの端方向バスとなります.
Input Options

edge-captureとIRQ生成に関する指定を行います.Basic Settingsで,入力ポートが無ければ設定できません.

Edge Capture Register(作業中)

Interrupt(作業中)

Software Programming Model

ここで紹介するAPI・マクロは,"altera_avalon_pio_regs.h"をincludeすることで使えます.
baseは,scriptによる自動生成でシステムが作ってくれる.(定義されるファイルは"system.h")

書き込みマクロ

  • IOWR_ALTERA_AVALON_PIO_DATA(base, data)
  • IOWR_ALTERA_AVALON_PIO_DIRECTION(base, data)
  • IOWR_ALTERA_AVALON_PIO_IRQ_MASK(base, data)
  • IOWR_ALTERA_AVALON_PIO_EDGE_CAP(base, data)

読み出しマクロ

  • IORD_ALTERA_AVALON_PIO_DATA(base)
  • IORD_ALTERA_AVALON_PIO_DIRECTION(base)
  • IORD_ALTERA_AVALON_PIO_IRQ_MASK(base)
  • IORD_ALTERA_AVALON_PIO_EDGE_CAP(base)

アドレス計算マクロ

  • IOADDR_ALTERA_AVALON_PIO_DATA(base)
  • IOADDR_ALTERA_AVALON_PIO_DIRECTION(base)
  • IOADDR_ALTERA_AVALON_PIO_IRQ_MASK(base)
  • IOADDR_ALTERA_AVALON_PIO_EDGE_CAP(base)

# 方言"__builtin_ldwio"が入っているので,単純に(volatile*)(ADDR)で読み出せるのかは怪しい?

[Q2HB] Video Sync Generator

[Altera][Q2HB][IP] Video Sync Generator

refer to: "Volume 5: Embedded Peripherals", "Section IV. Peripherals", "23. Video Sync Generator and Pixel Converter Cores"

Core Overview

video sync generator coreはRGBフォーマットのピクセルデータの連続したストリームを許容し,適切なタイミングでoff-chipのDisplayコントローラにデータを出力します.

"pixel converter core"は,ピクセルデータをvideo sync generatorコアが要求するデータフォーマットに変換します.
(訳注:使用想定図を貼り付けましょう..)Avalon-MM経由でSG-DMAがデータを吸い上げ,Avalon-STとしてFIFOに吐き出し.FIFO(32bit)からPixel Converter(32bit->24bit)を経由して,DataFormatAdapterへ.そこで8bit x 3beatに変換されて,VideoSyncGenに流れ込む.


Instantiating the Core in SOPC Builder

Parameter
Horizontal Sync Pulse PixelsH-syncパルス幅をピクセル単位で指定する.
Total Vertical Scan Lines1videoフレームあたりの全ライン数を指定する.これには,(表示)行数・垂直Blankライン数・垂直フロントポーチライン数の和である.
Number of Rowsvideoフレームごとの有効なスキャンライン数を指定する.
Horizontal Sync Pulse PolarityH-syncパルスの極性を指定する.0:active low,1:active high
Horizontal Front Porch Pixels有効なピクセルの後ろに続く,ブランキングピクセルの数を指定する.この区間では,Avalon-ST sinkポートからLCDへのデータ出力ポートへのデータフローはない.
Vertical Sync Pulse PolarityV-syncパルスの極性を指定する.0:active low,1:active high
Vertical Sync Pulse LinesV-syncパルス幅を,行数で指定する.
Vertical Front Porch Lines有効なラインが後ろに続く,ブランキングライン数を指定します.この区間では,Avalon-ST sinkポートからLCDへのデータ出力ポートへのデータフローはない.
Number of Columns行ごとの有効なピクセル数を指定します.
Horizontal Blank Pixels有効なピクセルに先行する,ブランキングピクセルの数を指定します.この区間では,Avalon-ST sinkポートからLCDへのデータ出力ポートへのデータフローはない.
Total Horizontal Scan Pixels一行あたりのそうピクセル数を指定する.この値は,(有効な)列数・水平ブランキングピクセル数・水平フロントポートピクセル数の和となる.
Beats Per Pixel1ピクセルを転送するために必要なbeat数を指定します.有効な値は1か3です.このパラメタは,"Data Stream Bit Width"の倍数を乗じたときに,1ピクセルあたりの総ビット数に一致しなくてはならない.このパラメタは,以下の数式に示すように,動作クロック周波数に影響を与えます.\Operating clock frequency = (Beats per pixel) * (Pixel_rate)\ ただし, [bf:Pixel_rate (in MHz) = ((Total Horizontal Scan Pixels) * (Total Vertical Scan Lines) * (Display refresh rate in Hz))/1000000.}
Vertical Blank Lines有効な行に先行するブランキングライン数を指定します.
Data Stream Bit Width入力データ・出力データの幅
Signals

Global Signals

Signal NameWidth (Bits)DirectionDescription
clk1inputSystem Clock
reset1inputSystem Reset

Avalon-ST Signals

datavariableinput入力ピクセルデータ.データ幅は,パラメタ"Data Stream Bit Width"で定義される.
ready1outputこの信号は,VideoSyncGeneratorがピクセルデータの受信準備ができたときにアサートされます.
valid1inputAvalon-ST valid信号
sop1inputAvalon-STのStartOfPacket信号
eop1inputAvalon-STのEndOfPacket信号

LCD Output Signals

rgb_outvariableoutput表示データ.データ幅は,パラメタ"Data Stream Bit Width"で定義される.
hd1output水平同期パルス
vd1output垂直同期パルス
den1outputこの信号は,VideoSyncGeneratorコアが有効なデータを出力したときにアサートされる




注意事項

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

[Q2HB] Data Format Adapter(DFA)

[Altera][Q2HB] Data Format Adapter(DFA)

Component Overview

データ信号の定義が異なるインタフェースをハンドルします.このコンポーネントがよく用いられるのは,バス幅の適応です.例えば,2つの8bit/symbolのドライブインタフェースから,4つの8bit/symbolのドライブインタフェースへ変換します.

  • souceとsinkのsymbolあたりのbit数が異なるとき\接続はできません.
  • souceとsinkeの1beatあたりのシンボル数が異なるとき\sourceの幅から,sinkの幅へ変換します.\インタフェースが広いほうから狭いほうへの適合であれば,入力端におけるデータのbeatは,出力端におけるデータのbeatの倍数です.\単発のbeatにて,入力エラー信号がアサートされるとき,数倍のbeatのため,出力にアサートされます.
    \インタフェースが狭いほうから広いほうへの適合の場合,単発の出力beatを埋めるために,数倍の入力beatが要求されます.そして,出力エラーは入力エラーの論理和が出力されます.

Instantiating the Timing Adapter in SOPC Builder

入力インタフェースパラメタ(Input Interface Parameters)

Data Symbols Per Beat有効サイクルごとに転送されるシンボル数を入力します.
Include the empty signal"endofpacket"信号を含むサイクルが,emptyシンボルを含むことができるなら,Onにしてください.beatあたりのシンボル数が1であれば,この信号(訳注:empty)は不要です.

出力インタフェースパラメタ(Output Interface Parameters)

Data Symbols Per Beat有効サイクルごとに転送されるシンボル数を入力します.
Include the empty signal"endofpacket"信号を含むサイクルが,emptyシンボルを含むことができるなら,Onにしてください.beatあたりのシンボル数が1であれば,この信号(訳注:empty)は不要です.

入出力共通(Common to Input & Output)

Channel Signal Width (bits)"channel"信号の幅を入力します.4つのチャネルの幅は16チャネルまでです.チャネル信号の最大幅は8bitです.チャネルが未使用であれば,"0"(ゼロ)を入力してください.
Max Channelインタフェースがサポートするチャネルの最大数を入力します.有効な値は0~255です.
Include Packet Supportインタフェースが,"startofpacket","endofpacket","empty"信号を含むパケットプロトコルをサポートするならば,Onにしてください.
Error Signal Width (Bits)エラー信号の幅を入力してください.有効な値は0~31bitsです.未使用の場合は"0"(ゼロ)を入力してください.
Error Signal Descriptionエラービットごとの記述を入力してください.記述フィールドは,セミコロンによって分割されます.接続が作られるためには,sourceとsinkのエラービットの記述が合致しなければなりません.ビットが不整合とすることのできる適合については,12-9の"Error Adapter"を参照ください.
Data Bits Per Symbolシンボルあたりのビット数を入力してください.

生成されたHDLからの情報

24bit→8bitのAvalon-ST変換を行った.module宣言部は以下のようになっている.(以降,生成されたコードの空白・コメントは変更している可能性あり.)

module lcd_dfa_pc2vgen (
  // Interface: clk
  input              clk,
  input              reset_n,
  // Interface: in
  output reg         in_ready,
  input              in_valid,
  input      [23: 0] in_data,
  input              in_startofpacket,
  input              in_endofpacket,
  input      [ 1: 0] in_empty,
  // Interface: out
  input              out_ready,
  output reg         out_valid,
  output reg [ 7: 0] out_data,
  output reg         out_startofpacket,
  output reg         out_endofpacket,
  output reg         out_empty
);

ざっとみたところ,Interface入力は全てDFFで受けて,その信号をロジックで参照してステートマシンを蹴っているように見える.また,入力データのempty信号も参照し,(この場合は)3beat→1beatへの変換を行っている.入力が24bit(8bit x 3/beat)できたものを,8bit(8bit x 1/beat x 3)へ変換する.
→クロックは特に変化せず,変わるのはデータレートのみ. 入力インタフェースで,Sourceに対してNot Readyを示し,フロー制御を行う.




注意事項

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