115
116
Testbench の記述例 (decoder:2)
module Decoder_test;
reg DA,DB,DE;
wire [3:0] DZ;
Decorder2x4 D1 (DA,DB,DE,DZ);
initial begin
DE = 0; DA = 0; DB = 0;
#10 DE = 1;
#10 DA = 1;
#10 DB = 1;
#10 DA = 0;
#10 DB = 0;
end
always @(DE or DA or DB or DZ)
$display("Time %t, input is %b%b%b, output is %b", $time,DA,DB,DE,DZ;
endmodule
DA DB DE
10 20 30 40 50 DZ[0]
DZ[1]
DZ[2]
DZ[3]
117
8:論理合成
• 論理合成とは、 HDL で記述されたモデルからゲー トレベルのネットリストを構成すること
• 論理合成システムは指定された面積制約、タイミ ング制約にしたがって回路を最適化する
• Verilog HDL のすべてが合成可能な構文ではない
118
論理合成の利点
真理値表
論理式 簡単化
回路図
HDL記述 論理合成
ライブラリ1
ライブラリ2
回路1
(ゲートアレイ)
回路2
(スタンダードセル)
119
論理合成可能な記述法
• 論理合成ツールを用いる LSI 設計法が主流
• 高位レベル記述でゲートレベルを自動生成す るアプローチがもっとも生産性が高い
• 記述のしかたによりどんな回路が合成される
かを知っておく必要がある
120
組み合わせ回路の合成
• データフロー記述( assign 文)
• 動作記述( always ブロック)
• ファンクションを用いた記述
alwaysブロックでは、注意しないとラッチを生成する
可能性がある
121
データフロー記述による組合せ回路
• 必ず組合せ回路が生成される
• 右辺の式により、高位の表現が可能
• if 文、 case 文などが使えない
assign y = (s) ? a : b;
条件演算子の利用 assign y = (s == 2’b00) ? a : (s == 2’b01) ? b : (s == 2’b10) ? c : (s == 2’b11) ? d ;
122
動作記述による組合せ回路
always ブロックによる記述
reg y;
always @(a or b or c or s) begin
case (s)
2’b00: y <= a;
2’b01: y <= b;
2’b10: y <= c;
default: y <= x;
endcase end
代入される変数はreg型 ブロック内で参照される すべての信号を列挙する
場合分けにもれがないようにする defaultには、できるだけxを記入
123
動作記述による組合せ回路(2)
always ブロックによる記述
reg y;
always @(a or b or c or s) begin
case (s)
2’b00: y <= a;
2’b01: y <= b;
2’b10: y <= c;
endcase end
S=2’b11のとき、yは前の値を 保持しなければならない
yにラッチが生成され、
組合せ回路でなくなる。
124
Function を用いた 組合せ回路
module shifter(q,a,dir);
output [7:0] q;
input [7:0] a;
input dir;
assign q = (dir)? lshift(a) : rshift(a);
function [7:0] lshift;
input [7:0] data;
lshift = data << 1;
endfunction
function [7:0] rshift;
input [7:0] data;
rshift = data >> 1;
endfunction endmodule
125
お絵かきスペース
126
同期式順序回路
クロックの立上り(立下り)で入力値を取り込むエッジトリガD-FFが基本
reg q;
always @(posedge ck ) begin
q <= d;
end
d
ck q
d ck
q
127
非同期 Reset の追加
reg q;
always @(posedge ck or negedge reset) begin
if (!reset) begin
q <= 0;
end else
begin
q <= d;
end end
d ck reset
q
reset d ck
q
128
同期 Load の追加
module counter(out,d,ld,ck,res);
output [3:0] out;
input [3:0] d;
input ld, ck, res;
reg [3:0] q;
always @(posedge ck or negedge res) begin
if (!res) q <= 0;
else
begin
if (!ld) q <= d;
else q <= q + 1;
end end
assign out = q;
endmodule
リセット ロード カウント
129
お絵かきスペース
reset d ck out
ld
130
レジスタ代入の記述
always @(posedge CLR or posedge RES) begin
if (RES==1’b1) Q <= 1’b0;
else
Q <= P;
end
always @(RES) begin
if (RES==1’b1) Q <= 1’b0;
end
always @(posedge CLK) begin
Q <= P;
end
正しい記述 不完全な記述
同一レジスタに対する代入は単一のalways文の中で行わないとエラー
131
最適化
遅延 面積
論理合成における最適化
ハードウェアの記述量と合成される回路のゲート数は関係しない
132
資源割り付け(共有化)
if (ShReg)
out = A + B;
else if (ReadWrite) out = C + D;
else
out = E + F;
if (ShReg) begin
temp1 = A; temp2 = B;
end
else if (ReadWrite) begin
temp1 = C; temp2 = D;
end else
begin
temp1 = E; temp2 = F;
end
out = temp1 + temp2;
Adderを3個生成する
Adderを1個生成する
133
ミニクイズ:前のページの記述に相当する回路をお絵かきしましょう
134
共通部分式
if (test)
X = A & (B ^ C);
else
Y = (B ^ C) | D;
Temp = (B ^ C);
if (test)
X = A & Temp;
else
Y = Temp | D;
A B
C
D
B
C A
D
135
お絵かきスペース
136
ラッチの回避
always文の中の分岐において、変数への代入が行われない
パスが存在するとき、ラッチが生成される
reg Luck;
always @ (Probe or Count) if (Probe)
Luck = Count;
reg Luck;
always @ (Probe or Count) if (Probe)
Luck = Count;
else
Luck = 0;