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 : 値のセットするタイミングが複数ある場合 同期リセット、非同期リセット always@(posedge clock or negedge rst_) begin if(rst_ == `Enable_) accm <= 4’b0000; else accum <= alu_y; end rst_がLになったらすぐにリセット:非同期 always@(posedge clock) begin if(rst_ == `Enable_) accm <= 4’b0000; else accum <= alu_y; end rst_がLになり、クロックが立ち下がったときにリセット: 同期 アキュムレータデータパスの記述 module acdpath(clock, din, com, acout); 本当はちゃんと`defineで定義して 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 メモリの記述 regの配列で記述 bit幅 深さ reg [3:0] mem[0:15];エントリ数 4ビット幅、16エントリのメモリが宣言される 深さ方向は、2のべき乗でなくても良いが、半端な値 にしても通常意味はない assign dr = mem[adr]; 読み出し mem[adr] <= dw; 書き込み(通常always文中) 通常合成はしないので注意!(今回は小さいの でやってしまうが、、) メモリを付けてみる 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 always@(posedge clock) begin if(com!=`ST) accum <= alu_y; end の方がベターかも。もっとも厳格には、一つのレジスタについて一つ のalways文を使う。しかし、見易さを重視すべきかもしれない、、 この機能を利用して組み合わせ回路を書いてしまうこともある テストベンチ 一定の幅のクロックを発生 → always文 の利用 メモリの初期設定 → ファイルから入力 することが可能 一定時間経過後に$finish;で止めてやる 論理合成:design_visionの起動 コマンドラインに以下のように入力 % design_vision & 左記のようなウィン ドウが立ち上がる。 注意 論理合成をする ファイルがある ディレクトリで実行 すること design_vision:設定の確認 Setup を選択すると.synopsys_dc.setupで 指定された情報が表示 design_vision:ファイルリード 論理合成をするファイルは File → Read を選択し表示されるウィンドウから選択 design_vision:読み込みのログ 読み込んだverilogファイル に文法エラー がなければ論理合成可能 design_vision:論理合成前 問題がなくファイルを 読み込めた場合、読 み込んだモジュール名 と、まだネットリストで はないことを示す箱が 表示 design_vision:論理合成前 箱をクリックすると 回路図っぽいのが 現れるが、これは 実は合成前 design_vision:合成条件指定 Atributes:動作クロックやチップ面積など論理 合成で与える条件の指定 design_vision:論理合成開始 Design → Compile Design を選択し、ウィンドウのOKを押すと論理合成を開始 design_vision:合成の終了 メニューのAND印をクリックすると回路図を表示 design_vision: レポート design_vision: •階層構造があっても、Readする順番は問わない •最上位から合成を掛ければ大丈夫 •最適化等細かい使い方は次回 •合成後の仮遅延シミュレーションも次回 演習 1から6まで数えてstopを1にすると停止 するサイコロカウンタを設計せよ テストベンチはdatapath_test.vを改造の こと シミュレーションして結果を確認、合成し てゲート数を確認の上、天野 ([email protected])までソース とセル数をメールのこと
© Copyright 2025 ExpyDoc