Verilog の Specify チートシート のバックアップ差分(No.2)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[公開メモ]]

* 概要 Specify チートシート [#d2271aa3]

http://verilog.renerta.com/source/vrg00052.htm

を元に。

* Specify の書き方 [#k91713ff]

 LANG:verilog
 module ...
   ...
   specify
     ...
 
   endspecify
   ...
 endmodule

の形で module 内に specify ブロックを作成し、
モジュール内の信号同士の間のディレイを規定する。

文法は以下に示すとおり。
** 各種関数 [#m1b49aec]

* パスの宣言 [#m86b7bea]
影付きの部分にかかるとエラーになる。

&ref(timing-check-tasks.png);

- $setup(tested_event, reference_event, limit[, notifier])
- $skew(reference_event, tested_event, limit[, notifier])
- $hold(reference_event, tested_event, limit[, notifier])
- $recovery(reference_event, tested_event, limit[, notifier])
- $setuphold(reference_event, tested_event, setup_limit, hold_limit[, notifier])
- $width(reference_event, limit, threshold [,notifier])
- $period(reference_event, limit[,notifier])
- $nochange(reference_event, data_event, start_edge_offset, end_edge_offset [,notifier])

以下注釈。

- limit の単位は `timescale の第1引数
-- `timescale 10ns / 10ps ならば 10ns の何倍かで指定する
- reference_event に &&& で条件を付けられる
-- 例えば posedge clk &&& !rst とすれば !rst の時に限りチェックされる
- width における tested_event は reference_event の逆エッジ
- period における tested_event は reference_event と同じイベント
- notifier に reg を指定すると、エラー時に 1 が代入される
-- ゼロで初期化しておく

** パスの宣言 [#m86b7bea]

 LANG:verilog
 specify
   (In1 => Out1) = (10);
 endspecify
 
 specify
   specparam TRise = 10, TFall = 15;
   (In2 => Out2) = (TRise, TFall) ;
 endspecify

- 入力 In1 から Out1 への遅延が単位時間の10倍
- 入力 In2 から Out2 への遅延が rise, fall 別に単位時間の10倍, 15倍

* $setup(tested_event, reference_event, limit[, notifier]) [#n1a37909]

 LANG:verilog
 specify
   $setup(data, posedge clk, 5);
 endspecify

- posedge clk の前 limit より前に data が確定していることを確認する
- posedge clk の前 limit の期間に data が変化したら失敗する
- posedge clk と同時に data が変化するのは問題ない

* $skew(reference_event, tested_event, limit[, notifier]) [#k8f50d42]

$skew checks the following:

- tested_event と reference_event がほぼ同時に起きていることを確認する
- limit 以上離れて起きたら失敗

* $hold(reference_event, tested_event, limit[, notifier]) [#vf812997]

 LANG:verilog
 specify
   $hold(data, posedge clk, 5);
 endspecify

- posedge clk の後 limit が立つまで data が変化しないことを検証する
- 同時に変化するのもダメ

* $recovery(reference_event, tested_event, limit[, notifier]) [#a77fdce9]

- data が変化するのが posedge の後 limit 以内の期間のみであることを確認する
- limit 以上離れてから data が変化したらダメ
(time of data event) - (time of reference event) < limit

* $setuphold(reference_event, tested_event, setup_limit, hold_limit[, notifier]) [#a5df0775]

* $width(reference_event, limit, threshold [,notifier]) [#s55f8f49]

 LANG:verilog
 $width(posedge data, limit, threshold)

- posedge data から negedge data までの幅が limit 以上 threshold 以下であることを検証する

* $period(reference_event, limit[,notifier]) [#i46623b0]

- reference_event 間の間隔が limit 以上であることを検証する

* $nochange(reference_event, data_event, start_edge_offset, end_edge_offset [,notifier]) [#t3166155]

- よくわからない


Counter: 9288 (from 2010/06/03), today: 2, yesterday: 2