Verilog Assignment Must Have A Net Type



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

これから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 にあるエラー内容の解説を見ることができます。



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



(要約)

原因: ネット型( 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 」 http://www.altima.jp/column/fpga_edison/verilog.html


その後、上位階層を作成し、無事 RTL Viewer で図 1 の通りに回路を

作ることができました。

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

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

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

 

[ 今日のPOINT ]

Error の上でハイライトし F1 キー、 Quartus II の Help に飛んで詳細が確認できる。

著者紹介へ

記事一覧へ

I suggest you read up on some verilog tutorials instead of trying to 'wing it'. Verilog expressions do not execute like C or any other microprocessor programming language. But here's a more explicit explanation to get you pointed in the right direction.

The "<=" operator feeds the right side expression (either the input port signal(s) or the Q output(s) of a register) to the D input(s) of the register on the left side. On the next clock cycle, the register on the left side will have latched the data and its output will reflect that and is ready to be used. Therefore, to use the "<=" operator, you must have a register type on the left side.

Since Databus is declared as an inout port signal, rather than a register, you can't do it. There is no D input. Ports have no storage capability. If the port is not used internally by another parent module, then it will ultimately map directly to physical pin(s) on the device of the same name specificed in the quartus pin planner.

You can continuously assign the port signal to the output of a reg type such as SPIdata_reg with the "assign" statement as I suggested earlier.

As assign statements are continuous assignments, they do not belong inside an always block.

To be explicit, the statement
assign Databus = output_enable? SPIdata_reg: 8'bz;

will assign the Databus port (pins) to SPIdata_reg (Databus[0] = SPIdata_reg[0], Databus[1] = SPIdata_reg[1], etc.) if output_enable is true, otherwise all Databus's signals will be tri-stated (the 8'bz part). That's the standard way of coding an inout port.

Or in other words, SPIdata_reg's Q outputs will drive Databus's ports when output_enable is true. When output_enable is false, Databus's ports will be tri-stated to allow external signals to drive it's value. Presumably, some other portion of Verilog code would be reading Databus's value, and doing something useful with it at an appropriate time, such as storing it into a register, passing it back to the avalon readdata signal, etc.

As a side note, what doesn't made sense to me is that you have a 8 bit wide bi-directional Databus for a SPI device. SPI devices communicate with one signal for output and one signal for input -- MISO and MOSI, so you've got more problems to address.

Google Verilog tutorial. That's how I learned.

0 Thoughts to “Verilog Assignment Must Have A Net Type

Leave a comment

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *