« 2010年10月 | トップページ | 2010年12月 »

2010年11月の3件の記事

【SystemC】 cannot have more than one driverエラー

SystemCでバスのモデルを書いてみました。Read/Write Enable信号とアドレスバスはバスマスター側からドライブするから良いのだけど、データバスは双方向からドライブする必要がある。そこでsc_inoutを使って入出力ポートを指定してみました。

SC_MODULE(MOD1) {
    sc_inout<sc_uint<32> > DATA;
};

SC_MODULE(MOD2) {
    sc_signal<sc_uint<32> > DATA;
};

こんな感じにモジュールを作成して、ポートを接続すると、MOD1とMOD2の両方から駆動する事になります。

すると...ラインタイムエラーが...正確なメッセージは忘れたけど

*** signal cannot have more than one driver.

つまり、sc_signalには単一のドライバしか接続できないっちゅー事です。
バスって事はRead/Write Enable信号で切り替えるわけやから同時ドライブする事はないのやけど、SystemCのシミュレーション環境では1回のシミュレーション内でシグナルを複数プロセスからドライブする事が許されていないらしい。しかもこれ、SytemC 2.1.0までは許可されていたそうな。つまりSystemC 2.2.0での現象らしいですわ。

さて、困ったぞ。本来はバスプロトコルを変更して対応すべきなんやけど、別に論理合成するわけでもないし、単にアーキテクチャの検討したいだけなんやけどなぁ。

結論から言うとなんと環境変数の設定で、このチェックを外せるらしい。
SystemC 2.2.0のnoteに書かれていました。

set SC_SIGNAL_WRITE_CHECK=DISABLE

とやってビルドしたバイナリを実行したら無事に動作しました。ちなみに大文字でなければダメでした。いやはや、まさか環境変数とはね。

【Windows】 VisualStudio 2010 でコンソールアプリの実行中断ができない

いやはや、VisualStudioなんて随分ご無沙汰。Visual BasicやらVisual C++やら昔は色々と触ったもんやけどねぇ。

SystemCを使った回路シミュレーションをやろうとしたら、Windows環境ではVisual C++がサポートされていたみたい。Cygwinでも良いんやけど、この際なんでVisualStudio 2010 Express入れてみました。
SystemCのアプリは大抵コンソールアプリとして作るんやけど、ここで問題が発生。
デバッガでソースコードをトレースしている途中に、バグの原因が分かったのでコード修正するために実行中断をしたわけです。にも関わらず何故かコンソールウィンドウが残ってしまっている。
タスクマネージャから強制終了しようと思ったら、なんとプロセスリストにも出てこないのだ。

どうしたものかと調べてみた所、これはどうやらマイクロソフトのバグらしい。プロセスの特権が昇格されてしまうとの情報が。そうか、特権レベルで動いてしまうからユーザレベルからプロセスを止められないのか...。

Visual Studio では、Windows XP を実行しているコンピューター上でアプリケーションのデバッグを停止した後、アプリケーションのコンソール ウィンドウを閉じることはできません。

http://support.microsoft.com/kb/982551/

結局、978037のセキュリティ更新プログラムをインストールする事が対策のようです。

無事解決しました。

(2011/01/04追記)

訂正事項です。

完全に誤解を招く書き方をしていましたが、978037のセキュリティ更新プログラムをインストールする事は対策ではなく原因です。で、978037の情報ページに本件の対策パッチがリリースされているので、それを適用する事が解決方法になります。このパッチは正式なバージョンではないためダウンロードにはメールアドレス等の登録が必要です。

発生条件はWindows XP SP2 or SP3で978037のパッチをインストールしている事のようです。逆にこのセキュリティ更新プログラムをアンインストールしても良いのやけどね。

【C++】 VisualStudio 2010 でのsnprintf関数

snprintfを使っていてgccでは普通にビルド出来てたプログラムをVisualStudio 2010でビルドしたら snprintf 関数が定義されていないってエラーになりました。
「あ〜、ヘッダファイルのinclude忘れか」
と思いきや、vectorコンテナを使ってるからstdio.hもincludeされてるなぁ。
うん、明示的にincludeしても変わらん。

標準関数なのになぜ〜と思って stdio.h を覗いてみると...
なんかsnprintfが無いっぽい。

そうなんですなぁ。理由はなぜだか知らんけど、VisualStudioについている標準ライブラリではsnprintfはサポートしていないみたいです。(セキュリティの関係でいくつかの関数が無くなったとは聞いた事があるのやけど、snprintfやからなぁ...理由がわからん)
似たような名前の関数が色々あるのやけど、とりあえずこういう時は処理系依存の関数の定番

_snprintf

を使う事にして解決。
実際には共通ヘッダファイルで

#define snprintf    _snprintf

としましたダ。
ふぅ...

« 2010年10月 | トップページ | 2010年12月 »