40 / 63 · 実習
実習:シリアルデータの移動とビット順の検証
ビット列と整数参照モデルを併用し、方向・失われるビット・リセット後の遅延を検証します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
実験対象と観測条件
立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るごとに、以前の q の下位二ビットが左へ移り、din が bit 0 に入ります。1、0、1、1 を順に入れ、移動を比べてください。
始める前に
Digital Design Studio の Desktop プロジェクトと正常な実行権限を用意します。各例は別フォルダの rtl/top.sv に保存してください。
SystemVerilog ソース
module top (
input logic clk,
input logic rst,
input logic din,
output logic [2:0] q
);
// Old q[1:0] and din are captured together at each rising edge.
always_ff @(posedge clk)
if (rst) q <= 3'b000;
else q <= {q[1:0], din};
endmodule実行方法
New analysis で Two-state single-clock v1 を選びます。Clock port は clk、周期は 1000ps です。次の設定で Preflight と Run RTL simulation を実行し、結果を比較します。
| 設定 | 値 |
|---|---|
| 初期レジスタ値(LSB から) | [false,false,false] |
| Reset port | rst · Active high · 1 cycle |
| Maximum cycles / time | 5 / 5000ps |
入力刺激
[
{
"inputs": {
"din": [
false
]
}
},
{
"inputs": {
"din": [
true
]
}
},
{
"inputs": {
"din": [
false
]
}
},
{
"inputs": {
"din": [
true
]
}
},
{
"inputs": {
"din": [
true
]
}
}
]下の各列は立上りエッジの記録です。入力はエッジ直前、「更新後」の状態は更新直後です。並びはサンプル順で、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るではありません。最初の列はリセットリセット 状態を仕様で定めた初期値に戻す制御です。同期式か非同期式か、他の制御より優先されるかを合わせて定めます。 詳しく見るのエッジで、din=0 は記憶データとして数えません。その後の四入力を JSON の順と比べてください。
波形データを表示
| 信号 | 波形 | バスの値 |
|---|---|---|
| エッジ | 23452 | E0 → E1 → E2 → E3 → E4 |
| reset | 10... | |
| din | 0101. | |
| 更新後 q | 23452 | 000 → 001 → 010 → 101 → 011 |
結果の比較
5 cycles · q=011。立上りエッジごとに 000 → 001 → 010 → 101 → 011 となります。
この実習は 0/1 の単一クロック RTL を使い、#delay・initial・X/Z のテストベンチは含みません。学習完了の表示は学習記録であり、実際のシミュレーション結果ではありません。
連結演算を独立した式で確認する
RTL と同じ連結演算連結演算 ビット列を横につなげる演算です。結果幅はオペランド幅の合計で、数値の足し算とは異なります。 詳しく見るをテストの正解にコピーすると、同じ間違いを両方に入れる場合があります。unsignedunsigned ビット列を非負整数として解釈する規則です。n ビットの範囲は 0 から 2^n−1 で、同じビット列の signed 解釈と異なる場合があります。 詳しく見る 整数として解釈する参照モデルを使ってみます。
リセット後の入力 1、0、1、1 では、 です。3 ビット二進数で書けば実習の波形と一致するはずです。最後は で、下位 3 ビットだけ残すので 3 になります。
| 受信ビット数 | 入力 | エッジ後の q | 整数値 |
|---|---|---|---|
| 0 | リセット | 000 | 0 |
| 1 | 1 | 001 | 1 |
| 2 | 0 | 010 | 2 |
| 3 | 1 | 101 | 5 |
| 4 | 1 | 011 | 3 |
reset=0、enable=1 で din を 1,0,1,1 と選び、毎回クロックを進めます。q は 001,010,101,011 です。この実習で一段階ずつ予測してから、実際の RTL 結果と比較してください。enable は、次の発展課題の停止動作も試すために含まれています。
同期 reset は enable より優先されます。enable=0 なら保持中の値を維持します。 q=000; q_next = (2q + din) mod 8
一ビットを追い、方向を検証する
リセット後、1 を一回、0 を三回入れます。状態は 001 → 010 → 100 → 000 です。最初の 1 が bit 0、bit 1、bit 2 を通り、その後消える必要があります。全 0、全 1 だけでは移動方向の誤りを見逃します。
3 段レジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るで最初に入力を記憶したエッジを とすると、最上位 bit 2 には のエッジ後に届きます。外部送信レジスタがデータを出したエッジから数えると基準点が変わるため、報告には出発点と到達点を明示します。
発展課題:有効な入力だけを移動する
入力に valid を加えるとします。valid=0 で q を保持する設計と、毎サイクル移動して別の valid ビットも伝えるパイプラインは異なります。前者は受信ビット数、後者は経過クロック数に従って移動します。同じ期待状態列で両方を検証してはいけません。
自分で考えてみましょう
リセット後、valid=1 のビットが 1、0、1 と届きます。第 2 ビットの前後に valid=0 のサイクルが一つずつあり、invalid では q を保持します。最後の q と、最初の 1 が bit 2 に届く時点を説明してください。
解説を見る
有効入力三回だけが状態を変えるので、最後の q は 101 です。最初の 1 は第 3 有効入力を記憶するエッジで bit 2 に届きます。最初の取込み後に二回の追加移動が必要で、間の invalid 二サイクル分だけ実時間が延びます。