Altifigence Academy

6 / 37 · 概念

ベクトルのインデックス・ビット順・符号

ビット番号・シリアル転送順・算術解釈を分けてデータパスを読みます。

インデックスは名前であり、宣言方向が意味を決めます

logic [7:0] a; では a[7] が一番左です。logic [0:7] b; なら b[0] が一番左です。両方に 8'h96 を代入すると、左からのビット列はともに 10010110 ですが、各ビットのインデックスは異なります。「bit 0 は常に LSBLSB 最も低い桁の重みを持つビットです。表記方向とインデックス規則を合わせて確認します。」という仮定は、宣言方向を確認した後にだけ使えます。

実務ではインターフェース全体の方向を統一すると確認しやすくなります。波形ツールの表示順と、ファイル内のビット配列順も明示します。このコースの入力 JSON 配列は LSB から記し、RTL ベクトルの表示は通常 MSBMSB 最も高い桁の重みを持つビットです。ベクトルの宣言方向でインデックスが変わるため、常に最大番号とは限りません。 から読みます。

移動方向は実際の接続で確認します

q <= {q[1:0], din}; では、次の q[2] は以前の q[1]、次の q[1] は以前の q[0]、次の q[0] は din です。

q2next=q1,q1next=q0,q0next=dq_2^{next}=q_1,\quad q_1^{next}=q_0,\quad q_0^{next}=d

図が左向きかどうかより、どのインデックスがどの信号を受け取るかが正確な仕様です。

下の矢印は一つのビットが通る記憶位置です。全レジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るは同じエッジで旧値を読みます。din が一エッジで q2 まで通り抜ける意味ではありません。

ビット番号で移動経路を読む
  1. din: このエッジで受け入れるビット
  2. q0: din を取り込む
  3. q1: 以前の q0 を取り込む
  4. q2: 以前の q1 を取り込む

算術シフトと論理シフト

>> は、空いた左側・上位桁を 0 で埋める論理右シフトです。>>> は左オペランドが signed のとき、符号拡張する算術右シフトとして使えます。同じビット列でも、オペランドの signed 宣言により結果が異なる場合があります。

SystemVerilog
logic signed [7:0] x;
logic [7:0] logical_right, arithmetic_right;
assign logical_right = x >> 1;
assign arithmetic_right = x >>> 1;

x=8'b11111000(-8)なら、結果はそれぞれ 01111100 と 11111100 です。負数の算術右シフトは整数除算の負数の丸め規則と常に同じではないため、数値アルゴリズムでは別途確認します。

自分で考えてみましょう

3 ビット q=101、din=0 で、q<={q[1:0],din} と q<={din,q[2:1]} の次の値を求めてください。

解説を見る

両方とも 010 です。この入力では両方向が偶然一致します。q=001、din=0 なら、それぞれ 010 と 000 になり、方向の誤りを区別できます。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。