SVA - SystemVerilog Assertion 概要?
はじめに
このエントリは結構前に書いたのですが内容が中途半端で意味不明だったので保留していたものです。が、ネタが無いので公開しておきます...
今更ですがSystemVerilogのスタディをコツコツはじめました。今回は、みんな大好きSVA(SystemVerilogAssertion)についてメモします。
SVAを構成する品々
SVAは、論理式(Boolean)、または、論理式を時系列に記述したシーケンス(Sequence)をプロパティ(Property)とし、assertディレクティブ(Directive)でアサーション化するものです(日本語、変ですね...osz)。 内訳はこんな感じです。
名前 | 例 | メモ |
---|---|---|
論理式 | req ack done | チェックする信号名と演算子を記述 |
シーケンス | req ##[*1:5] ack done | Booleanを時系列に記述 |
プロパティ | property(req ##[*1:5] ack => done) | Sequence因果関係を記述 |
ディレクティブ | assert property(req ##[*1:5] ack |=> done) | アサーション記述 |
Boolean
SVAの静的な条件式です。Verilogの論理式で記述します。
Sequence
Boolean(またはSequence)を時系列に組み合わせたものです。 [] (中カッコ)を使ってシーケンスの繰り返しを表現します。
メモ | |
---|---|
[*N] | N回の連続な繰り返し |
[*M:N] | M回以上、N回以下の繰り返し |
[=N] | N回の非連続な繰り返し。最後の事象発生後に事象が発生しない期間が続いてもよい |
[->N] | N回の非連続な繰り返しで、最後の事象発生で終了 |
Property
Sequence(Boolean)の因果関係を組み合わせてアサーションで確認したい条件式を作成します。
不思議な矢印(|=>、|->:Implication)を使ってアサーションの開始条件と、その後に期待する事後条件を書きます。
Implicationには2種類あります。
Implication | メモ |
---|---|
SEQ_A |=> SEQ_B | SEQ_A成立の1サイクル後のSEQ_Bが発生する |
SEQ_A |-> SEQ_B | SEQ_A成立と同じサイクルでSEQ_Bが発生する |
また、プロパティに記述するシーケンスの動作クロックの指定や名前を指定した部品化ができます。
property p_req_ack_done; @(posedge clk) req ##[*1:5] ack |=> done; endproperty
またパラメータ化ができます。
property p_req_ack_done_param(req_param, ack_param, done_param); @(posedge clk) req_param ##[*1:5] ack_param |=> done_param; endproperty
Directive
property記述はassertすることで実際のアサーション記述になります。
assert property @(posedge clk) req ##[*1:5] ack |=> done;
またはラベル名を付けたり、プロパティ名の指定もできます。
label_if : assert property (p_req_ack_done);
パラメータ化したプロパティの場合はこんなです。
label_if_param : assert property (p_req_ack_done_parm(req, ack, done));
アサーションの実行
アサーションはmodule内に記述して実行します。アサーションの記述形態は以下のようになるでしょか。
BIND記述はこんな感じです:
bind DUTモジュール名 アサーショモジュール名 バインド時のインスタンス名(接続)
コードだとこんな感じでしょうか(いろいろry)。
bind i_dut assert_module i_a_if1(.req(req), .ack(ack), .done(done));
今日はここまで
SVAアサーションの概要をメモしました。次回は具体例な記述など書いてみたいと思っています。きっと無理だな...osz
フレッツ光がつながらなかった
はじめに
もう昨年のことですが、突如フレッツ光が繋がらなくなり困ったことがありました。同様な症状の方を見つけられなかったこともありメモしておきます。
PR-S300SE がネットに繋がらない...
ウチはネットと電話とテレビをフレッツに頼っています。光終端装置はPR-S300SEであります。で、こいつがテレビだけを残して突如ネットと電話の機能を失ったわけです。
ご本尊の状態はこちらです。
確かにPPPと光でんわのLEDがが死んでおります。しかしながら映像出力は生きているわけで何とも不思議な状況であります。
ログ
光終端装置はルータ機能が生きているわけでしてリモートでログが確認できました。それがこちらになります。 PPPoE AC発見失敗 と 電話サーバ接続失敗(再施行中) が見えます。
発生日時 ログ 2014/12/11 06:40:04 PPPoE AC発見失敗 [メインセッション] 2014/12/11 06:37:05 電話サーバ接続失敗(再試行中) 2014/12/11 06:36:31 DHCPv6保存済み自動設定情報にて起動 2014/12/11 06:35:39 DHCPv4保存済み自動設定情報にて起動 2014/12/11 06:32:31 WANインタフェース リンクアップ 2014/12/11 06:32:30 LANインタフェース リンクアップ 2014/12/11 06:32:27 機器再起動 2014/12/10 19:06:42 PPPoE AC発見失敗 [IPv6セッション] 2014/12/10 18:58:37 自動バージョンアップ通知エラー 通信エラー 2014/12/10 18:54:44 PPPoE AC発見失敗 [メインセッション] 2014/12/10 18:52:06 電話サーバ接続失敗(再試行中) 2014/12/10 18:51:31 DHCPv6保存済み自動設定情報にて起動 2014/12/10 18:50:20 DHCPv4保存済み自動設定情報にて起動 2014/12/10 18:47:11 WANインタフェース リンクアップ 2014/12/10 18:47:10 LANインタフェース リンクアップ 2014/12/10 18:47:07 機器再起動 2014/12/10 14:51:34 自動バージョンアップ通知エラー 通信エラー 2014/12/10 13:18:30 DHCPv4リース時間満了 2014/12/10 09:36:54 PPPoE AC発見失敗 [メインセッション] 2014/12/10 09:29:16 PPPoE セッション開放 [メインセッション] 2014/12/10 09:18:30 DHCPv4アドレス取得 2014/12/10 09:17:07 PPP-IPCPの確立 [メインセッション] 2014/12/10 09:17:07 PPPの認証成功 [メインセッション] 2014/12/10 09:17:07 PPP-LCPの確立 [メインセッション] 2014/12/10 09:17:07 PPPoE セッション開始成功 [メインセッション] 2014/12/10 09:17:07 PPPoE AC発見成功 [メインセッション] 2014/12/10 05:39:07 PPPoE AC発見失敗 [メインセッション] 2014/12/10 05:36:19 電話サーバ接続失敗(再試行中) 2014/12/10 05:35:44 DHCPv6保存済み自動設定情報にて起動 2014/12/10 05:34:43 DHCPv4保存済み自動設定情報にて起動 2014/12/10 05:31:34 WANインタフェース リンクアップ 2014/12/10 05:31:33 LANインタフェース リンクアップ 2014/12/10 05:31:30 機器再起動 2014/12/10 04:57:53 PPPoE AC発見失敗 [メインセッション] 2014/12/10 04:54:27 PPPoE AC発見失敗 [セッション2] 2014/12/10 04:53:12 DHCPv6アドレス再取得(WEB操作) 2014/12/10 04:53:12 DHCPv4アドレス再取得(WEB操作) 2014/12/10 04:53:06 DHCPv6アドレス再取得(WEB操作) [IPv6 PPPoE] 2014/12/10 04:50:32 LANインタフェース リンクアップ 2014/12/10 04:50:21 LANインタフェース リンクダウン 2014/12/10 04:49:28 PPPoE AC発見失敗 [メインセッション] 2014/12/10 04:42:08 LANインタフェース リンクアップ 2014/12/10 04:41:57 LANインタフェース リンクダウン 2014/12/10 04:41:05 PPPoE AC発見失敗 [IPv6セッション]
NTTに電話
何度か再起動など試みましたがログ等状態は改善しませんでした。光でんわも死んでいるのでプロバイダ側の問題ではないと考えました。というわkでNTTに電話したら、即、工事の方に来ていただくことになりました。 ネットもイエ電話も使えない状況でも、携帯電話で連絡できるなんて、本当に良い時代になりましたです。
ルータ交換
NTTの工事の方いわく、問題の可能性はいくつかあるとのことでした。
- 外からの光ケーブルが死んでいる
- ルータが死んでいる
- その他
早速光ケーブルの確認から始まりましたが、こちらは問題無しでした。となるとルータがおかしいとなり、早速機器交換となりました。それがこちらになります。
PPP、ひかり電話とも問題なく接続確認できました。これで問題解決となります。 工事の方いわく、原因は良く分からない、とのことです。テレビだけ生きている状況は珍しいそうです。例えば、雷などでサージ電流が流れるとルータが逝かれてしまう、などとおっしゃっていました。あーそーですが、という感じでもあります。
今日はここまで
フレッツの調子がわるいときは躊躇せずにNTTに電話するのが吉です。こちらに責がなければ無料で交換してもらえますので。但し出張料のようなものは取られます...
今年は少しずつでもより多くのブログ更新ができるようがんばります。
ALTERAシミュレーションライブラリ作成
はじめに
ALTERAのライブラリを使ってシミュレーションするには事前にライブラリを作成する必要があることもあるかと思うのでメモしておきます。
シミュレーションライブラリの場所
インストールディレクトリの下のsim_libにあります。
C:\altera\バージョン名\quartus\eda\sim_lib
メンター大好きな人用ライブラリ作成
例えば、みんな大好きメンター用にMegaFunction用のライブラリを作成します。 先のsim_libの下にある、altera_mf.v、をコンパイルしてライブラリとします。
vlib -work altera_mf vlog -work altera_mf altera_mf.v vmap altera_mf D:/altera_lib/altera_mf
vmapでライブラリのエイリアスを作成します。これで、シミュレーション実行時に -L altera_mf と指定すればマッピング先のaltera_mfが使えます。
vsim [何かテストベンチモジュール名] -L altera_mf
vmapした内容はmodelsim.iniに保存されます。単にvmapを実行すると現在のライブラリのエイリアスが確認できますよ。
今日はここまで
altera_mfのライブラリを作っておけばsramとか使えると思います。他に必要なライブラリがあれば同様な手順で作成しましょう。
Programmatic Visio Generation - CellsSRC設定の関数化
はじめに
今回はCellsSRCの設定を関数化してみます。たいした内容ではありません。 予定していた、Visioファイル自動生成の目的、はまたの機会にします。
CellsSRCの設定おさらい
マクロの記録から得たVBAコードを元にIronPythonコードを書いたいました。 ページの余白設定するVBAコードはこんな感じでした。
Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesLeftMargin).FormulaU = "0 in" Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesRightMargin).FormulaU = "0 in" Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesTopMargin).FormulaU = "0 in" Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesBottomMargin).FormulaU = "0 in"
ここで、CellsSRCの引数の値はこんなでした。これらは、VBA上でDebug.Printして確認していました。
visSectionObjecti=1 visRowPrintProperties=25 visPrintPropertiesLeftMargin=0 visPrintPropertiesRighttMargin=1 visPrintPropertiesTopMargin=2 visPrintPropertiesBottomMargin=3
これをIronPythonで書くとこうでした。
# Prepare ActivePave Object as "page" clr.AddReference("Microsoft.Office.Interop.Visio") import Microsoft.Office.Interop.Visio IVisio = Microsoft.Office.Interop.Visio visapp = IVisio.ApplicationClass() doc = visapp.Documents.Add("") page = visapp.ActivePage # Set Page Margin page.PageSheet.CellsSRC(1, 25, 0).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 1).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 2).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 3).FormulaU = string_value
CellsSRC設定の関数化
これを関数化します。これで、CellsSRCの引数の値を気にせず設定処理ができます。
def set_page_margin(page, value): string_value = str(value) + " in" page.PageSheet.CellsSRC(1, 25, 0).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 1).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 2).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 3).FormulaU = string_value
将来役に立つかもしれないので、VBAコードとの対応をコメントに入れて完成とします。
## Set Page Margin # Reference VBA Code: # Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesLeftMargin).FormulaU = "0 in" # Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesRightMargin).FormulaU = "0 in" # Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesTopMargin).FormulaU = "0 in" # Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPrintProperties, visPrintPropertiesBottomMargin).FormulaU = "0 in" # where: # visSectionObjecti=1 # visRowPrintProperties=25 # visPrintPropertiesLeftMargin=0 # visPrintPropertiesRighttMargin=1 # visPrintPropertiesTopMargin=2 # visPrintPropertiesBottomMargin=3 # @param page ActivePage to be set the value # @param value Value in inch to be set to the ActivePage. Specify RAW value. def set_page_margin(page, value): string_value = str(value) + " in" page.PageSheet.CellsSRC(1, 25, 0).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 1).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 2).FormulaU = string_value page.PageSheet.CellsSRC(1, 25, 3).FormulaU = string_value
今日はここまで
こんな感じで自分の必要な設定をどんどん関数化していけるかと思います。ある程度たまったらライブラリ化していきたいかな、どうかな。
ブログを毎日更新するのは難しい...自分でやってみてわかること
はい先生! 分かりました! ゲスな自分には難しいです!
自分がよく記事を拝見するブロガーさんの方々のがんばりにはタダタダ尊敬してしまいます。 自分は週末にこつこつ更新することを目標に頑張ります。
Programmatic Visio Generation - CellsSRCの引数を確認
はじめに
IronPythonを用いたVisioファイル自動生成の3回目です。今回は設定したいプロパティとCellsSRCの引数との関係について書きます。
マクロの記録からリバースエンジニアリング
これまで書いてきたIronPythonからVisioファイルを操作するコード記述は、VBAのそれとそっくりさんです。VBAを知っている方でしたら、ActivePage、や、DrawRectangle、等にピンとくるかもしれません。このことからVisio上で設定したい処理を、マクロの記録、でVBAに変換すれば所望の処理のVBA記述が確認できる(ハズ)です。
マクロの記録
さっそくマクロの記録からのVBAコードを生成してみましょう。
まず『ファイル』-『オプション』から『開発モードで実行する』をチェックします。
これでリボンに『開発』タブが現れます。
『マクロの記録』を押したら適当な名前でマクロの記録を開始します。
VBAコードを見たい処理を行います。 例えば、『デザイン』タブから『ページ設定』-『ページのプロパティ』で『寸法の単位』を『インチ(10進法)』として『OK』を押下します。
その後、『開発』タブの『記録の終了』を押下してマクロの記録を終了します。
記録したマクロは『マクロ』で指定後『編集』を押せばコードが確認できます。
このようなコードが得られたと思います。
CellsSRCの引数確認
ページ設定の寸法をインチ指定した際に得られたVBAコードにはCellsSRCを含む行が2つあります。
Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPage, visPageScale).FormulaU = "1 in" Application.ActivePage.PageSheet.CellsSRC(visSectionObject, visRowPage, visPageDrawingScale).FormulaU = "1 in"
何やら詳細は不明ですが、右辺で "1 in"(1インチ)を指定していることからページ設定の寸法をインチ指定しているのでしょう。このCellsSRCに含まれる引数の文字列の値を確認できれば実際の引数の値が分かります。そこで、Debug.Print、を使って値を確認しましょう。 上記2行の後に、以下の2行を追加します。
Debug.Print visSectionObject, visRowPage, visPageScale Debug.Print visSectionObject, visRowPage, visPageDrawingScale
その後、『表示』から『イミディエイトウィンドウ』を選択してから、F5を押下してマクロを実行します。
画面下部のイミティエイトウィンドウにはDebug.PrintしたCellsSRCの引数の値が表示されます。
1 10 4
1 10 5
が得られました。 前回のIronPythonコードで記述したCellsSRCの引数の値と見比べましょう。
# ページ設定の寸法をインチに指定 page.PageSheet.CellsSRC(1, 10, 4).FormulaU = "1 in" page.PageSheet.CellsSRC(1, 10, 5).FormulaU = "1 in"
確かに一致していますね。めでたしめでたし。
今日はここまで
マクロの記録からリバースエンジニアリングすることで所望の設定に必要なCellsSRCの引数の値が確認できる話をしました。リバースエンジニアリング、といえば聞こえは良いですが残念な人がやる人海戦術みたいなものです。所望の設定に対応するCellsSRC一覧、のようなものが資料としてまとまっているなら教えてほしいところです...osz。
とはいえ、今回のやり方さえわかれば、あとはVisioファイル生成に必要な自分のやりたい処理をどんどんIronPythonに落としていけると思います。
次回は、自分がVisioファイル自動生成する目的を書こうかなと思っています。