すべてが盆栽になる

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

VHDLのコードを整えています。

開発時に書き込んだデバッグ用の覚え書きなどを消しつつ、コメントを意味のある物に変更。変数名もあとから見直すとへんてこな物がありますのでこれを変更。

もうちょっと整えたいところもあります。

Filed in 日記

コメント形式のテスト

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

ちょっと考えることがあって、コメント形式をいじってみました。テスト・ベクター生成プログラムです。

もともと、コメントは各行の右に書いていました。

image

こうしてみると、上に書いた方が遙かに合理的ですね。まぁ、わかりきったことではあります。次からはこの手のコードは上にコメントを書くことにします。

Filed in 日記

リファクタリング、リファクタリング、リファクタリング

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

VHDLによるCORDICは、精度検証そっちのけで書き換えを続けています。リファクタリングを越えてインターフェースや階層構造、果ては根幹にかかわる構造まで書き換えていますので、全面刷新に近いです。

普通はこれだけ大規模な書き換えには躊躇するのですが、VHDLによる設計とC++によるモデルの実行結果を付き合わせて可視化するスクリプトを書いて常走らせているため、間違いを発見しやすく個々の作業に対する安心感があります。

よくわからないままに書いていたVHDLも度重なる書き換えを経て我がコードながら洗練されたものになり、勢いで書いていたC++モデルやテストベクター生成コードも全部クラス化しました。

CORDICアルゴリズムの引数の値域も拡張し、今はひたすらDoxygenコメントを書いています。仕事じゃないので時間制約もなく、楽しいです。

Filed in 日記

クロック・エッジ

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

昨晩は久しぶりに趣味で夜更かししました。

VHDLによるSINCOS CORDICの記述も大詰めです。まだ精度検証までいっていませんが、C++によるモデルとVHDLによるデザインの実行結果を常につきあわせているので、わりといい感触です。

昨晩のこっていたのは、パイプラインの挙動です。VHDLだけリセット結果がフラッシュされた最初のデータがゴミでした。このゴミの分だけパイプラインがずれています。

ここをきちんとモデルが表現できていない点を問題視しています。ゴミと言ってもUやXが出力されるわけではないため、パイプラインの長さが変るような妙な事が起きているのだと思います。

Filed in 日記

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 日記