Verilog

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])までソース
とセル数をメールのこと