FC2カウンター FPGAの部屋 シミュレーション時とインプリメント時でのインクルードファイルの使い分け
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

シミュレーション時とインプリメント時でのインクルードファイルの使い分け

Verilog2001版DDR SDRAMコントローラーでDDRtest_verilog/DDRtest_synth フォルダにある ddr_cont_parameters.vh とDDRtest_verilog/simulation フォルダにある ddr_cont_parameters.vh の内容が違うのに気がつかれただろうか?
両者は MAX_INITIAL_COUNT_VAL の値だけが違っている。
DDRtest_verilog/DDRtest_synth フォルダにある ddr_cont_parameters.vh は

// 電源ONの時に200us間、ckeをlowにして、DQ,DQSをハイ・インピーダンスにする。そのためのカウンタ用の最大値
parameter MAX_INITIAL_COUNT_VAL = 11'b10011100010; // 1250


だが、DDRtest_verilog/simulation フォルダにある ddr_cont_parameters.vh は、

// 電源ONの時に200us間、ckeをlowにして、DQ,DQSをハイ・インピーダンスにする。そのためのカウンタ用の最大値(シミュレーション用に時間を極端に短縮してある。)
parameter MAX_INITIAL_COUNT_VAL = 11'b00000000100; // 4


になっている。
これは、本当はDDR SDRAM では、電源ONから 200us 後に初期化を始めなければならないが、シミュレーションでは 200us 待っていたら日が暮れてしまうので、それを大幅に短縮している。それをISEでのインプリメントに適用してしまうと、まずいため正規のインプリメント用 ddr_cont_parameters.vh を使用している。
こうするとシミュレーションとインプリメントでVerilogコードを書き換えなくてもすむので、インプリメントしてからシミュレーションをしても、ISEにインプリメント結果が残るというメリットがある。
  1. 2007年02月17日 05:44 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:9

コメント

ううむ。
parameter も立派な "Verilog HDL コード" なんすけど。
ってか、ISE が include の依存関係を扱える
作りになっていないのは、私は大いに不満です。

しかしまあ、コンパイラディレクティブの処理は、
ツール毎にそれぞれ癖があって、毎度どうするか悩みます。
-- この場合は、私ならカウント値を ifdef で切り替えるか、
-- レジスタ設定にでもしちまうかも。

蛇足ですけど、バイナリのリテラルは、
アンダースコアを入れてこのように書くと見やすいかもです。
11'b000_0000_0100
あるいは、わざわざ 10 進でコメントを入れるくらいなら、
11'd4
で ok っす。
  1. 2007/02/17(土) 14:06:33 |
  2. URL |
  3. hyotan #VWFaYlLU
  4. [ 編集 ]

こんにちは。

ifdefで切り替えるとVerilogソースを修正することになるので、再インプリメントになりませんか?
インプリメントに1時間以上かかる時に、シミュレーションのためにコードを変えて、再インプリメントしたくないだけです。ISEはGUIで使っているので。。。

レジスタ設定というのはどうするんですか?よろしければ教えてください。

どうもまだ、VHDL85の癖で _ 入れられないんです。。。
11'd?????? と書けるんでしたら、今度からそう書きます。
  1. 2007/02/17(土) 16:55:55 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コードを拝見してないんですけど、
include で parameter を取り込んでるなら、
切り替えればコードが変わるのは同じことかと。
インプリを再度やるかやらないかは、
ツールと設計者の都合だけの話で...
-- おっしゃりたいことはわかりますけど ^_^;

レジスタ設定と書いたのは、
RAM によってタイミングも違うこともあるだろうし、
いっそ、外から待ち時間などを設定できるような仕組みに
しちまう手もありかなあと漠然と思っただけっす。
-- そういう面倒なレジスタファイルの仕事が時々舞い込むもんで。

vhdl でも、リテラルの書き方は
87 <-> 93 で、いろいろと悩ましいですよねえ。
私も結局かなり保守的なコード書いてました。
2006 とかでは、とんでもなく変わるらしい...
  1. 2007/02/18(日) 02:07:33 |
  2. URL |
  3. hyotan #VWFaYlLU
  4. [ 編集 ]

>include で parameter を取り込んでるなら、
>切り替えればコードが変わるのは同じことかと。
これはディフォルトのインクルードフォルダをシミュレーションとインプリメントで変えることで、ifdefで切り替えるようにVerilogコードを書き換えなくてもOKということを目標にしています。

>レジスタ設定と書いたのは、
>RAM によってタイミングも違うこともあるだろうし、
>いっそ、外から待ち時間などを設定できるような仕組みに
>しちまう手もありかなあと漠然と思っただけっす。
了解です。
今回のDDR SDRAMコントローラもデータ幅などはインクルードファイルの値を変えることで変更できるようになっています。タイミングとかも変更できると良いですよね。これは簡単に出来そうです。下に書いたのがインクルードファイルの一部です。
// DDRのデータ幅を決めるパラメータ
parameter DDR_DATA_WIDTH = 16; // DDR SDRAMのデータ幅
parameter DDR_DQS_DM_WIDTH = DDR_DATA_WIDTH/8; // DDR SDRAMのDQSの幅
parameter INTERFACE_DATA_WIDTH = DDR_DATA_WIDTH*2; // DDR SDRAMのデータ幅の倍
parameter INTERFACE_MASK_WIDTH = INTERFACE_DATA_WIDTH/8; // BEの幅

>vhdl でも、リテラルの書き方は
>87 <-> 93 で、いろいろと悩ましいですよねえ。
>私も結局かなり保守的なコード書いてました。
>2006 とかでは、とんでもなく変わるらしい...
VHDL87でしたか、失礼しました。
VHDL93にすれば、Xも書けますが、最初VHDL87だったので、どうも心理的抵抗があります。
そうですか、2006でだいぶ替わるのですね。どう変わるか楽しみです。
  1. 2007/02/18(日) 05:51:59 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

蛇足ですんで適当に無視してください

> Verilogコードを書き換えなくてもOKということを目標に
include ってのは、コード中に "展開" されるわけで...
まあ、こだわるほどの問題じゃないですきっと ^_^;

> インクルードファイルの値を変えることで変更
変えれば、まあコードは別物です。
元々回路で変更可能なように組んでしまうという意味で、
"レジスタ設定" という例を出しました。
-- いえ、ただの雑音ですんで ^_^;

> VHDL93にすれば、Xも書けますが
最早構文の変遷を追いかけてませんが、
実は 87 でもそれなりに書けたんですよ。
ただし、リテラルが bit_vector で定義されているので、
std_logic_vector に使うにはいろいろ手間が必要でした。
今は昔のお話でした。
  1. 2007/02/18(日) 10:34:30 |
  2. URL |
  3. hyotan #VWFaYlLU
  4. [ 編集 ]

includeでの注意点

include での注意点ですが、相対パスなんかで記述する際、
記述したVerilog HDLファイル(*.v)からの相対パスにならない場合が
多いので注意してください。
多くのシミュレータ・合成ツールでは、プロジェクトファイル・リストファイル
からの相対パスになるようです。

どうしてかは、解りません。
LRMにも相対パスの場合の振る舞いは規定がなく、
過去に有名なベンダの製品がそうだったからでは...と
教えてもったことがあります(^^;

define も同じく注意!?が必要です。
基本的に全てのファイルに伝搬するようです。
こちらも、背景としてVerilog HDLにはもともとファイルという
概念が無く...みたいな昔話を聞いたことがあります。
  1. 2007/02/18(日) 19:27:44 |
  2. URL |
  3. ぽっぽファクトリー #rJwIuDc6
  4. [ 編集 ]

ぽっぽファクトリーさん、こんばんは。

アドバイスありがとうございます。
ModelSimはProject Compile Settingsに Include Directory... という項目があってインクルードファイルのフォルダを指定できるようです。ディフォルトはプロジェクトフォルダになっているようです。
ISEはブログでも説明しましたが、XSTのプロパティでインクルードファイルのフォルダを指定できます。こっちは指定してやらないとエラーになります。
  1. 2007/02/18(日) 21:06:32 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

そうですね。

私がハマッた例では、RTLシミュレーションとゲートシミュレーションで
同じテストベンチファイルを使いたくて、
別のディレクトリ階層のテストベンチを
「../../testbench.v」みたいに参照していたのですが、
その中で inculde していたファイルが
意図していたものと別の階層のファイルになってしまっていて、
「おかしいな」と悩んだことがありました。
  1. 2007/02/18(日) 21:47:17 |
  2. URL |
  3. ぽっぽファクトリー #-
  4. [ 編集 ]

了解です。
インクルードのパスに関しては、気をつけるように致します。

最も、そのほかの部分でいろいろつまらないミスをしています。そういうミスほど、なかなか見つからなくて、だいぶ悩んだ挙句あっさり解決というパターンになります。そういうときに胃が痛くなるんですよね。
  1. 2007/02/19(月) 04:59:14 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/419-b4df8e19
この記事にトラックバックする(FC2ブログユーザー)