310 likes | 816 Views
2011/4/25 ディジタル情報回路 講義資料. Verilog-HDL を用いた ハードウェア設計 第1回レポート出題. 1. Introduction 2. Features of Verilog-HDL 3. Syntax Guide 4. Description Style 5. Test Bench Description 6. Assignment 7. Conclusion. Outline. 教. 1 . Introduction. LSI 設計における HDL. < LSI 設計フロー>. システム LSI. 仕様.
E N D
2011/4/25 ディジタル情報回路 講義資料 Verilog-HDLを用いた ハードウェア設計 第1回レポート出題
1. Introduction 2. Features of Verilog-HDL 3. Syntax Guide 4. Description Style 5. Test Bench Description 6. Assignment 7. Conclusion Outline
教 1.Introduction LSI設計におけるHDL <LSI設計フロー> システムLSI 仕様 ゲート数: 億単位 回路図による設計は困難 言語ベースの設計が主流 システム設計 RTL† 記述 RTL† 記述 RTL記述 HDL*(ハードウェア記述言語) 論理合成 代表例 ネットリスト ・ Verilog-HDL ・ Verilog-HDL レイアウト ・ VHDL p. 112 マスクパターン †Register Transfer Level 製造へ * Hardware Description Language
2.Features of Verilog-HDL Verilog-HDLの特徴 ・ 文法がC言語に似ている C言語と対比させて説明 ・ シミュレーション環境が充実している iverilog,Verilog-XL,VeriLogger Pro ・ 抽象度が低い(VHDLと比べて) 回路をイメージできる必要がある ・ 並列的な命令の記述が可能 ノンブロッキング代入文
教 2.Features of Verilog-HDL ・ ブロッキング代入文とノンブロッキング代入文 ブロッキング代入文 (順次処理) initial begin a = 3 ; b = 5 ; #10 a = b + 1 ; b = a + 1 ; end ノンブロッキング代入文 (並列転送) initial begin a <= 3 ; b <= 5 ; #10 a <= b + 1 ; b <= a + 1 ; end a = 3 に続いて b = 5 同時刻に行う代入文の 右辺評価終了後に代入 a = b + 1 (= 6) に続いて b = a + 1 (= 7) を代入 右辺のみ先に評価: b + 1 = 6,a + 1 = 4 a = 6 と b = 4 の同時代入 a = 6 の後で b = 7 を代入 シフトレジスタのような 並列転送を記述可能 p. 252, 260, 317
3.Syntax Guide 識別子 : ・ 英字もしくはアンダスコア( _ )で始める文字列 ・ 文字列中には,英字,数字,アンダスコア( _ ), ドル記号($)を含むことができる ・ 大文字と小文字は区別される <記述例> ・ 正しい識別子 cnt4,_reset,TEN$,INPUT(予約語のinputとは区別) ・ 誤った識別子 74LS00(先頭が数字),$test(先頭が$),xor(予約語)
3.Syntax Guide 数値表現形式 : ss’f nnn. ..n ・ ss : 定数の ビット幅 を表す10進数値 ・ f : 基数 を表す文字 d (decimal :10進),h (hexadecimal : 16進) o (octal :8進),b (binary :2進) ・ nnn. ..n : 定数値 各基数で許される値,x,z が記述可能 途中のアンダースコア _ は無視: 区切りに使える <記述例> 数値定数 →2進数表現 8’haa →1010_1010 4’b0100 →0100 10 →00…01010
LSI : NUMA-01 教 4.Description Style ・ Verilog-HDLの記述スタイル pp. 113-115 ・ 構造記述(ゲート・レベル記述) ネットリストと等価 人手で書くことは少ない (ツール間インターフェース用) ・ RTL記述(ブロック図レベル記述) “Module” モジュール:回路を記述する基本構造 keyin cntblk disp ctrl clkgen
教 4.Description Style ・ モジュール構造 pp. 116-117 modulecounter(clk, res, out); C言語(旧K&R)と対比 モジュール名 ポート・リスト intfunc(a, b, c); 入出力ポート宣言 inta,b,c レジスタ宣言 ネット宣言 パラメータ宣言 { intx x = a + b; c = x *a; モジュール構成要素 下位モジュール呼び出し always文 assign文 など } endmodule
input clk, res; input [7:0]bus1, bus2; output busy; inout [15:0] dbus; // 入力 // 入力 バス信号 // 出力 // 双方向バス信号 4.Description Style ・ ポート宣言 ポート宣言例 ビット幅の指定 C言語における配列のイメージ [MSB,LSB] として扱う あまり使わないが[16:1]や[0:15]でも可能 1ビットのときは特に指定しない
wireenb1; wire[7:0]bus; wire#3000trig; // バス信号 // 遅延付加ネット regff1, ff2; reg[3:0]cnt4; reg[7:0]mem[0:255]; //4bit レジスタ //256 byteメモリ 4.Description Style ・ ネット宣言,レジスタ宣言 ネット宣言例 レジスタ宣言例
4.Description Style ・ パラメータ宣言 パラメータ宣言例 parameterSTEP=1000; parameterMEMSIZE=1024; reg[7:0]mem[0:MEMSIZE-1] //1クロック周期 // 使用例 C言語における定義(define)文 #definePAI3.14// 円周率 #defineN20 // 配列の箱の数
4.Description Style モジュール構成要素 ・ 手続きブロック initialブロック or alwaysブロック 手続き代入文 : 手続きブロック中の代入文 左辺 : reg型の信号 ・ 継続的代入文 assign文 : wireが他の信号の影響を受けて常時伝搬 左辺 : wire型の信号 手続きブロック外に記述
alwaysを使って,組合せ回路の動作を手続き的に記述可能だが,条件列挙(else)を忘れるとラッチにalwaysを使って,組合せ回路の動作を手続き的に記述可能だが,条件列挙(else)を忘れるとラッチに 教 4.Description Style ・ RTL記述(順序回路: トランスペアレント型ラッチ ) ・ always @ (G or D) … G or D の信号値変化時に …の手続きブロックを実行 ・ alwaysによる記述 modulelatch (G,D,Q); inputG,D; outputQ; regQ; always @ (G or D) if (G) Q <= D; endmodule 動作 ・ G = 1 イベント式 D → Qへデータが つつぬける ・ G = 0 Dが変化しても Qは変化しない p. 251
教 4.Description Style ・ RTL記述(順序回路: 同期リセット付きエッジトリガ型FF) ・ alwaysによる記述 ・ always @ (posedge clk) … clk の 0 → 1 変化時 に … の手続きブロックを実行 moduledff (clk,R,D,Q); inputclk,R,D; outputQ; regQ; always @ (posedge clk) begin if (R) Q <= 0; else Q <= D; end endmodule 動作 イベント式 ・ R = 1 (リセット/正論理※) clk の立ち上がり時に Q = 0 ・ R = 0 “or posedge R” を付加 すると非同期リセットに clk の立ち上がり時に Q = D ※ No. 19 の res など,負論理で 扱うことも多いので要注意 p. 273 nReset
assignna= ~(in1 & in2); assignout = (sel == 1) ? d1 : d0; assigncarry = (cnt10 == 4’h9); assignsum = a+b; //2入力NAND // セレクタ // 桁上がり信号 // 加算回路 a in1 sum na in2 b 4.Description Style ・ RTL記述(組合せ回路) ・ assignによる記述 2入力NAND 加算回路
function名(戻り値) 入力宣言 動作記述 functionの終了 functionの使用 教 4.Description Style ・ RTL記述(組合せ回路) p. 129 ・ functionによる記述 moduledec1to2 (din, dout); inputdin; output[1:0]dout; function[1:0]dec; inputdin; begin case (din) 1’h0 : dec = 2’b01; 1’h1 : dec = 2’b10; endcase end endfunction assigndout = dec (din); endmodule
教 4.Description Style ・ 下位モジュール呼び出し pp. 114-115 moduleff4 (clk, D,Q); inputclk; input[3:0]D; output[3:0]Q; ffF0( .D(D [0]),.Q(Q [0]),.clk(clk)); ffF1( .D(D [1]),.Q(Q [1]),.clk(clk)); ffF2( .D(D [2]),.Q(Q [2]),.clk(clk)); ffF3( .D(D [3]),.Q(Q [3]),.clk(clk)); endmodule moduleff (clk, D,Q); inputclk,D; outputQ; ・・・・・・・ ・・・・・・・ ・・・・・・・ ・・・・・・・ endmodule D[2] D[0] D[3] D[1] clk D D D D F0 F1 F2 F3 clk clk clk clk Q Q Q Q Q[3] Q[2] Q[1] Q[0]
回路ごとにテストベンチは異なる 教 5.Test Bench Description ・ 4 ビットカウンタとテストベンチの記述 p. 302(参考) module count4r (clk, res , out) ; input clk, res ; output [ 3 : 0 ] out ; reg [ 3 : 0 ] q ; always @ ( posedge clk ) begin if ( res )// clk↑の際に res = 1 なら q <= 0 ; else // clk↑の際に res = 0 なら q <= q + 1 ; end assign out = q; endmodule module test_counter ; wire [3:0] out; reg clk, res; initial begin $monitor(“%t %b %b %b”,$time,clk,res,out); clk <= 0; res <= 0; #40 res <= 1; #350 $finish; end always #10 // 10単位時間毎に clk を反転 begin clk <= ~clk; end count4r inst (clk,res, out); // モジュール呼出し endmodule 出力書式指定
6.Assignment (第1回 レポート出題) Verilog-HDLを用いたハードウェア設計 以下の (1) と (2) それぞれについて記述せよ (1) 組合せ回路 (構造記述:Gate水準記述 or RTL記述) 加算器,エンコーダ,デコーダ,コンパレータ, パリティチェッカ,カウンタ,バレルシフタ,ほか (2) 順序回路 (同期リセット or 非同期リセット付き) 各種フリップフロップ,n進カウンタ, 符号化カウンタ(ジョンソン,グレイ,リング), 擬似ランダム符号系列発生回路(LFSR),ほか
6.Assignment ・ 〆切+評価 〆切 ・ 2011/5/30 講義開始前に教卓に 評価 ・ 基本点 : 10点 (状況により変動) ・ 加点対象 : 内容により +5点 シミュレーション実行 (iVerilogを使用) 波形シミュレーション実行 (GTKwaveを使用) 最高 15点 インストール方法は こちら→ http://cas.eedept.kobe-u.ac.jp/~sugar/pdf/v_install.pdf
入出力 ネット・レジスタ宣言 moduleで始まりendmoduleで終わる initial文 すぐに実行 function文 case文 (条件分岐) function文 always等の 内でしか使用不可 always文 assign文 6.Assignment ・ 例 擬似電卓(第2回?) module calculation (equal, cal, in1, in2, out) ; input equal ; input [1:0] cal ; input [3:0] in1, in2 ; output [7:0] out ; reg [7:0] q ; initial q <= 8’b00000000 ; function [7:0] manipulator; input [3:0] inA, inB ; input [1:0] cal ; case (cal) 2’b00:manipulator = inA + inB; 2’b01: manipulator = inA - inB; 2’b10:manipulator = inA * inB; 2’b11: manipulator = inA / inB; endcase endfunction always@ ( posege equal ) begin q <= manipulator ( in1, in2, cal ) ; end assign out = q; endmodule
6.Assignment ・ GTKWaveを使用する際のテストベンチ module test_counter ; wire [3:0] out; reg clk, res; initial begin $dumpfile("counter4r.vcd"); $dumpvars(0,test_counter); $monitor(“%t %b %b %b”,$time,clk,res,out); clk <= 0; res <= 0; : : count4r inst (clk,res, out); endmodule $monitorの前に2行追加する GTKWave用の実行ファイル GTKWave用の時間設定 トップモジュール名にする (ここではテストベンチ名)
7.Conclusion ・ まとめと今後の課題 <まとめ> ・ LSI設計におけるHDLの位置付け ・ Verilog-HDLの記述法の説明 ・ Verilog-HDLを用いたハードウェア設計法の説明 ・ 必修レポート課題の説明 <今後の課題> ・ 設計する回路の規模拡大 ・ テスト・ベンチ記述をもちいたシミュレーション
困ったときは… ・ 講義サポートページ(Verilog)http://cas.eedept.kobe-u.ac.jp/numa/lect/verilog/ ・ 新居良祐サポートページhttp://cas.eedept.kobe-u.ac.jp/~arai/ B-406沼 4階 N 電気事務室 (3階) B-408
講義サポートページ ユーザ verilog パスワード 講義で
Verilog HDL ビデオ講習会 5月12日(木)15:00~16:50C4-201 広島市立大学 助教授 越智裕之先生 (現在,京都大学准教授)
C言語 System Verilog まだまだ 発展途上 System C Verilog Appendix ・ HDLとSystem C,System Verilog ? ? Spec C Bach C
Appendix ・ 不定値 x とハイ・インピーダンス z 論理シミュレーション実行後 信号の値が不定値になる ・ まだ値が代入されていないreg型の信号 ・ 複数の信号が競合したwire型の信号 ・ 明示的に不定値を与えた場合 ・ 不定値を含む演算の結果 信号の値がハイ・インピーダンスになる ・ 何も接続されていないwire型の信号 ・ 明示的にハイ・インピーダンスを与えた場合
Appendix ・ alwaysブロックによる組み合わせ回路の記述 <制約> moduledec1to2 (dindout); inputdin; output[1:0]dout; reg [1:0] dout; always @ (din); begin case (din) 1’h0 : dout <= 2’b01; 1’h1 : dout <= 2’b10; endcase end endmodule ・ 出力をreg宣言する ・ always文の@以降に, すべての入力を記述 functionで代用可能なので, あまり用いられない