920 likes | 1.04k Views
Verilog設計演習 Ⅰ 入 門 編 広島県立西部工業技術センター. 1.作業ディレクトリの作成 まず、エクスプローラを起動し、 ルートディレクトリの下にseminarというディレクトリを、 その下にVerilogというディレクトリを作成して下さい。 ( DOS/V の場合) C:¥seminar¥Verilog (98の場合) A:¥seminar¥Verilog 以下、Verilog演習で作成するファイルはVerilogの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。. A. B. F. C. D.
E N D
Verilog設計演習Ⅰ 入 門 編広島県立西部工業技術センターVerilog設計演習Ⅰ 入 門 編広島県立西部工業技術センター
1.作業ディレクトリの作成 まず、エクスプローラを起動し、 ルートディレクトリの下にseminarというディレクトリを、 その下にVerilogというディレクトリを作成して下さい。 (DOS/Vの場合) C:¥seminar¥Verilog (98の場合) A:¥seminar¥Verilog 以下、Verilog演習で作成するファイルはVerilogの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。
A B F C D 2.Verilogの基本ブロック 例題1 aoiゲート aoi.v module aoi(a,b,c,d,f); input a,b,c,d; output f; assign f=~((a & b)|(c & d)); endmodule
(1)verilogの基本ブロックはモジュール。 (2)モジュールはキーワードmoduleではじまり,endmoduleで終わる。 (3)キーワードmoduleの次にモジュール名と(ポートリスト);がつづく。 (4)ポートリストに書いた信号名の入出力宣言を次に行う。 入 力 = input 出 力 = output 双方向 = inout (5)入出力宣言とendmoduleの間にモジュールの本体機能を書く。 endmoduleにはセミコロン;はいらない。 (6)簡単な本体機能は,信号代入文assignを使って記述する。 assign 左辺 = 右辺 (7)Verilogのビット演算子は,C言語と同じ。 & AND 小林テキストP64 表3.2 | OR ~ NOT ^ EX-OR (8)わかりやすい様に( )を使ってよい。
クイックロジック社QuickWorks 配置配線ツールSpDE 兼 統合化環境 回路図入力 SYNARIO 論理合成 Synplify Verilogシミュレータ SILOSⅢ Verilog学習 VHDL学習 HDLエディタ ターボライタ
3.SpDEの起動 スタート - プログラム - QuickLogic ー SpDEで SpDEを起動します。
4.HDLエディタの起動 SpDEのツールバーから、HDLエディタのアイコン を 押して、HDLエディタを起動し、クリエイトアイコン を押す。
5.Verilogコードの入力、保存 例題1のVerilogコードを入力し、FileーSaveAsメニューから ¥seminar¥verilogの下に、ファイル名aoi.vで保存する。 拡張子が定まると、module、inputなどのVerilogキーワード が紺色でハイライトされます。紺色は見にくいのでHDLエディタの WindowーColorsーKeyword で、青色に変更して下さい。 File-ExitでHDLエディタを終了し、SpDEに戻ります。 6.論理合成Synplifyの起動 SpdeのFile-Import-Verilogメニューから ¥seminar¥verilog¥aoi.vを指定し、論理合成ツールを 起動します。
7.ターゲットデバイスの指定と論理合成 RUNボタンのすぐ上のChangeボタンを押して、 Partをp8x12b、Packageをpl44に変更し、OKを押します。 次に、RUNボタンを押して、論理合成をかけます。
8.エラーの修正 ソースファイルにエラーがあると、下の画面で停止します。 ViewLogボタンでエラー内容を確認した後、Editボタンを 押して、HDLエディタを再度起動し、エラー箇所を修正します。
9.論理合成プロジェクトの保存 エラーがなければDoneが表示されて、下の画面で停止します。 「はい」を選んで論理合成プロジェクトを保存し、SpDEに戻ります。
10.配置配線の実行 SpDEのツールバーからRunToolsアイコン を押して、 配置配線を実行します。途中、RUNと「いいえ」を選択します。
11.配置配線結果の確認 SpDEツールバーからFullFitアイコン を選択し、 チップ全体を表示させます。
次に、View-NormalFitメニューを選択し、Zカーソルを 次に、View-NormalFitメニューを選択し、Zカーソルを 回路のある部分でクリックして、回路部分を拡大表示します。 さらに拡大したければZoomInアイコン を使います。
回路部分のみを拡大すると、下図のようになります。 回路部分のみを拡大すると、下図のようになります。 台形印のセレクタはr=s・p+s・qを表しますので、全体として a・b=1またはc・d=1の時 f=0 それ以外の時 f=1 となり、最初のVerilogコードを満す回路が生成されていること が分かります。 s f p b r a q 入力s 出力r 0 p 1 q ※論理合成結果を確認したら、 File-Saveメニューで結果を 保存します。 d c
AB A O B F C D CD 12.基本ブロック(続き) HDLエディタを起動し、aoi.vを次のように修正します。 module aoi(a,b,c,d,f); input a,b,c,d; output f; // assign f=~((a & b)|(c & d)); wire ab,cd,o; assign ab=a & b; assign cd=c & d; assign o =ab | cd; assign f = ~o; endmodule
(1)やや複雑な機能を記述する時は,wireで宣言した(1)やや複雑な機能を記述する時は,wireで宣言した ローカル信号を使うこともできる。 ab,cd,o (2)1ビット幅のwireは宣言なしでも使える。暗黙宣言。 後出の複数ビット幅のwireは宣言が必要。 (3)//は1行のみのコメント行。 /*・・・・・*/は複数行にわたるコメント行である。 修正が終わったらソースコードを保存し、論理合成をかけて 配置配線を実行して下さい。結果は同じになります。
問題1 インバータLS04.vを設計し、結果を確認しなさい。 問題2 NANDゲートLS00.vを設計し、結果を確認しなさい。 問題3 NORゲートLS02.vを設計し、結果を確認しなさい。
SEL g2 A g3 FB g1 AOI F SELB B 13.階層設計 例題2 マルチプレクサ mux2.v `include "aoi.v" module inv(a,f); input a; output f; assign f=~a; endmodule module mux2(sel,a,b,f); input sel,a,b; output f; inv g1 (sel,selb); aoi g2 (sel,a,selb,b,fb); inv g3 (.a(fb),.f(f)); endmodule
(1)もっと複雑な回路記述には階層設計を使う。(1)もっと複雑な回路記述には階層設計を使う。 (2) 階層設計は,複数のモジュール宣言と モジュールインスタンスで行う。 (3) 複数モジュールの宣言は, invの様に,同一ファイル内に書いても良いし, aoiの様に,別ファイルに書いて,`includeしても良い。 (4) モジュールインスタンスは,サブルーチンコールの様なもので, モジュール名 インスタンス名(ポートリスト); の形式で行う。上の例では,g1,g2,g3がインスタンス名。
(5) モジュールインスタンスのポートリストは上位モジュールと 下位モジュールを接続するもので, g1,g2の様に,並びによる接続が一般的。 g3の様に,名前による接続も使える。 (6) 出力信号を接続しない時はカンマを余分に書く。 (7) 上の例ではselbとfbは,暗黙宣言されたwireである。 ※ `はバック・シングル・クォートで DOSVでは shift + @ 98 では shift + ^ shift + 7 ではないことに注意。
例題2を入力し、論理合成、配置配線を実行します。例題2を入力し、論理合成、配置配線を実行します。 結果は、論理圧縮の効果で例題1より簡単になり、 下図のようになります。 sel=1なら f=a sel=0なら f=b となっています。 b a sel f
14.条件付きassign文 例題3 セレクタ mux21.v module mux21(sel,a,b,f); input sel,a,b; output f; assign f=sel ? a:b; endmodule mux21 sel a f b (1) 例題2(mux2.v)では階層設計を説明するため,複雑な書き方を したが,セレクタ自体はもっと簡単に記述できる。 (2)assign文にはC言語の3項演算子(条件演算子ともいう)に似た 条件付きassign文があり, assign 左辺=(条件式1) ? (右辺1) : (右辺2); が使える。 (3)上の例では,sel=1ならf=a,sel=0ならf=bになる。
15.always文とif文 例題3 セレクタ mux21.v module mux21(sel,a,b,f); input sel,a,b; output f; reg f; always@(sel or a or b) begin if(sel==1'b1) f=a; else f=b; end endmodule mux21 sel a f b (1)3項演算子よりも,わかりやすいif文もあるが, module-endmodule間に,ダイレクトには記述できない。 上の例のように,alwaysブロックの中で記述する。
(2)always文は always@(信号名) begin : : end ←セミコロンがないのに注意 の形で記述し,( )内の信号名の値が変化したときのみ評価される。 つまり,( )内にはalwaysブロックとしての入力信号を記述する。 正しくはセンシティビティ・リストという。 複数の入力信号が有る時は,カンマではなく orで区切って記述する。 (3)alwaysブロックで組合せ回路を生成する場合,入力信号を 全てセンシティビティ・リストに記述しなければならない。 (順序回路の場合はそうとは限らない)
(4)alwaysブロック内では,if文,case文が使え, if(条件式) 式1; else 式2; と書く。多重if文も使える。 if(条件式1) 式1; else if(条件式2) 式2; else 式3; (5)条件式に使う関係演算子はC言語と同じで == 等しい > 大 >= 以上 != 等しくない < 小 <= 以下 が使え,かつ,それらの論理演算 && 論理積 || 論理和 ! 論理否定 も使える。 (6)1ビット幅の定数は 1,0,1'b1,1'b0 と書く。 ' はSHIFT+7です。
(7)最も重要なのは,alwaysブロック内での ・信号代入には,assign文は使わないこと。 ・代入文の左辺にくる信号は,レジスタ宣言 しなければならないこと。 である。上の例では f がこれにあたる。 (8)上の例からわかる様に,生成される回路が組合せ回路で あってもレジスタ宣言が必要である。逆に言うと,レジスタ宣言 してもフリップフロップが必ず生成されるわけではない。 (9)if文で全ての条件が列挙されていれば,つまり, ifの数だけelseがあれば,組合せ回路が, そうでなければ,順序回路が生成される。 例題3を入力し、論理合成、配置配線を実行します。 結果は例題2と同じになります。
Verilog設計演習Ⅱ シミュレーション編広島県立西部工業技術センター Verilog設計演習Ⅱ シミュレーション編広島県立西部工業技術センター
1.テスト・フィクスチャの準備 例題3の設計mux21.vを、Verilogシミュレータを用いて 検証します。 設計検証用テストパターンを発生させるVerilogコードのことを テスト・フィクスチャと呼びます。拡張子は通常 .tf を使います。 HDLエディタでmux21.vを開いた状態で、 HDLー GenerateTestBench を実行すると、テストフィクスチャの雛形mux21.tfが生成されます。 (遅いマシンでは数分かかることも有ります。) (1) `timescale 1ns/1ns (2) module t; (3) reg sel,a,b; (4) wire f; (5) mux21 m (.sel(sel),.a(a),.b(b),.f(f)); (6) // Enter fixture code here (7) endmodule // t
(1)timescale文はシミュレーションの時間単位を定めるもので、(1)timescale文はシミュレーションの時間単位を定めるもので、 /の前がこのモジュール内での時間記述#の時間単位、 /の後ろがシミュレーション時に使用される時間精度 になります。この例ではいずれも1nsになります。 (2)テストフィクスチャのモジュールには、ポートリストが有りません。 モジュール名は何でもかまいませんが、ここでは t です。 (3)元の設計データの入力信号は、このモジュール内では値を代入 するので、レジスタ宣言します。 (4)出力信号は観測するだけなので、ワイヤ宣言します。 (5)元の設計データをモジュールインスタンスとして、呼び出します。 信号の接続には、名前による接続が行われていますが、 並びによる接続でも構いません。 (6)この位置に、実際のテストパターン用コードを追加します。
`timescale 1ns/1ns module t; reg sel,a,b; wire f; mux21 m (.sel(sel),.a(a),.b(b),.f(f)); // Enter fixture code here initial begin sel=0; a=0; b=0; #100 sel=0; a=0; b=1; #100 sel=0; a=1; b=0; #100 sel=0; a=1; b=1; #100 sel=1; a=0; b=0; #100 sel=1; a=0; b=1; #100 sel=1; a=1; b=0; #100 sel=1; a=1; b=1; end endmodule // t それでは、6行目の位置に 右の四角の部分を追加して テスト・フィクスチャを完成さ せてから、mux21.tfとして 保存して下さい。 この例で分かるように、テスト フィクスチャでの信号値の代入 には、initial文を使用します。 意味としては、 sel,a,bの初期値として 全て0を代入した後、100ns 毎に異なる値を代入しています。
2.機能シミュレーション(Pre-Layout)2.機能シミュレーション(Pre-Layout) (1)SpDEのツールバーから、シミュレータのアイコン を 押して、SILOS3を起動します。 シミュレーションタイプでPre-Layoutを選択します。 テストフィクスチャがmux21.tf、 トップレベルモジュールがmux21.vになっていることを 確認後、OKを押して下さい。
(2)mux21.vは論理合成のチェックを通っているので、(2)mux21.vは論理合成のチェックを通っているので、 エラーがあるとすればmux21.tfの方です。 エラーがあるとoutputウインドウにエラーメッセージが表示され、 下の画面で停止するので、キャンセルを押します。 outputウインドウにエラーがなければ、(4)に進みます。
(3)エラーメッセージを確認後、SILOS3のFileーOpenメニュー(3)エラーメッセージを確認後、SILOS3のFileーOpenメニュー からmux21.tfを選択し、エラー箇所を修正します。 修正が終わったら、SILOS3のFile-Saveで保存し、 mux21.tfウインドウのアイコン化ボタン でアイコン化します。 Load/Reloadアイコン を押して、修正結果をSILOS3に 反映させます。 outputウインドウにエラーが無ければ、GOアイコン を 押して(4)に進みます。 outputウインドウにエラーが有れば、エラーメッセージを確認後 アイコン化していたmux21.tfを通常の大きさに戻し、 修正を繰り返します。
(4)テストフィクスチャにエラーが無ければ、下の画面で停止します(4)テストフィクスチャにエラーが無ければ、下の画面で停止します ので、シミュレーション時間1000nsを入力し、OKを押します。
(5)エラーが無ければ、outputウインドウに(5)エラーが無ければ、outputウインドウに 32 State changes on observable nets. Simulation stopped at the end of time 1.000us.が表示されるので データアナライザのアイコン を押して、波形表示ウインドウ を開きます。
次に、モジュールエクスプローラのアイコン を押して、次に、モジュールエクスプローラのアイコン を押して、 t:tのa,b,f,selを選択後、マウス右クリックから AddSignaltoAnalyzerを選ぶと、波形が表示されます。
データアナライザ・ウインドウをアクティブにしてから、 データアナライザ・ウインドウをアクティブにしてから、 View-ZoomAllを選ぶと、波形全体が表示されます。 sel=0の時f=b、 sel=1の時f=aを確認します。
(1)データアナライザ・ウインドウの時間軸上で、マウス右クリックし、(1)データアナライザ・ウインドウの時間軸上で、マウス右クリックし、 timescaleを選んで、切りの良い値を入れれば、時間軸を見やすい 値に変更できます。 (2)波形上でマウスを左クリックすると、青色の第1カーソル、 右クリックすると、赤色の第2カーソルを置くことができます。 各カーソルの時間および時間差がT1,T2,Tdeltaで表示されます。 (3)信号名を選択後、カーソルスキャン・アイコン を 押すと、カーソルが選択信号の変化点に移動します。 この機能を使って、入力信号a,b,selと出力信号fの時間差を 測定してみると、Tdelta=0になります。 これは、現在表示している結果が、遅延時間情報の入っていない 機能シミュレーション(Pre Layout)であるためです。 結果を確認したら、SILO3のFile-Exitを選び、途中、「はい」を 選んで終了します。
3.遅延シミュレーション(Post-Layout)3.遅延シミュレーション(Post-Layout) 再びSpDEのツールバーから、シミュレータのアイコン を 押して、SILOS3を起動します。 今度はシミュレーションタイプでPost-Layoutを選択します。 テストフィクスチャがmux21.tf、 SDFがmux21.sdf、 トップレベルモジュールがmux21.vq になっていることを 確認後、OKを押して下さい。
outputウインドウに92 State changes on observable nets. Simulation stopped at the end of time 1000.000ns.が表示され、 モジュールエクスプローラ、データアナライザウインドウも表示 されるので、ズームオール で波形全体を表示させます。
(1)波形上でマウスを左クリックすると、青色の第1カーソル、(1)波形上でマウスを左クリックすると、青色の第1カーソル、 右クリックすると、赤色の第2カーソルを置くことができます。 各カーソルの時間および時間差がT1,T2,Tdeltaで表示されます。 (2)信号名を選択後、カーソルスキャン・アイコン を 押すと、カーソルが選択信号の変化点に移動します。 この機能を使って、入力信号a,b,selと出力信号fの時間差を 測定してみると、今度はTdelta=9ns程度が表示されます。 これは、現在表示している結果が、遅延時間情報(mux21.sdf) を考慮した遅延シミュレーション(Post Layout)であるためです。 また、Verilogコードも元のmux21.vではなく、配置配線ツール の出力したmux21.vqが使用されています。 SDFはスタンダード・ディレイ・フォーマットといい、遅延時間情報の 標準フォーマットです。 結果を確認したら、SILO3のFile-Exitを選び、終了します。 興味があれば、*.sdf、*.vqをエディタで開いて見て下さい。
問題4 インバータLS04.vのテストパターンを設計し、問題4 インバータLS04.vのテストパターンを設計し、 機能シミュレーションと遅延シミュレーションを 実行しなさい。 問題5 NANDゲートLS00.vのテストパターンを設計し、 機能シミュレーションと遅延シミュレーションを 実行しなさい。 問題6 NORゲートLS02.vのテストパターンを設計し、 機能シミュレーションと遅延シミュレーションを 実行しなさい。
4.ピン配置の指定 ピン配置は配置配線ツールが遅延時間や配線効率を考慮して 最適に近いものに自動配置するので、これを使うのが無難です。 しかし、設計の最終段階に近く、プリント基板の変更ができない 場合などは、次の方法でピン配置を直接指定することも可能です。 SpDEのTools-Optionsメニューから、BackAnnotationタブ を選択し、FixPlacementのIOcellsをチェックonにします。
OKを選択後、RunToolsアイコン を押して、配置配線を OKを選択後、RunToolsアイコン を押して、配置配線を 実行すると、ピン配置情報mux21.scpが生成されます。 現在、ピン16,17,18,19が割り当てられていることを確認 します。(マシンによっては異なることも有ります。) エディタでql_placement以下のピン番号を変更し、保存します。 #mux21.scp #Synplicity Synthesis pin location command file #Automatically generated by SpDE version SpDE 7.0 #Date: 8/10/98 at 10:02 # #---Fixed I/O cells--- portprop f ql_placement="IO2"; portprop a ql_placement="IO3"; portprop sel ql_placement="IO4"; portprop b ql_placement="IO5";
論理合成Synplifyを立ち上げて、Addボタンを押します。 論理合成Synplifyを立ち上げて、Addボタンを押します。 ファイルの種類をPropertyFiles(*.sc*)にして、 mux21.scpを選択し、「開く」を押します。
SourceFilesにmux21.scpが追加されたことを確認後、 SourceFilesにmux21.scpが追加されたことを確認後、 RUNを押して論理合成をかけます。 途中「はい」とOKを選択すると、mux21.scpで指定した ピン配置での配置配線が実行されます。
Verilog設計演習Ⅲ 基 礎 編広島県立西部工業技術センターVerilog設計演習Ⅲ 基 礎 編広島県立西部工業技術センター