Transcript Verilog

VLSI設計論第2回
組み合わせ回路の記述と
論理シミュレーション
慶應義塾大学 理工学部 情報工学科
天野
変数と定数

変数

wire宣言:信号に名前を付ける



reg宣言:データを記憶できるレジスタが生成



[最大:最小] 最小は通常0にすることが多い
定数

<ビット幅> ′<基数><数値>




reg dff;
reg [3:0] acc;
両方ともバスの宣言が可能


wire sign;
wire [3:0] data1;
基数は2進b,16進h、何もつかなければ10進数(32ビット)
16’b11001010
16’hca
プリプロセッサ
`defineでマジックナンバーを定義しておく
アクティブLの信号にはアンダースコアをつけるのがお勧め
assign文と論理演算

assign文





継続的な代入:配線が繋がっていていつでも出力される
左辺はwireのみ
assign y = a + b;
assign y = a & b|~a&~b;
普通の論理演算素子が使える(坂本マニュアル参照)





ちゃんとまともな優先順位がある(SFLとは違う)
加減乗除が書ける(しかし、乗算器、除算器などは大きいので注意)
リダクション演算はその演算記号を変数の前に付けるだけ
&aなど
二つのassign文は同時並行的に実行される

同じ出力に対して2つの文でassignするのはエラー
ビット切り出しと連結

ビット切り出し




wire [15:0] a;
wire [7:0] x,y;
assign x = a[15:8] & a[7:0];
連結




assign a = {x,y};
assign {c, y} = ina+inb;
{4{2’b10}} → 10101010
assign a = {16{x[15]}, x};
選択的な記述



Verilogは二つの文を書くと並列に動く
では、ある条件でAの文、別の条件でBの
文を動かす選択的記述(SFLのalt文)は?
三つの方法がある



ふんがが好きだが一般
には推奨されない
 assign y = com ? ina + inb : ina – inb;
やまさき先生ご推薦の
方法、落とし穴あり
function文を使う一時期FPGAベンダが推
always文を使う 奨した方法、やまさき先
生は大嫌いでふんがも好
きでない
assign文を使う
assign文を使う方法
assign y = (com==`ADD) ? a + b:
(com== `SUB) ? a - b:
(com== `AND) ? a & b: a | b;
 なんとなくCASE文っぽく見えるんじゃない?
 余計な宣言が不要で面倒が一番少ない
 欠点:


条件が単純なcase文的な場合はうまく書けるが、
条件構造が複雑だと読みにくい
不要な優先順位が付いて合成系を制約する可能
性がある
function文 -if文の利用assign y = alu(a,b,com);
function [3:0] alu (ina,inb,com);
input [3:0] ina,inb;
input [2:0] com;
begin
if (com==`ADD) alu = a + b ;
else if (com==`SUB) alu = a –b ;
else if (com==`AND) alu = a & b ;
else alu = a | b;
end
endfunction
function文 –case文の利用assign y = alu(a,b,com);
function [3:0] alu (ina,inb,com);
input [3:0] ina,inb;
input [2:0] com;
begin
case(com)
`ADD: alu = a + b ;
`SUB: alu = a –b ;
`AND: alu = a & b ;
default: alu = a | b;
endcase
end
endfunction
function文の問題点

出力が複数の場合はどうするの?




意味的に関係があるものは出力の連結を利
用
意味的に関係の薄い出力を一つのfunction文
に指定してはいけない→分けること!
代入時のビット幅、割付に注意→あまりたくさ
んの出力をfunction文で指定することはお勧
めできない
ま、いいじゃん
そもそもfunctionって複数個所で呼ぶこと
に意味があるのでは???
function文の複数出力指定
assign {c,y} = alu(a,b,com);
function [4:0] alu (ina,inb,com);
input [3:0] ina,inb;
input [2:0] com;
begin
case(com)
`ADD: alu = a + b ;
`SUB: alu = a –b ;
`AND: alu = {1’b0,a & b} ;
default: alu = {1’b0,a | b};
endcase
end
endfunction
なぜ選択的な構文が書けないか?

出力が複数になると、値が定義されなくなるから
begin
if (com==`ADD) {c,y}= a + b ;
else if (com==`AND) y = a & b ;
else y = a | b;
end



と書かれると、cはADD以外では何を出して良いかわ
からなくなってしまう。
SFLは、この時cを不定にして合成系に任せるが、
Verilogはこれを許さず、何とか値を入れようとする
Verilogは基本的に出力一つに対してその論理を入力
の組み合わせとして考え、データパスと制御を分離す
る方法であり、これはこれで優れていると言える
alu.vのシミュレーション


テストベンチは多少なぞの文があるが、今
日の所は深く理解しないで使って欲しい
モジュー
モジュール名
ル入出力
インスタンス名
サブモジュールの呼び出し方
上位階層で与える名前
alu
alu0( .ina(a), .inb(b), .com(com), .y(y));
alu
alu0(a,b,com,y);
後者の書き方は、サブモジュールの宣言の順番で入出力が
決まる。しかし前者の書き方をお勧めする。
Verilog-XL:使い方
pico.vというファイルのシミュレーション
コマンドラインに以下を入力
% verilog pico.v
コマンド名 ファイル名
Verilog-XL:正常終了の場合
問題がない場合
正常終了
Verilog-XL:ErrorとWarning
文法を間違えていたりするとエラーとなり終了
Warnigが出てもシミュレーションはできるが…
Verilog-XL:テストベクトル
テストベクトルを用いて動作確認をする
% verilog test.v pico.v
テストベクトルを記述したファイル名
Verilog-XL:動作の検証
テストベクトルに記述した信号によって
設計した回路の動作を検証する
EX) 入力と出力の信号値を表示させ
設計通りに動作しているかを検証
Verilog-XL:複数モジュール
階層構造をした複数モジュールのシミュレーション
% verilog pico.v if_stage.v
上位モジュール 下位モジュール
波形ツール:simvisionの起動
コマンドラインに以下のように入力
% simvision &
simvision:波形ファイルを開く
File → Open Simulation
を指定して波形ファイルの読み込み
simvision:波形ファイルを開く
波形ファイルがある
ディレクトリの選択
次に波形ファイルの選択
simvision:波形の表示
波形ファイルを読み込んだ後、
左の窓でモジュール、右の窓で信号線を選択し、
右上のアイコンをクリック
simvision:波形表示
simvision:波形の再表示
File → Reload Database
を選択すると波形ファイルを読み込んで波形を再表示
simvision:終了
File → Exit SimVision
を選択すると終了
演習





4bit ALUを設計
comを3ビットとし、ADD,SUB,AND,OR等
適当な機能を装備せよ。ただし、
ADD,SUB,Through A, Through Bは必
須
alu.vをコピーして拡張してもOK
テストベンチはalu_test.vを改造のこと
シミュレーションして結果を確認の上、天
野([email protected])までalu.v
をメールのこと