Quartusで遊ぼう (5) [プログラム三昧]
前回の「Quartusで遊ぼう (4)」でステート・マシンがワン・ホット・コードで構成されたことが確認されました。 今回は、ワン・ホット・コードを使ったステート・マシンでグリッチが発生すかどうかを観測します。
RTLシミュレーションでは、グリッチは発生しない
今回題材として使うのは、デューティ50%出力の4分周カウンタです。
module onehot(q, clk, reset_b); output q; input clk; input reset_b; parameter ST_0 = 4'b0000; parameter ST_1 = 4'b0011; parameter ST_2 = 4'b0101; parameter ST_3 = 4'b1001; reg q; // synthesis syn_encoding = "user" reg[3:0] st; always @(posedge clk or negedge reset_b) begin if (!reset_b) begin st <= ST_0; end else case(st) ST_0: st <= ST_1; ST_1: st <= ST_2; ST_2: st <= ST_3; ST_3: st <= ST_0; endcase end always @(st) begin case (st) ST_2, ST_3: q = 1'b1; default: q = 1'b0; endcase end endmodule
実験用の HDL なので、内容にあまり意味はありません。 テストベンチは、これです。
`timescale 1ns / 1ps module tb_onehot(); wire q; reg clk; reg reset_b; parameter CLK_PERIOD = 20; onehot onehot_1( .q (q), .clk (clk), .reset_b (reset_b) ); initial begin clk = 0; forever begin #(CLK_PERIOD/2) clk = ~clk; end end initial begin reset_b = 0; repeat (10) @(posedge clk); #5 reset_b = 1; repeat (50) @(posedge clk); $stop; end endmodule
RTLによるシミュレーションを行うと、一行目のクロックに同期して2から5行目のフリップ・フロップの出力が変化します。 そのため、6行目の q 出力にグリッチが発生するはずがありません。
ゲート・レベル・シミュレーションの実行手順
トランジスタ技術誌でも、シミュレーションの方法が紹介されていましたが、RTLによる理想的な状態でのシミュレーションでした。 そのため、50GHzというむちゃくちゃなクロックを与えても回路が動作しているように見えました。 ここでは、合成後の状態でのシミュレーションの方法を説明します。
ゲート・レベル・ネットリストを作成する
まず、 Quartus II でゲート・レベル・ネットリストと遅延情報ファイルを作成します。 これらを作成するには、オプションの設定が必要です。 メニューの "Assignments → EDA Tool Settings" から "Settings" ダイアログを開きます。 次に "Category" から "EDA Tool Settings → Simulation" を選択します。 すると、このようなダイアログが開くので、 "Tool name" に "ModelSim-Altera" を、 "Format for output netlist" (出力するネットリストのフォーマット)に "Verilog" を、 "Time scale" (シミュレーションの単位時間)に "1ps" を指定します。
オプションを設定したら、メニューの "Processing → Start Compilation" でネットリストを作成します。 ここで生成されたファイルは、 "Compilation Report → EDA Netlist Writer → Simulation → Generated Files" から確認できます。 ここでは、 "onehot.vo" というゲート・レベル・ネットリストと "onehot_v.sdo" という遅延情報ファイルが作成されています。
シミュレーションを実行する
ネットリストが揃ったので、シミュレーションを行います。 "ModelSim - Altera" を起動したら、メニューから "File → New → Project..." を選び "Create Project" ダイアログを開きます。 "Project Name" に適当なプロジェクト名を指定し、 "Project Location" には、 Quartus II で作成したプロジェクト・ディレクトリの下にある "simulation/modelsim" を指定します。 このディレクトリは、 Quartus II が作成したゲート・レベル・ネットリストが入るデフォルトのディレクトリです。
すると、 "Add items to the Project" というダイアログが開くので、 "Add Existing File" をクリックし、シミュレーションに使用するネットリストを選択します。 ここで指定するファイルは、 "onehot.vo" と "tb_onehot.v" の二つです。
メニューから "Compile → Compile All" を選んでこれら二つのファイルをコンパイルします。 コンパイルすると、シミュレーションに使用可能なファイルが生成されます。
シミュレーションを実行するには、メニューから "Simulate → Start Simulation..." を選択します。 すると、 "Start Simulation" ダイアログが開きます。 このダイアログで設定すべき箇所は二つです。
一つ目は、テストベンチのトップレベルの指定です。 これは、 "Design" タブで "work → tb_onehot" を選びます。
二つ目は、 CPLD の素子などが収められたライブラリの指定です。 これは、 "Libraries" タブで "Search Libraries" にある "Add..." ボタンをクリックして、 "maxii_ver" を選択します。 これで、 "MAX II" 用に "verilog" で記述されたコンパイル済みライブラリを参照することができます。
以上で設定準備は完了です。 ダイアログの "OK" ボタンをクリックすると、シミュレーションが実行されます。
ゲート・レベル・シミュレーションの場合
カウンタをゲートレベルシミュレーションにかけてみました。 伝達遅延情報が入っているので、1行目のクロックが立ち上がってから4行目の q 出力が立ち下がるまで 6.005ナノ秒の時間を要しているのがわかります。 この場合にも、グリッチは観測されません。 理由は、すべてのフリップ・フロップの clk から出力への伝達遅延が全く等しいからです。
シミュレーションでは、観測されませんが、危険な構成であることに間違いは無いと思います。 シミュレーションでは検出できないのかな?
クロック周波数を上げてみた
ゲート・レベル・ネットリストを使用したシミュレーションで、クロック周波数を上げてみました。 これは、テスト・ベンチのパラメータ "CLK_PERIOD" を変更するだけで手軽に試すことが出来ます。 その結果、 "CLK_PERIOD" を 4 まで減らす、つまり250MHzで動作させるとフリップ・フロップが正しく動作しなくなり、出力が出なくなることが確認されました。 やっぱり、50GHzでは、動作しないっしょ。
参考サイト
- Quartus II Development Software Literature
-
この記事は、このWEBページに並んでいるマニュアルの "Volume 3: Verification → Section I. Simulation → Chapter 2. Mentor Graphics ModelSim Support" を参照して書きました。 ただし、メニューの構成が実物のシミュレータと相違している箇所がいくつもあるので、注意が必要です。
参考文献
トランジスタ技術 (Transistor Gijutsu) 2008年 12月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/11/10
- メディア: 雑誌
付録 : 「Quartus で遊ぼう」索引
- Quartus で遊ぼう (1)
- Altera の EPM2210F324 が話題になっているので、私も使ってみました。 ただし、ハードウェアは購入していないので、ソフトウェアで遊んだだけです。
- Quartus で遊ぼう (2)
- 「Quartus で遊ぼう」の二回目は、組み合わせ論理回路の合成を調べます。
- Quartus で遊ぼう (3)
- 論理合成後の状態を表示してくれるツールを探しました。
- Quartus で遊ぼう (4)
- 前回作成した4値のアップ・ダウンカウンタで論理合成後に使われているフリップ・フロップは、何個(何ビット)でしょうか?
- Quartus で遊ぼう (5)
- 今回は、ワン・ホット・コードを使ったステート・マシンでグリッチが発生すかどうかを観測します。
- Quartus で遊ぼう (6)
- トランジスタ技術誌に「リセット信号生成回路」のHDL記述がありました。 この記述は、ちょっともったいないですよ。
- Quartus で遊ぼう (7)
- トランジスタ技術誌に書かれていたインストラクション・デコーダは、3項演算子が連なっていました。 もっと、別の書き方はできないかな。
- Quartus で遊ぼう (8)
- Verilog の代入には、 <= と = の二種類が使われています。 これって、何が違うんでしょうかね。
- Quartus で遊ぼう (9)
- 2進数の足し算で、キャリーを取り出したい時、どうしましょうか。
- Quartus で遊ぼう (10)
- 作らせてみました。 リップル・キャリーカウンタ。
- Quartus で遊ぼう (11)
- 先ごろ、請求していた"DVD"が届きました。
コメント 0