330 likes | 883 Views
Verilog-HDL を用いた ハードウェア設計. 電子情報工学講座 情報回路研究室 中西 将之. April 16th, 2004. Contents. 1. Introduction. 2. Features of Verilog-HDL. 3. Syntax Guide. 4. Description Style. 5. Test Bench Description. 6. Assignment. 7. Conclusion. 1 . Introduction. ・ LSI 設計における HDL. < LSI 設計フロー>. システム LSI.
E N D
Verilog-HDLを用いた ハードウェア設計 電子情報工学講座 情報回路研究室 中西 将之 April 16th, 2004
Contents 1. Introduction 2. Features of Verilog-HDL 3. Syntax Guide 4. Description Style 5. Test Bench Description 6. Assignment 7. Conclusion
1.Introduction ・ LSI設計におけるHDL <LSI設計フロー> システムLSI 仕様 ゲート数:1000万単位 回路図による設計は困難 言語ベースの設計が主流 システム設計 RTL† 記述 RTL† 記述 RTL記述 HDL*(ハードウェア記述言語) 論理合成 代表例 NETL†† ・ Verilog-HDL ・ Verilog-HDL レイアウト ・ VHDL マスクパターン †Register Transfer Level 製造へ ††Net List *Hardware Description Language
2.Features of Verilog-HDL Verilog-HDLの特徴 ・ 文法がC言語に似ている C言語と対比させて説明 ・ シミュレーション環境が充実している Verilog-XL,MAX + plusⅡ,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=6なので, b=7となる a=3なので, b=4となる 並列性のある命令の流れが 記述可能
3.Syntax Guide ・ 識別子 識別子 : ・ 英字もしくはアンダスコア( _ )で始める文字列 ・ 文字列中には,英字,数字,アンダスコア( _ ), ドル記号($)を含むことができる ・ 大文字と小文字は区別される <記述例> ・ 正しい識別子 cnt4,_reset,TEN$,INPUT(予約語のinputとは区別) ・ 誤った識別子 74LS00(先頭が数字),$test(先頭が$),xor(予約語)
3.Syntax Guide ・ 数値表現 数値表現形式 : sss. ..s’f nnn. ..n ・ sss. ..s : 定数のビット幅を表す10進数値 ・ f : 基数を表す文字 d (decimal :10進),h (hexadecimal : 16進) o (octal :8進),b (binary :2進) ・ nnn. ..n : 定数値 各基数で許される値の他,x,zが記述可能 <記述例> 数値定数 →2進数表現 8’haa →10101010 4‘b0100 →0100 10 →00…01010
module clkgen keyin cntblk disp ctrl LSI : NUMA-01 4.Description Style ・ Verilog-HDLの記述スタイル ・ 構造記述(ゲート・レベル記述) NETLと等価 あまり用いられない ・ RTL記述(ブロック図レベル記述) モジュール:回路を記述する基本構造
modulecounter(clk, res, out); モジュール名 ポート・リスト intfunc(a, b, c); 入出力ポート宣言 inta,b,c レジスタ宣言 ネット宣言 パラメータ宣言 { intx x = a + b; c = x *a; モジュール構成要素 下位モジュール呼び出し always文 assign文 など } endmodule 4.Description Style ・ モジュール構造 C言語と対比
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型の信号 手続きブロック外に記述
条件式 4.Description Style ・ RTL記述(順序回路) ・ alwaysによる記述 modulelatch (clk,D,Q); inputclk,D; outputQ; regQ; always @ (clk) begin Q <= D; end endmodule 動作 ・ clk = 1 D→Qへデータが つつぬける ・ clk = 0 Dが変化しても Qは変化しない
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記述(組み合わせ回路) ・ functionによる記述 moduledec1to2 (dindout); 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 edfunction assigndout = dec (din); endmodule
D [3] D [2] D [1] D [0] clk D D D D clk clk clk clk Q Q Q Q Q [3] Q [2] Q [1] Q [0] 4.Description Style ・ 下位モジュール呼び出し 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
5.Test Bench Description ・ テストベンチの記述(ex.4進カウンタ) module count4r (clk, res , out) ; input clk, res ; output [ 3 : 0 ] out ; reg [ 3 : 0 ] q ; always @ ( posedge clk ) begin if ( !res ) begin q <= 0 ; end else begin 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 begin clk <= ~clk; end count4r inst (out,clk,res); endmodule
6.Assignment ・ Verilog-HDLを用いたハードウェア設計 ・ 初級 エンコーダ,デコーダ,コンパレータ, パリティチェッカ,カウンタ,バレルシフタ ・ 中級 符号化カウンタ(ジョンソン,グレイ,リング), 擬似ランダム符号系列発生回路(PRBS) ・ 上級 三角関数発生装置,暗号(符号)化回路, 簡単なCPU
6.Assignment ・ 設計する回路の仕様(中級) ・ 符号化カウンタ Johnson Counter Gray Code Counter Ring Counter 0000 000 000 0000000 0001 001 001 0000001 0011 010 011 0000010 0111 011 010 0000100 1111 100 110 0001000 1110 101 111 0010000 1100 110 101 0100000 1000 111 100 1000000 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・
3 5 2 1 4 7 8 9 6 11 10 6.Assignment ・ 設計する回路の仕様(中級) ・ PRBS (Pseudo Random Binary Sequence) out reg xor 初期値: {11100011101}
6.Assignment ・ 設計する回路の仕様(上級) ・ 三角関数発生装置 区間 : [0,π/4] 保持する値 : 1,024個 アドレス(入力) 10bit 出力データ :14bit×2(sin,cos) 提供可能 ただ,case文で値をすべて保持しておくのではなく, 演算により三角関数の値を求める回路
6.Assignment ・ 〆切+評価 〆切 ・ 学部生 2004/6/11 講義開始前に教卓に ・ 院生 2003/6/25 評価 ・ 基本点 : 10点 ・ 加点対象 : 中級 +5点 最高 25点 上級 +10点 VeriLogger+5点
7.Conclusion ・ まとめと今後の課題 <This Time> ・ LSI設計におけるHDLの位置付け ・ Verilog-HDLの記述法の説明 ・ Verilog-HDLを用いたハードウェア設計法の説明 ・ 必修レポート課題の説明 <Future Work> ・ 設計する回路の規模拡大 ・ テスト・ベンチ記述をもちいたシミュレーション
D401 4階 N 沼 先生 電気事務室 (3階) HELP
Reference ・ 参考文献 [1] Design Wave Magazine 編集部 編, “システム&LSI設計スタートアップ”, CQ出版,1999年5月. [2] 浅田 邦博 編, “ディジタル集積回路の設計と試作”,培風館,2000年6月. [3] http://member.nifty.ne.jp/kumineko/verilog/
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で代用可能なので, あまり用いられない