1 / 92

Verilog設計演習 Ⅰ   入 門 編 広島県立西部工業技術センター

Verilog設計演習 Ⅰ   入 門 編 広島県立西部工業技術センター. 1.作業ディレクトリの作成  まず、エクスプローラを起動し、  ルートディレクトリの下にseminarというディレクトリを、  その下にVerilogというディレクトリを作成して下さい。 ( DOS/V の場合) C:¥seminar¥Verilog (98の場合) A:¥seminar¥Verilog 以下、Verilog演習で作成するファイルはVerilogの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。. A. B. F. C. D.

brina
Download Presentation

Verilog設計演習 Ⅰ   入 門 編 広島県立西部工業技術センター

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Verilog設計演習Ⅰ  入 門 編広島県立西部工業技術センターVerilog設計演習Ⅰ  入 門 編広島県立西部工業技術センター

  2. 1.作業ディレクトリの作成  まず、エクスプローラを起動し、  ルートディレクトリの下にseminarというディレクトリを、  その下にVerilogというディレクトリを作成して下さい。 (DOS/Vの場合) C:¥seminar¥Verilog (98の場合) A:¥seminar¥Verilog 以下、Verilog演習で作成するファイルはVerilogの下に作ります。 それ以外の、ディレクトリには何も作らないで下さい。

  3. 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

  4. (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)わかりやすい様に( )を使ってよい。

  5. クイックロジック社QuickWorks 配置配線ツールSpDE 兼 統合化環境 回路図入力 SYNARIO 論理合成 Synplify Verilogシミュレータ SILOSⅢ Verilog学習 VHDL学習 HDLエディタ ターボライタ

  6. 3.SpDEの起動  スタート - プログラム - QuickLogic ー SpDEで SpDEを起動します。

  7. 4.HDLエディタの起動 SpDEのツールバーから、HDLエディタのアイコン   を 押して、HDLエディタを起動し、クリエイトアイコン   を押す。

  8. 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を指定し、論理合成ツールを 起動します。

  9. 7.ターゲットデバイスの指定と論理合成  RUNボタンのすぐ上のChangeボタンを押して、 Partをp8x12b、Packageをpl44に変更し、OKを押します。 次に、RUNボタンを押して、論理合成をかけます。

  10. 8.エラーの修正  ソースファイルにエラーがあると、下の画面で停止します。 ViewLogボタンでエラー内容を確認した後、Editボタンを 押して、HDLエディタを再度起動し、エラー箇所を修正します。

  11. 9.論理合成プロジェクトの保存  エラーがなければDoneが表示されて、下の画面で停止します。 「はい」を選んで論理合成プロジェクトを保存し、SpDEに戻ります。

  12. 10.配置配線の実行  SpDEのツールバーからRunToolsアイコン   を押して、 配置配線を実行します。途中、RUNと「いいえ」を選択します。

  13. 11.配置配線結果の確認  SpDEツールバーからFullFitアイコン   を選択し、 チップ全体を表示させます。

  14.  次に、View-NormalFitメニューを選択し、Zカーソルを 次に、View-NormalFitメニューを選択し、Zカーソルを 回路のある部分でクリックして、回路部分を拡大表示します。  さらに拡大したければZoomInアイコン   を使います。

  15.  回路部分のみを拡大すると、下図のようになります。 回路部分のみを拡大すると、下図のようになります。 台形印のセレクタは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

  16. 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

  17. (1)やや複雑な機能を記述する時は,wireで宣言した(1)やや複雑な機能を記述する時は,wireで宣言した    ローカル信号を使うこともできる。 ab,cd,o (2)1ビット幅のwireは宣言なしでも使える。暗黙宣言。    後出の複数ビット幅のwireは宣言が必要。 (3)//は1行のみのコメント行。 /*・・・・・*/は複数行にわたるコメント行である。 修正が終わったらソースコードを保存し、論理合成をかけて 配置配線を実行して下さい。結果は同じになります。

  18. 問題1  インバータLS04.vを設計し、結果を確認しなさい。 問題2  NANDゲートLS00.vを設計し、結果を確認しなさい。 問題3  NORゲートLS02.vを設計し、結果を確認しなさい。

  19. 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

  20. (1)もっと複雑な回路記述には階層設計を使う。(1)もっと複雑な回路記述には階層設計を使う。 (2) 階層設計は,複数のモジュール宣言と モジュールインスタンスで行う。 (3) 複数モジュールの宣言は, invの様に,同一ファイル内に書いても良いし, aoiの様に,別ファイルに書いて,`includeしても良い。 (4) モジュールインスタンスは,サブルーチンコールの様なもので, モジュール名 インスタンス名(ポートリスト); の形式で行う。上の例では,g1,g2,g3がインスタンス名。

  21. (5) モジュールインスタンスのポートリストは上位モジュールと 下位モジュールを接続するもので, g1,g2の様に,並びによる接続が一般的。 g3の様に,名前による接続も使える。 (6) 出力信号を接続しない時はカンマを余分に書く。 (7) 上の例ではselbとfbは,暗黙宣言されたwireである。 ※ `はバック・シングル・クォートで DOSVでは shift + @ 98 では shift + ^ shift + 7 ではないことに注意。

  22. 例題2を入力し、論理合成、配置配線を実行します。例題2を入力し、論理合成、配置配線を実行します。 結果は、論理圧縮の効果で例題1より簡単になり、 下図のようになります。 sel=1なら f=a sel=0なら f=b となっています。 b a sel f

  23. 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になる。

  24. 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ブロックの中で記述する。

  25. (2)always文は always@(信号名) begin : : end   ←セミコロンがないのに注意 の形で記述し,( )内の信号名の値が変化したときのみ評価される。 つまり,( )内にはalwaysブロックとしての入力信号を記述する。 正しくはセンシティビティ・リストという。  複数の入力信号が有る時は,カンマではなく orで区切って記述する。 (3)alwaysブロックで組合せ回路を生成する場合,入力信号を 全てセンシティビティ・リストに記述しなければならない。  (順序回路の場合はそうとは限らない)

  26. (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です。

  27. (7)最も重要なのは,alwaysブロック内での ・信号代入には,assign文は使わないこと。 ・代入文の左辺にくる信号は,レジスタ宣言  しなければならないこと。 である。上の例では f がこれにあたる。 (8)上の例からわかる様に,生成される回路が組合せ回路で  あってもレジスタ宣言が必要である。逆に言うと,レジスタ宣言  してもフリップフロップが必ず生成されるわけではない。 (9)if文で全ての条件が列挙されていれば,つまり, ifの数だけelseがあれば,組合せ回路が,   そうでなければ,順序回路が生成される。 例題3を入力し、論理合成、配置配線を実行します。 結果は例題2と同じになります。

  28.  Verilog設計演習Ⅱ シミュレーション編広島県立西部工業技術センター Verilog設計演習Ⅱ シミュレーション編広島県立西部工業技術センター

  29. 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

  30. (1)timescale文はシミュレーションの時間単位を定めるもので、(1)timescale文はシミュレーションの時間単位を定めるもので、   /の前がこのモジュール内での時間記述#の時間単位、   /の後ろがシミュレーション時に使用される時間精度   になります。この例ではいずれも1nsになります。 (2)テストフィクスチャのモジュールには、ポートリストが有りません。   モジュール名は何でもかまいませんが、ここでは t です。 (3)元の設計データの入力信号は、このモジュール内では値を代入   するので、レジスタ宣言します。 (4)出力信号は観測するだけなので、ワイヤ宣言します。 (5)元の設計データをモジュールインスタンスとして、呼び出します。   信号の接続には、名前による接続が行われていますが、   並びによる接続でも構いません。 (6)この位置に、実際のテストパターン用コードを追加します。

  31. `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 毎に異なる値を代入しています。

  32. 2.機能シミュレーション(Pre-Layout)2.機能シミュレーション(Pre-Layout) (1)SpDEのツールバーから、シミュレータのアイコン   を 押して、SILOS3を起動します。  シミュレーションタイプでPre-Layoutを選択します。 テストフィクスチャがmux21.tf、 トップレベルモジュールがmux21.vになっていることを 確認後、OKを押して下さい。

  33. (2)mux21.vは論理合成のチェックを通っているので、(2)mux21.vは論理合成のチェックを通っているので、 エラーがあるとすればmux21.tfの方です。  エラーがあるとoutputウインドウにエラーメッセージが表示され、 下の画面で停止するので、キャンセルを押します。  outputウインドウにエラーがなければ、(4)に進みます。

  34. (3)エラーメッセージを確認後、SILOS3のFileーOpenメニュー(3)エラーメッセージを確認後、SILOS3のFileーOpenメニュー からmux21.tfを選択し、エラー箇所を修正します。  修正が終わったら、SILOS3のFile-Saveで保存し、 mux21.tfウインドウのアイコン化ボタン   でアイコン化します。  Load/Reloadアイコン   を押して、修正結果をSILOS3に 反映させます。  outputウインドウにエラーが無ければ、GOアイコン   を 押して(4)に進みます。  outputウインドウにエラーが有れば、エラーメッセージを確認後 アイコン化していたmux21.tfを通常の大きさに戻し、 修正を繰り返します。

  35. (4)テストフィクスチャにエラーが無ければ、下の画面で停止します(4)テストフィクスチャにエラーが無ければ、下の画面で停止します ので、シミュレーション時間1000nsを入力し、OKを押します。

  36. (5)エラーが無ければ、outputウインドウに(5)エラーが無ければ、outputウインドウに 32 State changes on observable nets. Simulation stopped at the end of time 1.000us.が表示されるので データアナライザのアイコン   を押して、波形表示ウインドウ を開きます。

  37. 次に、モジュールエクスプローラのアイコン   を押して、次に、モジュールエクスプローラのアイコン   を押して、 t:tのa,b,f,selを選択後、マウス右クリックから AddSignaltoAnalyzerを選ぶと、波形が表示されます。

  38.  データアナライザ・ウインドウをアクティブにしてから、 データアナライザ・ウインドウをアクティブにしてから、 View-ZoomAllを選ぶと、波形全体が表示されます。 sel=0の時f=b、   sel=1の時f=aを確認します。

  39. (1)データアナライザ・ウインドウの時間軸上で、マウス右クリックし、(1)データアナライザ・ウインドウの時間軸上で、マウス右クリックし、 timescaleを選んで、切りの良い値を入れれば、時間軸を見やすい 値に変更できます。 (2)波形上でマウスを左クリックすると、青色の第1カーソル、 右クリックすると、赤色の第2カーソルを置くことができます。 各カーソルの時間および時間差がT1,T2,Tdeltaで表示されます。 (3)信号名を選択後、カーソルスキャン・アイコン           を 押すと、カーソルが選択信号の変化点に移動します。  この機能を使って、入力信号a,b,selと出力信号fの時間差を 測定してみると、Tdelta=0になります。  これは、現在表示している結果が、遅延時間情報の入っていない 機能シミュレーション(Pre Layout)であるためです。  結果を確認したら、SILO3のFile-Exitを選び、途中、「はい」を 選んで終了します。

  40. 3.遅延シミュレーション(Post-Layout)3.遅延シミュレーション(Post-Layout)  再びSpDEのツールバーから、シミュレータのアイコン   を 押して、SILOS3を起動します。  今度はシミュレーションタイプでPost-Layoutを選択します。 テストフィクスチャがmux21.tf、 SDFがmux21.sdf、 トップレベルモジュールがmux21.vq になっていることを 確認後、OKを押して下さい。

  41. 1000nsを確認後、OKを押します。

  42. outputウインドウに92 State changes on observable nets. Simulation stopped at the end of time 1000.000ns.が表示され、 モジュールエクスプローラ、データアナライザウインドウも表示 されるので、ズームオール   で波形全体を表示させます。

  43. (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をエディタで開いて見て下さい。

  44. 遅延シミュレーションの結果

  45. 問題4 インバータLS04.vのテストパターンを設計し、問題4 インバータLS04.vのテストパターンを設計し、      機能シミュレーションと遅延シミュレーションを  実行しなさい。 問題5 NANDゲートLS00.vのテストパターンを設計し、      機能シミュレーションと遅延シミュレーションを  実行しなさい。 問題6 NORゲートLS02.vのテストパターンを設計し、      機能シミュレーションと遅延シミュレーションを  実行しなさい。

  46. 4.ピン配置の指定  ピン配置は配置配線ツールが遅延時間や配線効率を考慮して 最適に近いものに自動配置するので、これを使うのが無難です。  しかし、設計の最終段階に近く、プリント基板の変更ができない 場合などは、次の方法でピン配置を直接指定することも可能です。  SpDEのTools-Optionsメニューから、BackAnnotationタブ を選択し、FixPlacementのIOcellsをチェックonにします。

  47.  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";

  48.  論理合成Synplifyを立ち上げて、Addボタンを押します。 論理合成Synplifyを立ち上げて、Addボタンを押します。 ファイルの種類をPropertyFiles(*.sc*)にして、 mux21.scpを選択し、「開く」を押します。

  49.  SourceFilesにmux21.scpが追加されたことを確認後、 SourceFilesにmux21.scpが追加されたことを確認後、 RUNを押して論理合成をかけます。  途中「はい」とOKを選択すると、mux21.scpで指定した ピン配置での配置配線が実行されます。

  50. Verilog設計演習Ⅲ  基 礎 編広島県立西部工業技術センターVerilog設計演習Ⅲ  基 礎 編広島県立西部工業技術センター

More Related