Verilog覚書

2008/08/13Verilog::文法import

Verilog記述に関するメモ

Master Reference

OVI版 Verilog-LRM*1 http://www.vlsi-design.net/general/languages/verilog/

名称(IEEE-STD-1364-2001)で検索すると,まぁ,アレゲですが出てきますね.

*1 : Language Referenec Manual

Verilog Reserved Words


reference

参考にさせていただいたサイトをメモしておきます.検索するより便利か?(個人的なメモを兼ねて・・・

2008/08/12(火)[ISE] 久しぶりのHDL, WebPackISE, 初めてのFPGA

WebPackISE v10.1sp2上で, Verilog記述を行い, おもちゃを作ろうとしている.久しぶりにHDLに触れたのと, CPLDとは規模が違いすぎるので, 真面目に検証しておこうと思う.途中ツールの使い方や設計自体に問題がありそうなので, メモを記しておくことにする.

識者の方にツッコミを入れてもらえると非常にありがたい...

また, 検索したりアンサーを探したり, 本を見たりと参照先がややこしくなっているので,可能な限りリンクを貼って残したいと思います. リンク先が消える可能性もあるから,せめてローカルには保存しておきたいと思うけれども, blog形式だと管理が面倒ですよねぇ...とりあえず, FPGAの部屋のまとめサイトは外せなさそうです.ほかにもあるけれど, 今開いているページだけ貼っておきました.


タイミング制約(timing constraints)について

Synthesize - XST

ISEWebPackにて, Synthesisを行ってレポートを見る.なんだかタイミング間に合ってないような書き方されているが, Synthesisだけで判断しないほうがいいのかな.だんだんとイヤになってきたしw.

summaryは以下のとおり. 結果としてClockは127MHzまでokよと言われていると考えていいのだろうか.

Timing Summary:
---------------
Speed Grade: -4

   Minimum period: 7.824ns (Maximum Frequency: 127.815MHz)
   Minimum input arrival time before clock: 9.067ns
   Maximum output required time after clock: 11.857ns
   Maximum combinational path delay: 14.951ns

Detailを少し引用してみるが, この遅延が支配して, 上限が確定してしまっているように見受けられる. DCMで2逞倍にしたクロックで内部ロジックをまわしているのだけれども, 100MHz想定だからOK??配置配線完了すると, route timeとか logic timeに変動があるかもしれないけれど. setup time/hold timeを加味した上での値, と見ていいのかしらねぇ?

Timing constraint: Default period analysis for Clock 'CLKOUT_DCM1/CLKFX_BUF'
  Clock period: 7.824ns (frequency: 127.815MHz)
  Total number of paths / destination ports: 10190 / 330
 ....
  (4.609ns logic, 3.215ns route)

まぁ, こう書いてあることだし, とりあえず保留...

TIMING REPORT

NOTE: THESE TIMING NUMBERS ARE ONLY A SYNTHESIS ESTIMATE.
      FOR ACCURATE TIMING INFORMATION PLEASE REFER TO THE TRACE REPORT
      GENERATED AFTER PLACE-and-ROUTE.

Implement Design / Translate

Checking Constraint Associations...
WARNING:NgdBuild:1011 - The constraint <TIMESPEC TS_CLKOUT_DCM1_CLKFX_BUF_5 =
   PERIOD "CLKOUT_DCM1_CLKFX...> is overridden by the constraint <TIMESPEC
   TS_CLKOUT_DCM1_CLKFX_BUF_5 = PERIOD "CLKOUT_DCM1_CLKFX...>.
WARNING:NgdBuild:1011 - The constraint <TIMESPEC TS_CLKOUT_DCM1_CLKFX_BUF_5 =
   PERIOD "CLKOUT_DCM1_CLKFX...> is overridden by the constraint <TIMESPEC
   TS_CLKOUT_DCM1_CLKFX_BUF_5 = PERIOD "CLKOUT_DCM1_CLKFX...>.
WARNING:NgdBuild:1011 - The constraint <TIMESPEC TS_CLKOUT_DCM1_CLKFX_BUF_6 =
   PERIOD "CLKOUT_DCM1_CLKFX...> is overridden by the constraint <TIMESPEC
   TS_CLKOUT_DCM1_CLKFX_BUF_6 = PERIOD "CLKOUT_DCM1_CLKFX...>.
WARNING:NgdBuild:1011 - The constraint <TIMESPEC TS_CLKOUT_DCM1_CLKFX_BUF_6 =
   PERIOD "CLKOUT_DCM1_CLKFX...> is overridden by the constraint <TIMESPEC
   TS_CLKOUT_DCM1_CLKFX_BUF_6 = PERIOD "CLKOUT_DCM1_CLKFX...>.

検索した. 1011は場所かな? と判断して, メッセージ部分をAND指定すればOK. *1

アンサーに登録されている, 10.1 NGDBUILD - 制約の優先順位での問題というのが該当しそうだ. 抽出した部分, 長すぎてはしょられてしまっているので, 制約が読み取れないけれど...

しかし, ucfでは該当しそうな制約条件を記述していない. CLKFXは DCMの出力クロックだと思われる. FPGAの部屋では, DCM入力クロックの制約事項を記述しておけば, 出力クロックの制約を自動生成するようだ, と書かれていた.

少し気がかりだが, 致命的ではなさそうなのでおいておこう...



Place and Route Report

ここが気になる英文. 英語赤点できたのと, 仕事でも添削してもらわないと送れないレベルの儂惨状*2

WARNING:Route:455 - CLK Net:CLKFX_OUT may have excessive skew because 
      0 CLK pins and 2 NON_CLK pins failed to route using a CLK template.
=> ~は, 極端なスキューを持つ. NON_CLK pin2つがCLK temlateを使った配線で失敗している(?)

なんか調子悪そうにみえる... のだけれど.

大きすぎて引用をためらったが, ヘンにはしょるのもよろしくなさそうなので貼り付け.

Derived Constraint Report
Derived Constraints for TS_clk_in
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
|                               |   Period    |       Actual Period       |      Timing Errors        |      Paths Analyzed       |
|           Constraint          | Requirement |-------------+-------------|-------------+-------------|-------------+-------------|
|                               |             |   Direct    | Derivative  |   Direct    | Derivative  |   Direct    | Derivative  |
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
|TS_clk_in                      |     20.000ns|      4.972ns|     19.983ns|            0|            0|          336|        10214|
| TS_CLKOUT_DCM1_CLKFX_BUF      |      6.667ns|          N/A|          N/A|            0|            0|            0|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_0    |      6.667ns|          N/A|          N/A|            0|            0|            0|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_1    |      6.667ns|          N/A|          N/A|            0|            0|            0|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_2    |      6.667ns|      6.661ns|          N/A|            0|            0|        10214|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_3    |      6.667ns|          N/A|          N/A|            0|            0|            0|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_4    |      5.000ns|          N/A|          N/A|            0|            0|            0|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_5    |     10.000ns|          N/A|          N/A|            0|            0|            0|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_6    |     10.000ns|          N/A|          N/A|            0|            0|            0|            0|
| TS_CLKOUT_DCM1_CLKFX_BUF_7    |     10.000ns|          N/A|          N/A|            0|            0|            0|            0|
+-------------------------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+

おそらく自動生成された制約だろう. DCM入力50MHz(20nSec)に対して, x2の100MHz(10nSec)という制約が...

おかしいやん.. 6.6nSecとか5nSecて, 3倍4倍じゃね?しかも負荷ぶら下がってるし.見方が悪いのかナァ. それにしてもErrorの項はゼロだしなぁ...

動くものと信じて検証しておきますか. シミュレータでの確認がまだだったりします...

DCMのリセット

なひたふ先生のblogにて、Spartan3E DCMからクロックが出てこないというエントリがありました. DCMの使用例を探していてヒットしたのです.

ここにあるように, 入力クロックが心配であれば, DCMの出力が安定してなければ再度リセットを行うような回路を入れるべきという提案に賛同します.コメント欄で いくら先生も引っかかったようですので, 先人の経験をありがたく授受しようかと思います.

で, この回路は比較的簡単に実装できたので, module testの練習(思い出し)を兼ねて実施. XSTを使い, パターンをふって, 17mSec程度まわしたら アプリケーションが落ちた...しかもメモリをガメたまま. ファイルもロックしたまま. \(^o^)/

ModelSimだと遅いから, とりあえずの動作確認としてXSTを使ったのが敗因か?本気でHDLで遊ぶなら, Veritakの購入も考えたほうがいいのかしら...下手なゲームソフトを買うより安いものネェ. その上実用的だし:)



*1 : Design Summaryから飛ぼうとしてみつからへんとか言われる始末.

*2 : まさに惨状だな('A`;

本日の結論

reportの見方が判らないが, エラーとして明示されていないので, とりあえず疑問点を挙げて記録したから満足.検証を済ませてマイコンとの配線を済ませるつもりだったが全く進捗が無い. これはかなり厄介だ...

N:TMに途中成果を持っていけない臭いがぷんぷんするぜ...

2008/03/29(土)久しぶりにHDL

ALTERA

EPM7032VLC44, EPM7128ELC88を拾ってきたのだが、開発ツールが対応していない模様... orz Xilinxに戻るか...

Xilinx

WebPack ISEを使う. 不慣れだがやるしかない.

parameter文

`defineと違って、パラメタ化のために用いる。ただしmoduleの内側でないとだめぽい。一度ハマった... orz詳しいことは後日調べるとしよう。

補足:`defineだと、変数名の頭にアクサンが必要となる模様。ただしglobalな扱い。parameterはmodule内での宣言が必要 == includeで共通外部ファイルを拾ってくるとかしないと、ファイルをまたがって共通化できない。みたい。


例題

とりあえず作ったのはシリパラ変換。しょぼいw

module top(SCLK, SDI, SDO, SLAT, RST_N, PD);
  parameter DF_BIT_MSB = 28;
	input SCLK;
	input SDI;
	output SDO;
	reg SDO ;
	input SLAT;
	input RST_N;
	output [DF_BIT_MSB:0] PD;
	reg [DF_BIT_MSB:0] PD;
	reg [DF_BIT_MSB:0] DFF;


	always @ (posedge SCLK or negedge RST_N) begin
		if (RST_N == 1'b0) begin
			DFF <= 0;
			SDO <= 0;
		end else begin
			DFF <= DFF[DF_BIT_MSB-1:0],SDI;
			SDO <= DFF[DF_BIT_MSB] ;
		end
	end
	
	always @ (posedge SLAT or negedge RST_N) begin
		if (RST_N == 1'b0) begin
			PD <= 0;
		end else begin
			PD <= DFF;
		end
	end

endmodule

さらにadiaryネタ. pre記法は使いづらい. というか, エスケープの仕方や変換のされ方の理解が浅い. >|~|<を使うと、綺麗にpreタグをつかってくれる。>~<だと、変換プロセスが走るようだ。説明とレイが乗っていた気がするが、理解できてなかったようだな。実際に"こう使いたい"と、手を動かし、体で覚えていくしかないわ。何でもかんでもそうだな・・・。