初めまして!『ぽき』です。

これから1年間記事を掲載させていただきます。

皆様の理解につながるような記事を書けるよう頑張ります。

 

 

技術研修が始まりハードウェア設計言語の一つである Verilog HDL を勉強しました。

C 言語の経験があったので、Verilog HDL の記述スタイルは理解しやすかったです。

大規模な論理回路の処理をプログラムで記述することができるので、回路図で記述するよりも非常に簡単に設計できるのですね!

さて、研修で Verilog HDL を使用して図1の回路を作成する課題がでました。

カウンター (counter:u00) とデコーダー (segment:u01) を使用した回路です。

図1:作成する論理回路

counter と segment というモジュールを作成して、上位階層ファイルで呼び出し接続しています。

 

問題はモジュールの作成時に起こりました。

 

Quartus® II は論理チェック機能と論理合成を行うことができるため、Quartus® II を使って論理合成をおこなってみたところ、、、

4 bit の counter は論理合成。。。できました!

 

次の 7 bit のsegment は論理合成。。。が できません!

以下の Error が発生して、論理合成前の論理チェックで止まってしまいました。

 

Error (10137): Verilog HDL Procedural Assignment error at segment.v: object "out" on left-hand side of assignment must have a variable data type

 

どうやら segment モジュールの出力 out に原因があるようです。

もう少し詳しく知りたいなあ。。。

 

そんな時 先輩が一言。

先輩 「Help を見たら?」

 

ん? Help?そんな便利なものがあるのですか!?

 

やり方は、詳細を知りたい Error をハイライト後に「 F1 キー」を押すだけです!

F1 キーを押すことで (また右クリックから Help をクリックしても同様のことがおこなえます。)

Quartus® II の Help にあるエラー内容の解説を見ることができます。

 

すると今回は以下のような解説が出てきました。

ID:10137 Verilog HDL Procedural Assignment error at <location>: object "<name>" on left-hand side of assignment must have a variable data type

CAUSE: In a procedural assignment at the specified location in a Verilog Design File (.v), you assigned a value to the specified object, which was declared with a net data type (wire, wand, and so on) rather than with a variable data type (reg, integer, and so on). In Verilog HDL, you must use continuous assignments when targeting nets, and procedural assignments when targeting variables.

 

ACTION: Declare the specified object with a variable data type, if that is appropriate, or use a continuous assignment to assign a value to the object.

 ~~~~~~~~~~~~

(要約)

原因: ネット型( wire, wand など)のものを変数型( reg, integer など)で宣言しています。

     Verilog HDL では対象がネット型の場合は継続代入文で、変数型の場合は手続き代入文で使用しなければいけません。

 

対応策 : エラーの対象について変数型で定義するか、変数型で定義したものについて手続き代入文で記述してください。

ネット型を変数型に変更する?

ここで segment モジュールを見直してみると、、、

図2:segment モジュール

 

always 文で出力 out を使っています!

出力 out は wire で宣言しているので、always 文では使うことができません。

 

always 文で使うために図3のように wire を reg に変更したら無事論理合成できました。

図3:変更前(左) と 変更後(右)

補足としまして、各文で使えるデータタイプ型は以下のとおりです。

継続代入文 (continuous assignment )    assign文: ネット型 (  wire, wand  ) 

手続き代入文 (continuous assignment)   always文: 変数型 ( reg , integer  )

 

 

ちなみに過去の先輩も同じことで悩まれていました。

「Verilog HDL」

 

その後、上位階層を作成し、無事 RTL Viewer で図 1 の通りに回路を作ることができました。

Error は嫌ですけれど、原因が分かるとうれしいですよね。

みなさんも困ったときは「Error の上でハイライト(クリック)して F1 キー」押してみてください♪ 

新しい発見があるかも知れませんよ!

 

[ 今回のポイント! ]

Error をハイライト選択し F1 キー ⇒ Quartus® II の Help に飛んで詳細が確認できる。