- 締切済み
Verilog_HDLでのdefineとifdef
yahooやgoogleで念入りに調べたつもりですが、自分の求めているようなHPは見つからなかったので、こちらの掲示板に記載させて頂きます。 すみませんが、誰かVerilog_HDLに詳しい方ご教授願いますでしょうか。 (1)「define」と「parameter」の用途の違いについて。 (2)「`ifdef」文と「if」文の用途の違いについて。 (3)「ifdef」の"def"は「define」の意味でしょうか。 -「define」の意の場合、「`ifdef <define_name>」のように<>の記述はdefineで定義された変数しか使用できないのでしょうか。 (4)下記例のように"test1/2"に定義値を持たせない場合は、どのようにして"test1/2"に値をアサインすれば宜しいのでしょうか。 サンプル記述例) `define test1 //定義値なしのdefine `define test2 `ifdef test1 //test1を真・偽させたい。 ------ `elsif test2 //test2を真・偽させたい。 ------ `endif (5)「ifdef」や「task」は、合成目的ではないテストベンチ等に使用するものと思っていましたが、「ifdef」や「task」を用いて組み合わせ回路等を開発したりするのでしょうか。 以上です。 すみませんが何方か宜しくお願いします。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- coredump
- ベストアンサー率46% (12/26)
もうすっかりverilog忘れてますが、一つだけ。 defineとparameterは似ていると言えば似てますが、parameterは そのモジュールをインスタンス化するモジュール側でparameterの 値を変更できる点でdefineと異なっていたと思います。 この機能がなければparameterの価値は無いでしょうし。 ではでは。
- lachesis-r
- ベストアンサー率56% (28/50)
簡単かどうかの議論なのですか?? 結論は見えていると思いますが、ifdefを使いたいならdefine定義をコメントアウトするしかありません。 ifdefというのは単にプロジェクトを管理する為のオプション的な存在で、条件分岐する、というものとは違います。 あくまでもコンパイル時に決定されるものです。 ここでは、他でもないあなた自身が予めコンペア結果を知っていてそれをコンパイラに教えている、という意味ですが、それはコンペアをさせている、ということにはなりませんよね?
- lachesis-r
- ベストアンサー率56% (28/50)
2です。失礼しました。 試しに「入門verilogHDL記述」「わかるVerilogHDL入門」(CQ出版社)2冊を見てみましたが「とりあえず」説明はありますね。 わかりやすいかどうかはわかりませんが。 嫌味を言うようですが、2冊の書籍を読んでいるにしては今までの質問内容は「何にも判ってないヒト」ですよ。 ----------------------------- `define ERROR //------(1) `ifdef ERROR $display("compare error"); `else $display("compare match"); `endif ------------------------ の、`else節を有効にしたいなら、 (1)の行をコメントアウトすればいい・・・・ということが聞きたいんじゃあ、ないですよね・・・・ 察するに、なんらかのコンペア結果が一致するかどうかを表示させたいんですよね? 一致フラグを例えば reg comp_res; としておいて、(実動作中にコンペアに応じて)comp_resに値を代入し、 if(comp_res) $display("compare error"); else $display("compare match"); としたいんじゃないですか?
- zwi
- ベストアンサー率56% (730/1282)
>define AAA 1 >define BBB 1 >#ifdef AAA ><プログラム1> >#elsifdef BBB ← こういう意味ですよね。 ><プログラム2> >#endif 実際にはC言語には#elsifdefは無いのですが、もしあったとしたらという意味で書きます。 #ifdef AAAがelseにならない限り#elseifdef BBBは処理されませんので、<プログラム2>はコンパイル対象にはなりません。
お礼
ありがとうございました。 C言語とverilogでは若干異なるみたいですね。 参考になりました。
- lachesis-r
- ベストアンサー率56% (28/50)
回答者2です。 失礼ながら、もう少し基本の勉強をされた方がよろしいと思います。 お金と手間を惜しんではいけません。 参考書を少なくとも2~3冊は買って読みましょう。絶対損にはなりません。 verilogの `defeine、Cの#define はほぼ同じ働きをするもので コンパイラディレクティブといいます。 この文法は、コンパイル時に決定されますので、シミュレーション実行中や回路動作中に'define定義の値を変えることはできません。 `ifdefを使って動作を条件分岐させようなどと考えないことです。 ifを使いましょう。そのためにifがあるのですから。 `ifdef DEF_A を日本語っぽく解釈するなら 「(コンパイル時に)DEF_A が定義されていたら」です。従ってDEF_Aの値は一切関係なく、兎に角定義されていれば真になります。
補足
参考書は2冊所持しております。 ですが「ifdef」について詳しい記載はありませんでした。 質問事項を要約させて頂きます。 `define ERROR `ifdef ERROR $display("compare error"); `else $display("compare match"); `endif こちらを実現させたいのですが、どうしたら`elseを実行出来るのでしょうか。 それとも、この記述では不可能なのでしょうか。
- zwi
- ベストアンサー率56% (730/1282)
1)すみませんが、C言語をあまり理解しておりません。C言語では#defineはどのような機能なのでしょうか。 C言語の#defineで定義された値は、コンパイル時にソースコードの置き換えや#ifdef文での条件判断にのみ使われます。 #define AAA 1 と定義すると if( aa == AAA ) は if( aa == 1 ) と書かれているとみなされてコンパイルされます。 それと #ifdef AAA <プログラム1> #else <プログラム2> #endif とすると<プログラム1>はコンパイル対象ですが、<プログラム2>はコンパイルの対象外となります。 (4)説明が下手ですみません。「`ifdef <define_name>」の場合、define定義で値を設定してしまうと、条件文として成り立たないので、< define_name>が保有している値を"1"、"0"と変化するようにしたいのです。 こちらはよく意味が分かりません。verilogを使い込んでいないので、こちらが勘違いしている部分があるのかも。申し訳ないです。
補足
ご回答ありがとうございます。 お蔭様でC言語での#defineは理解できました。 ちょっと疑問に思った点もあるので教えて貰っても宜しいでしょうか。 define AAA 1 define BBB 1 #ifdef AAA <プログラム1> #else BBB <プログラム2> #endif この場合は<プログラム2>もコンパイル対象かと思うのですが <プログラム2>が実行されることはあるのでしょうか。 すみませんが宜しくお願いします。
- lachesis-r
- ベストアンサー率56% (28/50)
質問の数が多すぎます・・・・本当に聞きたい事に重点を絞った方がよいかと。 (1)あまり違いはないのではないかと思います。 強いてあげれば、parameterはbit幅を指定しない場合、32biとして扱われます。従って、 parameter param_A=5; assign a[7:0]= param_A; などとやるとコンパイラによってはwarningを出しますし、LSIにするときは、右辺と左辺のbit幅を合わせるようにベンダは強く推奨しますので非常に鬱陶しい事になります。 また、シミュレータの多くは defineディレクティブ をコマンドラインで差し替えられますが、parameterにはこの芸当は使えません。 (2)違いすぎます!僅かでも似ていますか? (3)意味が不明です (4)これも意味が理解しかねますが、 `define test1 100 などとすればよいのではないですか? (5) `ifdef DEF_A ----ここに書かれている内容はDEF_Aが定義されていれば合成されます-- `endif となり、define次第で論理合成されたりされなかったりしますが・・ また、task文もfunctionと同じで論理合成できます。 (もっとも、論理合成できないような記述を書いてはイケマセン)
補足
ご回答ありがとうございます。 質問事項が多すぎてすみません。 (2)ifdef文ですが、ifdefでもレジスタを生成できたので、用途の違いに疑問を抱きました。 (3)「ifdef」と「define」はペアで使用しなければならないのでしょうか。 (4)defineに定義値を持たせてしまうとifdefでは"真"と理解されてしまうようです。 例えば「`define test 1'b0」と宣言してるのにも関わらず 「`ifdef test」と記述した場合、"真"と判断してifdef文を実行してしまいます。 仮に「`define test 4'b1111」とdefine定義しても、"真"と判断して同様にifdef文を実行してしまいます。 (5)『define次第で論理合成されたりされなかったりしますが・・』←こちらはどのように判断すればよろしいでしょうか。 すみませんが宜しくお願いします。
- zwi
- ベストアンサー率56% (730/1282)
趣味のHDLしかやっていません。主にVHDLの方をverlogをたしなみ程度でやっているだけなので間違っていたらすいません。日ごろはソフトウェアのプログラマな人です。 (1)「define」と「parameter」の用途の違いについて。 defineはマクロを定義するだけで、実際に論理記述で使うにはparameterで定義しないとだめだった様に思います。 C言語を知っていると分かるのですが、`defineはC言語の#defineとほぼ同様に考えるべきかと思います。 (2)「`ifdef」文と「if」文の用途の違いについて。 ifは実際の論理記述に使います。 `ifdefは、defineされているかどうかで、論理記述自体を論理合成の対象にしたり、対象外にしたりを切り替えることができます。 (3)「ifdef」の"def"は「define」の意味でしょうか。 -「define」の意の場合、「`ifdef <define_name>」のように<>の記述はdefineで定義された変数しか使用できないのでしょうか。 はい、そう思います。 (4)下記例のように"test1/2"に定義値を持たせない場合は、どのようにして"test1/2"に値をアサインすれば宜しいのでしょうか。 定義されていることを判定する`ifdefですから値はあってもかまいません。 `define test1 1 `define test2 2 (5)「ifdef」や「task」は、合成目的ではないテストベンチ等に使用するものと思っていましたが、「ifdef」や「task」を用いて組み合わせ回路等を開発したりするのでしょうか。 ごめんなさい。taskを語れるほど詳しくないです。 ifdefは、デバッグ用の回路記述を付けたり外したりとか実際の合成回路に影響を与えられるので色々と使い道はあるかと思います。 以上、あくまで参考意見でした。
補足
ご回答ありがとうございます。 プログラマーの方なのに、verilogもお詳しいですね。 (1)すみませんが、C言語をあまり理解しておりません。C言語では#defineはどのような機能なのでしょうか。 (4)説明が下手ですみません。「`ifdef <define_name>」の場合、define定義で値を設定してしまうと、条件文として成り立たないので、<define_name>が保有している値を"1"、"0"と変化するようにしたいのです。 すみませんが宜しくお願いします。
補足
ご回答ありがとうございます。 初心者ですみません。 if文を使っての$display表示させた方が簡単だというのは理解しています。 今回は敢えてifdefを使用したいと思っているのです。 >if(comp_res) >$display("compare error"); >else >$display("compare match"); ↑まさにこちらを実現したいのですが ifdef文を使用して実現するにはどう記述すれば宜しいのでしょうか。 ご教授願います。