Verilog
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/12/30 18:20 UTC 版)
例
簡単な2フリップフロップの例を以下に示す。
module toplevel(clock,reset);
input clock;
input reset;
reg flop1;
reg flop2;
always @ (posedge reset or posedge clock)
if (reset)
begin
flop1 <= 0;
flop2 <= 1;
end
else
begin
flop1 <= flop2;
flop2 <= flop1;
end
endmodule
Verilogにおける"<="演算子は、普通の手続き型言語とは異なる、ハードウェア記述言語としてのもう1つの側面である。この演算子は「ノンブロッキング」代入文として知られ、alwaysブロックが実行されるまでアクションは登録されない。つまり、代入文を書いた順序は無関係であり、必ず同じ結果が生じる。そのため、flop1とflop2はクロックごとに値がスワップされることになる。
もう1つの代入演算子である"="は、ブロッキング代入文と呼ばれる。"="による代入が行われると、代入先の値は即座に更新される。もし上の例で"<="の代わりにブロッキング演算子の"="を使用したとすると、flop1とflop2の値はスワップされず、手続き型プログラミング言語のように、コンパイラはflop1の値をflop2の値にセットするのだと解釈する(その結果、flop2とflop1の値にセットするという冗長な論理は無視されることになる)。
モジュールはキーワードmoduleで始まる。その後のDiv20xが名前を示し、続く括弧内は端子リストである。6個の端子があり、それぞれの端子の入出力方向はモジュール中のポート宣言(inputとoutput)で指定される。最後のendmoduleでモジュールの終了である。モジュール内には、パラメータ宣言、ポート宣言、レジスタ宣言、イベント宣言、ネット宣言、ステートメントなどを記述する。
//
// 表題 イネーブル付20段カウンター
//
module Div20x (
// ポート宣言(外部から本モジュールへの接続を定義する)
input clock, // クロック
input reset, // リセット(正論理, ハイアクティブ)
input cet, // カウンターとTC出力のイネーブル
input cep, // カウンターのみのイネーブル
output reg [size - 1:0] count, // 束線を示す。この場合5bit幅
// alwaysまたはinitialブロックでドライブする信号は
// reg型でなければならない
output tc); // regと明記していない、他の信号はwire型。
// ポート宣言したwire型信号のネット宣言は省略可能であり、省略することも多い。
// パラメータ宣言
parameter length = 20; // カウント段数
parameter count_zero = 5'b00000; // 5bit幅,2進数の0を表す
parameter count_one = 5'b00001; // 5bit幅,2進数の1を表す
parameter size = 5; // bit幅,基数の指定を省略すると32bit,10進数になる。
// always文。resetやclock信号の変化に同期し並列に実行される
always @ (posedge clock or posedge reset) begin
if (reset) begin // 非同期リセット
count <= count_zero;
end else begin
if (cet || cep) begin // イネーブル
if (count == length - 1) begin
count <= count_zero;
end else begin
count <= count + count_one;
end
end
end
end
// assign文。tcの値は実行中、継続的に値が与る
assign tc = (cet && (count == length - 1));
endmodule
ポート宣言やレジスタ宣言での[a:b]のような形式は、束線(多くはバス)を示す。例えば[3:0]であれば配線が4本あることになる。always節は、括弧内の信号を指定した条件に変化があったときに実行される。posedgeは信号が0から1に変化した場合を指定する。orは括弧内の信号のどれか1つでも変化した場合を指定する。上記のように、resetに合わせてreg型を初期化するのが基本的なデザインパターンである。
ディレイの例は以下の通りである。
...
reg a, b, c, d;
wire e;
...
always @(b or e)
begin
a = b & e;
b = a | b;
#5 c = b;
d = #6 c ^ e;
end
上記のalways節は、もう1つの使い方を示している。たとえば、上の例では、リストに含まれる要素(bまたはe)が変化したタイミングでいつでもalways節が実行される。いずれかの変数が変化すると、即座に新しい値がaに代入される。ブロッキング代入文を使用しているため、bにはその代入後に(aの新しい値を用いて)新しい値が代入される。5単位時間のディレイの後、cにbの値が代入されると同時に、c ^ eの値が計算され、見えない保管場所に一時的に保存される。6単位時間後、保管されていた値がdに代入される。
プロセス内(initialまたはalwaysブロック内)で操作される信号は、reg型を持つ必要がある。また、プロセスの外で操作される信号はwire型を持たなければならない。この時使われるregという名前は、必ずしもハードウェアのレジスタを意味するわけではない。
- ^ “Genetic circuit design automation”. Science 352 (6281): aac7341. (2016). doi:10.1126/science.aac7341. PMID 27034378 .
- ^ インターフェース 1993年12月号, p. 14,184-188.
- ^ インターフェース 1993年12月号, p. 185.
- ^ 1364-1995 IEEE Standard Hardware Description Language Based on the Verilog(R) Hardware Description Language
- ^ 1364-2001 IEEE Standard Verilog Hardware Description Language
- ^ 1364-2005 IEEE Standard for Verilog Hardware Description Language
- ^ http://standards.ieee.org/findstds/standard/62530-2011.html
- ^ Cummings, Clifford E. (2003年). “SystemVerilog — Is This The Merging of Verilog & VHDL?” (PDF). SNUG Boston 2003. 2018年7月17日閲覧。
固有名詞の分類
- Verilogのページへのリンク