
田中太郎
サンプルです
module
module(Verilogの回路の単位)を作成します
基本
module sample(
input clk,
input rst_b,
input din,
output logic dout
);
endmodule
こうも書けます(Verilogはこちらのみ)
module sample;
input clk;
input rst_b;
input din;
output logic dout;
endmodule
always_ff
Flip-Flopを作成します
基本
always_ff @(posedge clk, negedge rst_n) begin
if (!rst_n) begin
dout <= 1'b0;
end
else begin
dout <= din;
end
end
Verilog ではalways_ff が使えないので下記のように書きます
always @(posedge clk, negedge rst_n) begin
if (!rst_n) begin
dout <= 1'b0;
end
else begin
dout <= din;
end
end
always_comb
組み合わせ回路を作成します
基本
always_comb begin
if (en) begin
dout = 1'b0;
end
else begin
dout = din;
end
end
Verilogではalways_ffが使えないので下記のように書きます
always @(*) begin
if (en) begin
dout = 1'b0;
end
else begin
dout = din;
end
end
always_latch
ラッチを作成します
基本
always_latch begin
if (en) begin
dout = din;
end
end
Verilog ではalways_latch が使えないので下記のように書きます
always @(*) begin
if (en) begin
dout = din;
end
end
if
if文を使用します
always_ff @(posedge clk) begin
if (!rst_b) begin
dout = 1'b0;
end
else if (set) begin
dout = 1'b1;
end
else begin
dout = din;
end
end
case
case文を使用します
always_comb begin
case (sel)
2'b00: dout = 2'b00;
2'b01: dout = 2'b01;
2'b10: dout = 2'b11;
default: dout = 2'b10;
endcase
end
generate-for
generate文を使用します
generateは飾りなので、なくても動きます
genvarはgenerate-forのindexを宣言します
genvar i;
generate
for (i = 0; i < 10; i++) begin
always_comb begin
if (sel) begin
dout[i] = 1'b0;
end
else begin
dout[i] = din[i];
end
end
end
endgenerate
generate-if
defineやパラメータの値によって回路を変更できます
`define DEF_SEL 0
generate
if (`DEF_SEL) begin
always_ff @(posedge clk) begin
dout <= 1'b0;
end
end
else begin
always_ff @(posedge clk) begin
dout <= 1'b1;
end
end
foreach
for文のindexを自動で設定してくれます
module sample(
input [5:0] din,
output logic [5:0] dout
);
always_comb begin
foreach (din[i]) begin
dout[i] = din[i];
end
end
endmodule
function
function文を使用します
functionは組み合わせ回路のみに使用できます
シーケンスをまたぐ記述はできません
function func(
input din
);
func = ~din;
endfunction
assign dout = func(din);
task
taskを使用します
taskはfunctionと違い、Delayを入れることができます
task task_sample;
#10;
dout = din;
endtask
initial begin
task_sample;
end
パラメータ
パラメータを設定します
module sample #(
parameter BW_A = 3,
parameter BW_B = 4
)(
input [BW_A-1:0] din,
output logic [BW_B-1:0] dout
);
endmodule
インスタンス
別なmoduleと接続します
module top(
input din,
output logic dout
);
sub u_sub(
.din(din),
.dout(dout)
);
endmodule
module sub(
input din,
output logic dout
);
assign dout = din;
endmodule
パラメータも継承できます
module top #(
parameter BW = 3
)(
input [BW-1:0] din,
output logic [BW-1:0] dout
);
sub #(
.BW(BW)
) u_sub(
.din(din),
.dout(dout)
);
endmodule
module sub #(
parameter BW = 3
)(
input [BW-1:0] din,
output logic [BW-1:0] dout
);
assign dout = din;
endmodule
埋め込みコマンド
$test$plusargs
$test$plusargs("test");
$value$plusargs
$value$plusargs("din=%d", din);
$display
$display("%", a);
コメント