modelsimの威力に打ちのめされる

By 酔漢 - Last updated: 日曜日, 10月 9, 2016

通常はmodelsimのvsimをコマンドラインだけで使っています。

テストベクターを読んで計算結果を返すだけなのでこれで構わないのですが、今日作業した分で大量の警告が出力されるようになりました。調べたところ、信号が不定になる場合があるというエラーでした。ちなみに、何を言っているのが大変わかりにくいエラーです。

ともかく、メッセージが漠然としすぎてどの信号が不定になるのかまったく情報がありません。

ふと思いついてvsimを -c オプション無しで起動しました。最初から走らせれば、一目瞭然、初期化されていない信号が赤線で表示為れました。全部の配線を結線してちゃんと初期値を与えていたのですが、テストベクターでリセットパルスを与えていなかったため、最初のクロックが到達するまでラッチが不定状態でした。

おかげでテストベクターの不具合(リセットのカバレージ不足)と、テストベクターを生成するプログラムの不具合(パイプラインが実装されていない)まで明るみにでました。

modelsimはすごいですわ。

Filed in 日記

定数配列

By 酔漢 - Last updated: 土曜日, 10月 8, 2016

VHDLでconstantの配列を宣言した場合、それが1ポートのROMではなく、ばらばらの場所に置かれる単なる1,0の固定値になるという自信を持てるようになるには、まだまだ経験が足りません。

Filed in 日記

doxygenのVHDL対応

By 酔漢 - Last updated: 金曜日, 10月 7, 2016

doxygenがVHDLに対応していたので使ってみたのですが、期待外れでした。

全体的に「ドキュメントにならない」という印象です。具体的にどこが、と言われると困るのですがドキュメント化してほしいところがドキュメントできないといったところでしょうか。

例えば、architecture部直下の並列代入文が並ぶ部分を、ソースコードとしてドキュメントに差し込むことができません。一方、これはfunctionに対してなら行うことができます。また、外部デザインを実体化させる場合、コンポーネント宣言をすればクリッカブル・リンクを埋め込んでくれるようですが、私が使っている 「名前 : entity work.デザイン名」という方式だと、クリッカブル・リンクを作ってくれません。そのため、デザインのリファレンス関係も上手く図面化してくれません。

もうちょっと何とかならないかな、という気分です。

Filed in 日記

丸め付き算術右シフト

By 酔漢 - Last updated: 月曜日, 10月 3, 2016

丸め機能付の算術右シフト関数をVHDLで書きました。

丸めは演算の精度に大きく影響することはよく知られていますし、実験結果もそのとおりになります。たとえば、32bit NCOの精度評価でも丸めの有無で結果が変っています。ところが、丸め自身は軽視されることがあります。具体的には算術右シフトです。算術右シフトはMSBの符号ビットが保存されることばかり強調されますが、なぜか右側のビットは常に切り捨てられます。VHDLのnumeric_std.signedでは違うのではないかと期待しましたが、期待は裏切られました。

そういうわけで、自分で作ったのが丸め付き右シフト関数です。

    -- shift right arithmetic with rounding. 
function sra_round( arg : signed; count : integer ) return signed is
        -- create a bit vector which has value 1 at bit position count -1, the width is same with arg. 
    constant r : signed( arg'range ) := ( ( count - 1 ) => '1', others => '0' );
begin
        -- to make rouding for n bit shift right,
        -- add 1 to the bit bit position n-1
    return ( arg + r ) sra count; 
end sra_round;

この関数は受け取ったnumeric_std.signed型引数argをcountビットだけ右シフトします。その際、LSBの右側のビットが1であれば切り上げ、そうでなければ切り捨てしています。返す値にの幅はargの幅と同じです。

Filed in 信号処理, 日記

unresolvedなsigned型ポートへのリテラル代入

By 酔漢 - Last updated: 土曜日, 10月 1, 2016

VHDLでCORDICを書いていますが、下位のエンティティのテスト・ベクターを作るC++プログラムがようやく軌道に乗りました。

テスト・ベクターを安定して記述できるようになり、diffの結果としてテストを見ることが出来るようになったため、VHDLで書いたコードのリファクタリングを行っています。

何しろ素人ですので、書き始めは冗長で柔軟性の低いコードから始めています。それをテストしながらリファクタリングで柔軟性を高めていく目論見です。ところが、柔軟性を高めていくと、あれっと?思うような場面に出くわします。

たとえば、以下のようなコードがコンパイル・エラーになります。q_nextはnumeric_std.signed型です。

q_next <= ( others => '0' );

これがエラーになるのは、どうやらポート宣言で

signal q_qnext : out signed;

としているのが原因のようです。ワード幅を与えるタイミングをポートマッピング時点まで遅らせることで、エンティティ自体にワード幅をハードコードしない設計を狙ったわけですが、その結果、上のようなエラーになりました。

結局以下のように書くことで問題を解決しました。

q_next <= ( q_next'range => '0' );

納得がいきません。q_next’rangeの値をコンパイル時に決定できるのであれば、最初の記述でもその値を使ってコンパイルしてくれれば良いのです。実際、q_nextを

signal q_qnext : out signed( 7 downto 0 );

のように宣言すれば、コンパイルは通るのです。不平を言っても仕方ないのでVHDLの言語標準であるIEEE 1076-2008を調べてみたところ、”9.3.3.3 Array Aggregates”に以下のような記述を見つけました。これはArray Aggregateにotherを含んでも良い条件です。

As an actual associated with a formal parameter, formal generic, or formal port (or member thereof),where either the formal (or the member) is declared to be of a fully constrained array subtype, or theformal designator is a slice name

うーむ。この場合はq_nextはformal portに当たるわけですので、Array Aggregateにotherを入れたければ、代入先をfully constrained array subtypeとして(つまり明示的にビットベクトル幅を)宣言しなければならないということになります。

言い換えるとout signed( 7 downto 0 );のように宣言されていれば、othersを使ってベクトル型定数を記述出来るのですが、out signed; として宣言しているので、othersは使えないということです。

VHDLは難しいです。

Filed in VHDL, 日記

クロックのスキューが心配(2)

By 酔漢 - Last updated: 火曜日, 9月 27, 2016

昨日のエントリにChuckさんからコメントを頂きました。

↑クロックでデータの入力、(組み合わせ回路)演算開始、次の↑クロックで演算結果確定

これは「次の↑クロックでは前の演算結果が確定していて、それがそのまま出力している」という意味ですよね。やはりそうですか。明示的に「↓クロックで出力」とするのは、外部への出力時のようにクロックの波形の乱れが気になるときだけかな。それ以外はレポートを吟味して対処するわけですね。

私の場合、組み合わせ回路が深すぎてクロックをまたぐより、組み合わせ回路が浅すぎてクロックスキューが問題になる事のほうが心配です。

Filed in 日記

クロックスキューが心配

By 酔漢 - Last updated: 月曜日, 9月 26, 2016

VHDLで回路を記述していますが、クロックスキューが心配です。

全部の回路をクロックの立ち上がりエッジで動作させると、FPGA内部のクロックスキューによっては異常動作することがあり得ると思うのですが、どうでしょうか。

より安全にするには、プロセス文内部ではクロックの立ち上がりで入力と演算を行い、立ち下がりで出力と状態遷移をするような記述が必要に思えます。しかし、そのようなことは教科書に書いておらず、ネットを探した範囲では見つかりませんでした。

FPGAにはクロックを低遅延で分配する専用インフラが内蔵されているそうですから、心配する必要は無いのかも知れません。

Filed in 日記

難所

By 酔漢 - Last updated: 金曜日, 9月 23, 2016

そろそろど素人による「プログラマから見たVHDLの難所」みたいもの書いてもいいかな、と考えています。

何かを書き記すにはレベルが低すぎるのですが、今感じていることはやがて消えていきますので。

Filed in 日記

VHDLの型変換

By 酔漢 - Last updated: 火曜日, 9月 20, 2016

週末はVHDLの型変換について調べていました。

だいぶわかってきたのですが、もう一押し、と思っていたところすばらしい解説を見つけました。VHDL Type Conversionにはビット・ベクトルと数値の間の変換をまとめています。

ビット・ベクトル間だと型のキャスティングだけでよいのですが、ビット・ベクトルと数値の間では変換関数を使います。そして変換関数は”to_”で始まる名前です。

わかりやすいですね。

Filed in 日記

genericでstd_logic_vectorの幅をコントロールする

By 酔漢 - Last updated: 月曜日, 9月 19, 2016

VHDLを使って気になっていたことがあるのでちょっと実験してみました。

気になっていた事というのは、「コンポーネントとして設計した部品のデータ幅を使用時に変えることが出来るか」という点です。たとえば、DDSをコンポーネントとしたときに、利用する度に12bit, 16bitのようにかえられるでしょうか。

Read the rest of this entry »

Filed in 日記