1から学ぶHDL ~RTL設計とゲートレベル設計~
HDLについて初めて学んだことを書いてみました。まだまだ学び始めて30分なので内容が浅いです。
RTL設計とゲートレベル設計
RTLのほうが記述量がうんと少ない!
コードを見れば一目瞭然!
RTL.v
module half_add(a, b, co, s);
input a, b; output co, s;
assign s = a ^ b; assign co = a & b;
endmodule
gate level.v
module full_add(a, b, ci, co, s);
input a, b, ci; output co, s; wire w0, w1, w2;
half_add ha0 (.a(a), .b(b), .co(w1), .s(w0));
half_add ha1 (.a(w0), .b(ci), .co(w2), .s(s));
assign co = w1 | w2;
endmodule
同じ内容なのに、こんなにも行数が変わってきます。
ここで詳しくまとめておくと
RTL設計
そのままシミュレーションが可能!
- 記述量少ない
- 抽出度高い
- 大規模回路が容易
- 組み合わせ回路やレジスタ
ゲートレベル設計
- 記述量多い
- 抽出度低い
- 大規模回路が困難
- ANDやOR、フリップフロップ
always文
ここでalways文について動作記述言語の1つ
always.v
always@ ( センシティビティリスト ) begin
演算
end
センシティビティリストはその値が変化したときにそのコードが実行されるというもの。
alwaysで代入する値はregで宣言する
alwaysの例として4bit加算器を示す。
ex_always.v
module add4(a, b, ci, co, s);
input [3:0] a, b;
input ci;
output co;
output [3:0] s;
reg co;
reg [3:0] s;
always@(a or b or ci) begin
{co, s} <= a + b + ci;
end
endmodule