Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Verilogでアナログ量を扱う (9)

Verilog自体は、ディジタルシミュレーションの環境だから、直接はアナログ量を扱うことはできない。もっともVerilog-Aなんてのもあるのだが、私は使ったことはないし、だいたいシロウトが使えるような環境もないはずである。論理合成はできないにしろ、いわゆるビヘイビアモデルでは、実数(real)型を使うことができるので、これを使えばとりあえず、アナログ量を扱うまねごとはできる。
ただし、Verilogのreal型は、regとほぼ同様で、wireに相当する機能がない。言い換えれば、alwaysやinitialブロックの中でしか左辺式にはつかえないのである。ということは、moduleの入力ポートや双方向ポートにはこのままでは使えない。で、どうするかというと、realは、Verilogの内部表現として、64ビットのregと同様になる(追記)ので、64ビットwireを介してモジュール間ではやりとりをする。スマートではないが、しかたない。このための変換用のシステム関数があって、64ビットのwire→realには、$bitstoreal,real→64ビットwireには、$realtobitsをそれぞれ使う。
たとえば、

 input [63:0] aaa ;
   :
   :
 real real_val;

   always@ * begin
       real_val = $bitstoreal( aaa) ;
   end // alaways

のように使う。直接代入するのは、多ビットのwireは暗黙的に、(符号なし)整数と解釈され、それがさらにreal型に変換されてしまうので、ダメだ。$bitstorealや$realtobitsは、実際にはこのような変換を回避する、castのようなものだとも考えられる。
今回のPICのVerilogモデルの中では、
`define ANALOG [63:0]
と定義して用いている。
ちなみに、Verilogでの整数型(integer)も同様の扱いで、モジュールポートにする。こちらは、内部的には32ビットregと同様である。
(追記、たっくさんから、指摘があったように、正確ではないところがあったので、追記しました。2007/10/20)

と、ここまでは、Verilogの話で、ここからは、Veritak(というか、Veritakの波形ビューア)の話。real型で宣言したものも、64bitのwireも波形ビューア上では、[63:0}となるが、値の表示が異なる。realはあくまでreal型での表現になり、64ビットwireは64ビットのビット列として扱われるようである。これはこれで、妥当な仕様と思うが、上記のようにreal型をモジュール・ポートを通じて伝播させるときは、ちょっと不便だ。そこで、プローブ用のモジュールを作った。radixとして、realをサポートしてくれればよいのだが・・・
----
本日の御託
赤福が、拙いことになっている。家内は子供のころ伊勢に住んでいたことがあって、
「こうなったら、へんば餅に頑張ってもらうしかないな」とことである。でも、どこで売ってんだ?

     1  `include "analog.h"
     2  //
     3  //  This is purely behavior module to view analog value
     4  // (c) 2007 BakaOyaji
     5  module analog_probe(
     6      input `ANALOG in
     7  ) ;
     8      parameter mag = 1000.0 ;
     9      real    real_val ;
    10  //    integer int_val ;
    11 
    12      always@ * begin
    13          real_val = $bitstoreal(in) ;
    14      end // always
    15  endmodule // analog_probe
    16  // EOF analog_probe.v



コメント

real について

的を得た解説ありがとうございます。

verilog のモジュールポートは、VHDLのそれと違い、基本的には、ハードの接続のイメージです。なので、バスコンフリクトや、プルアップ等の信号強度のモデリングのために暗黙的にwire4値でつながります。(内部的には64ビット宣言だと128ビット使います)ところが、verilog のrealは、C言語のdouble相当の2値64ビットです。このマッピングをどうするかというのは、多分実装依存でそれを吸収するために$xxのシステムタスクがあるのだと思います。

ご指摘ありがとうございます。少し検討してみます。 

  • 2007/10/20(土) 06:58:30 |
  • URL |
  • たっく #79D/WHSg
  • [ 編集 ]

Re:real について(10/19)

たっくさん,おはようございます。

>的を得た解説ありがとうございます。

>暗黙的にwire4値でつながります。
そうでした。単純に普通のプログラム言語のようにはいきませんね。
>ご指摘ありがとうございます。少し検討してみます。 
よろしくおねがいします。ここに書いたように、解決策はあるのですが、VCDファイルを読む場合は、(型が失われているので)対応していただけるととても便利と思います。
でも、Verilogでreal型を使ってなにかしようとする人はあまりいるとは思えませんので、優先度は「低」で結構です。
では、では。

  • 2007/10/20(土) 09:19:13 |
  • URL |
  • 莫迦オヤジ #79D/WHSg
  • [ 編集 ]

Re[1]:real について(10/19)

64ビットのVectorについて、実装しましたが、別件で、少しリリースを停めていますので、もう3-4日お待ちください。ModelSimで64ビット幅Wireにrealをassignし、VCD出力させたものをVeritak VCD Viewerで読ませrealが再現することを確認しました。なのでおそらく、VCSでも同であろうと思います。

  • 2007/10/21(日) 22:14:55 |
  • URL |
  • たっく #79D/WHSg
  • [ 編集 ]

Re[2]:real について(10/19)

>64ビットのVectorについて、実装しましたが、別件で、少しリリースを停めていますので、もう3-4日お待ちください。
ありがとうございます。急ぎませんので、よろしくお願いいたします。
ではでは。

  • 2007/10/22(月) 21:23:02 |
  • URL |
  • 莫迦オヤジ #79D/WHSg
  • [ 編集 ]

real について

リリースしました。時間があるときにお試しいただけたら嬉しいです。

  • 2007/10/23(火) 13:11:20 |
  • URL |
  • たっく #79D/WHSg
  • [ 編集 ]

Re:real について(10/19)

>リリースしました。時間があるときにお試しいただけたら嬉しいです。
ありがとうございます。早速、明日にでも試してみます。
では、では。

  • 2007/10/23(火) 22:24:46 |
  • URL |
  • 莫迦オヤジ #79D/WHSg
  • [ 編集 ]

Re:real について(10/19)

>リリースしました。時間があるときにお試しいただけたら嬉しいです。
-----
たっくさん,ありがとうございます。64ビットベクタが、floatとして表示できることを確認しました。
欲を言えば、{64{1'bz}}は、radixでfloatを選択した場合に、「z」と表示された方が便利な気がします。このほうが、integerやhexと比べても一貫性があるように思いますが、いかがでしょうか?

  • 2007/10/26(金) 00:14:09 |
  • URL |
  • 莫迦オヤジ #79D/WHSg
  • [ 編集 ]

Re[1]:real について(10/19)

>欲を言えば、{64{1'bz}}は、radixでfloatを選択した場合に、「z」と表示された方が便利な気がします。このほうが、integerやhexと比べても一貫性があるように思いますが、いかがでしょうか?

そうですね。その方がよいかもしれません。実装してみました。

  • 2007/10/30(火) 15:28:11 |
  • URL |
  • たっく #79D/WHSg
  • [ 編集 ]

Re[2]:real について(10/19)

たっくさん,ありがとうございます。
3.41Eで確認しました。
これからもよろしくお願いします。
ではでは。

  • 2007/10/31(水) 05:44:40 |
  • URL |
  • 莫迦オヤジ #79D/WHSg
  • [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/399-39cef80c
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。