VLSI設計論第3回 順序回路の記述と論理合成 慶應義塾大学 理工学部 情報工学科 天野
always文を使った順序回路 assign文を使って常に出力する組み合わせ回路と違って順序回路はレジスタに値をセットするタイミングを示す必要がある。 reg [3:0] accum; alu alu0(.ina(accum), .inb(din), .com(com), .y(alu_y)); always@(posedge clock) begin accum <= alu_y; end clockがL→Hに変化した際に生じるregへの値のセットについての操作をbegin end内に記述 値のセットは<=を利用 if, caseが利用可 複数のレジスタを同じ文中で扱える。でも注意! タイミング記述 negedge : 立下り or : 値のセットするタイミングが複数ある場合
同期リセット、非同期リセット rst_がLになったらすぐにリセット:非同期 rst_がLになり、クロックが立ち下がったときにリセット:同期 always@(posedge clock or negedge rst_) begin if(rst_ == `Enable_) accm <= 4’b0000; else accum <= alu_y; end rst_がLになったらすぐにリセット:非同期 always@(posedge clock) begin rst_がLになり、クロックが立ち下がったときにリセット:同期
アキュムレータデータパスの記述 module acdpath(clock, din, com, acout); input clock; input [3:0] din; input [2:0] com; output [3:0] acout; reg [3:0] accum; wire [3:0] alu_y; assign acout = accum; alu alu0(.ina(accum), .inb(din), .com(com), .y(alu_y)); always@(posedge clock) begin accum <= alu_y; end endmodule 本当はちゃんと`defineで定義して
メモリの記述 regの配列で記述 reg [3:0] mem[0:15]; assign dr = mem[adr]; 読み出し 4ビット幅、16エントリのメモリが宣言される 深さ方向は、2のべき乗でなくても良いが、半端な値にしても通常意味はない assign dr = mem[adr]; 読み出し mem[adr] <= dw; 書き込み(通常always文中) 通常合成はしないので注意!(今回は小さいのでやってしまうが、、) bit幅 深さ エントリ数
メモリを付けてみる module acdpath(clock, adr, com, acout); input clock; input [3:0] adr; input [2:0] com; output [3:0] acout; reg [3:0] accum; reg [3:0] mem[15:0]; wire [3:0] alu_y, rd; assign acout = accum; assign rd = mem[adr]; alu alu0(.ina(accum), .inb(rd), .com(com), .y(alu_y)); always@(posedge clock) begin if(com == `ST) mem[adr] <= accum; else accum <= alu_y; end endmodule
always文ではなぜなんでも書けるのか? 動作がクロックのエッジに同期している 左に来るのはレジスタ、メモリのみ 条件に合わないものは、今までのデータを保持していれば良い 複数のレジスタ、メモリを同じalways文で扱える しかし、やりすぎてはいけない always@(posedge clock) begin if(com == `ST) mem[adr] <= accum; end if(com!=`ST) accum <= alu_y; end の方がベターかも。もっとも厳格には、一つのレジスタについて一つのalways文を使う。しかし、見易さを重視すべきかもしれない、、 この機能を利用して組み合わせ回路を書いてしまうこともある
テストベンチ 一定の幅のクロックを発生 → always文の利用 メモリの初期設定 → ファイルから入力することが可能 メモリの初期設定 → ファイルから入力することが可能 一定時間経過後に$finish;で止めてやる
論理合成:design_visionの起動 コマンドラインに以下のように入力 % design_vision & 左記のようなウィンドウが立ち上がる。 注意 論理合成をするファイルがあるディレクトリで実行 すること Verilog-XLと同様にVDECでライセンスの認証を行うため、それに失敗すると起動しない。 論理合成をしたいファイルを読み込む時に、別のディレクトリのファイルを指定するとErrorとなる。
design_vision:設定の確認 Setup を選択すると.synopsys_dc.setupで 指定された情報が表示
design_vision:ファイルリード 論理合成をするファイルは File → Read を選択し表示されるウィンドウから選択 注意! Readコマンドを用いる場合は論理合成するファイルを読み込む前に、カレントディレクトリにWORKというディレクトリを作っておく必要がある。これはdesign_analyzerがファイルを読み込む時に、WORKディレクトリに一時ファイルを作成するからである。もしWORKディレクトリがないとErrorとなってファイルを読み込むことができない。なお、AnalyzeコマンドとElaborateコマンドを用いると自動でWORKディレクトリを作成することができる。
design_vision:読み込みのログ 読み込んだverilogファイルに文法エラー がなければ論理合成可能 ファイルを読み込む時のログは、カレントディレクトリのview_command.logというファイルに書き込まれる。desigan_alalyzerを起動している間、ログはこのファイルには追加書き込みされていく。一度design_analyzerを終了させてもう一度起動させると、ログファイルは上書きされる。
design_vision:論理合成前 問題がなくファイルを読み込めた場合、読み込んだモジュール名と、まだネットリストではないことを示す箱が表示 複数のモジュールを同時に読み込むと、それらも同時に表示される。どれか1つを選択したいときはそのモジュールをクリックすれば良い。またマウスボタンを押しながらカーソルを移動させ、複数モジュールを選択することもできる。 重要! 同じモジュールをその上位モジュールで複数使用する場合は、その上位モジュールを選択してから File → hierarchy → uniquify と指定する。
design_vision:論理合成前 箱をクリックすると 回路図っぽいのが 現れるが、これは 実は合成前 複数のモジュールを同時に読み込むと、それらも同時に表示される。どれか1つを選択したいときはそのモジュールをクリックすれば良い。またマウスボタンを押しながらカーソルを移動させ、複数モジュールを選択することもできる。 重要! 同じモジュールをその上位モジュールで複数使用する場合は、その上位モジュールを選択してから File → hierarchy → uniquify と指定する。
design_vision:合成条件指定 Atributes:動作クロックやチップ面積など論理合成で与える条件の指定 ここで指定できる値はあくまで目標値である。そのためチップ面積を0に指定することもできる。勿論面積0というのは実現できないが、それにできるだけ近づけるように、つまり面積が最小となるように論理合成を行う。 同じように出力の遅延時間が0になるように指定すると、より高速な回路を合成する。
design_vision:論理合成開始 Design → Compile Design を選択し、ウィンドウのOKを押すと論理合成を開始 複数のモジュールから構成される回路を合成する場合、トップモジュールを指定して論理合成を行うと下位モジュールの合成も同時に行う。
design_vision:合成の終了 メニューのAND印をクリックすると回路図を表示 レジスタなどを使わずに、全てがassign文によって配線されているだけのモジュールではファイルを読み込んだ時点で既にこの表示になっている。
design_vision: レポート 論理合成の結果を保存するファイルには、netやgateといった単語を付けてネットリストであると分かりやすくしておくと良い。また保存する形式をverilog形式にしておくと、後でverilogでのシミュレーションが可能である。保存したファイルの中身を見てみると、普通にverilogの文法で書かれたファイルとなっている。
design_vision: 階層構造があっても、Readする順番は問わない 最上位から合成を掛ければ大丈夫 最適化等細かい使い方は次回 合成後の仮遅延シミュレーションも次回
演習 1から6まで数えてstopを1にすると停止するサイコロカウンタを設計せよ テストベンチはdatapath_test.vを改造のこと シミュレーションして結果を確認、合成してゲート数を確認の上、天野(hunga@am.ics.keio.ac.jp)までソースとセル数をメールのこと