Verilog-2001基礎
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[論理回路設計]]
IEEE 1364-2001で定義されているVerilog-2001の一部分を解説。~
※注1. Icarus Verilogのiverilogコマンド及びVerilog-XLのverilogコマンドはVerilog-2001に正式対応していない模様なので、仮に予期せぬシミュレーション結果になった場合はNC-Verilogのncverilogコマンドでのシミュレーションを推奨する。~
※注2. 乗算演算子や除算演算子、冪乗演算子等は生成される回路の規模が予測できないので、定数同士の演算以外での使用を推奨しない。
*一覧 [#kcce38b8]
#contents
----
**01. ポートとデータタイプの複合宣言 (Combined port and data type declarations) [#lefa9fd1]
-Verilog-1995では入力及び出力ポートの宣言とポートのデータタイプの宣言を別々にする必要があったがVerilog-2001では同時に宣言が可能となった。
// Verilog-1995 記述
module pseudo(in,out);
input in;
output out;
wire in;
reg out;
...
~
// Verilog-2001 記述
module pseudo(in,out);
input wire in;
output reg out;
...
**02. ANSI Cスタイルのモジュール宣言C (ANSI C style module declarations) [#k93a1653]
-Verilog-1995では、入力及び出力ポートの宣言をモジュール宣言と本文の両方の記述する必要があったが、Verilog-2001ではANSI Cのような宣言が可能となった。
// Verilog-1995 記述
module pseudo(in,out);
input in;
output out;
wire in;
reg out;
...
~
// Verilog-2001 記述
module pseudo(input in,
output reg out);
...
**03. モジュールのポートパラメータリスト (Module port parameter lists) [#qb728c07]
-Verilog-1995ではパラメータの宣言は本文で行っていたが、Verilog-2001ではモジュール宣言に記述が可能となった。
// Verilog-1995 記述
module pseudo(...);
parameter WIDTH = 32, HEIGHT = 16;
...
~
// Verilog-2001 記述
module pseudo #(parameter WIDTH = 32, HEIGHT = 16)
(...);
...
**09. 定数関数 (Constant functions) [#gf3d0f39]
-Verilog-2001では定数関数を扱えるようになった。つまり、parameter等で関数の引数を与えることにより、その結果も定数となるので、ビット幅の選択に関数が使用できるようになった。
**10. センシティビティリストのカンマ区切り (Comma separated sensitivity lists) [#k5fcd5fe]
-Verilog-1995ではセンシティビティリストの複数指定時は、orで併記を行ったが、Verilog-2001ではカンマ区切りが可能となった。
// Verilog-1995 記述
always @(a or b or ci)
sum = a + b + ci;
always @(posedge clock or negedge reset)
if(!reset)
q <= 0;
else
q <= d;
~
// Verilog-2001 記述
always @(a, b, ci)
sum = a + b + ci;
always @(posedge clock, negedge reset)
if(!reset)
q <= 0;
else
q <= d;
**11. 組み合わせ回路のセンシティビティリスト (Combinational logic sensitivity lists) [#z1a458ef]
-Verilog-1995では、組み合わせ回路をalways文で記述する際に、センシティビティリストには、条件式及び代入文の右辺となるものを全て列挙しなければならなかったが、Verilog-2001ではアスタリスクによる指定が可能となった。
**15. 多次元配列 (Multidimensional arrays) [#n8ce8d27]
-Verilog-1995では多次元配列は使用できなかったが、Verilog-2001では使用可能となった。
サンプルコードは17を参照
**17. 配列のビットアクセス及び部分選択 (Array bit and part selects) [#vfd42ca4]
-Verilog-1995では配列のビットアクセスや部分選択が許されなかったが、Verilog-2001では可能となった。
// Verilog-2001 記述
reg [31:0] memcell[0:255][0:15];
wire [7:0] r_data = memcell[100][10][31:24];
**18. 符号付き宣言 (Signed reg, net and port declarations) [#f1e7112d]
-Verilog-1995では符号付き演算としては32bitのinteger型しか用意されていなく、他のビット幅やデータタイプに関しては符号無しとして計算された。Verilog-2001では符号付き宣言の修飾子として新たにsignedキーワードを設けることにより、符号付き演算を可能とした。
// Verilog-1995では符号無しで計算されるためマイナスの比較の結果が正しくない
module pseudo(din,dout);
input [15:00] din;
output dout;
assign dout = din>0?1'b1:1'b0;
endmodule
~
// Verilog-2001ではsigned修飾子により、符号付きを正しく計算できる
module pseudo(din,dout);
input signed [15:00] din;
output dout;
assign dout = din>0?1'b1:1'b0;
endmodule
**19. 符号付き整数の基数 (Signed based integer numbers) [#s2571590]
-Verilog-1995では符号付き整数定数のビット幅は32bitに制限されいた。なので32bit以外のビット幅指定の符号付き整数定数は利用出来なかった。18. の仕様に基づき、ビット幅指定の整数定数における基数の指定方法として新たにb,d,o,hの他にsb,so,sd,shの符号付き基数の指定が可能となった。
// Verilog-1995では結果が無効となる記述
integer i;
i = 6;
i / -64'd3; // 結果として64bit幅の-2を期待するが0となる
~
// Verilog-2001 記述
integer i;
i = 6;
i / -64'sd3; // -2
**20. 符号付き関数 (Signed functions) [#sf221179]
-18. の仕様に基づき、Verilog-2001では符号付きの戻り値の関数の定義が可能となった。
**22. 算術シフト演算 (Arithmetic shift operators) [#eedfed21]
-Verilog-1995では対応していなかった算術シフト演算を、Verilog-2001では新たに算術右シフト演算子>>>を定義した。なお言語仕様の対称性として、算術左シフト演算子<<<も用意されている。
module Shifter(DIN,AMOUNT,DEST,DOUT);
parameter WIDTH = 32;
input signed [WIDTH-1:0] DIN;
input [4:0] AMOUNT;
input [1:0] DEST;
output [WIDTH-1:0] DOUT;
wire [WIDTH-1:0] lls; // logical left shift
wire [WIDTH-1:0] lrs; // logical right shift
wire [WIDTH-1:0] als; // arithmetic left shift
wire [WIDTH-1:0] ars; // arithmetic right shift
assign lls = DIN << AMOUNT;
assign lrs = DIN >> AMOUNT;
assign als = DIN <<< AMOUNT;
assign ars = DIN >>> AMOUNT;
assign DOUT = (DEST == 2'b00)?lls:
(DEST == 2'b01)?lrs:
(DEST == 2'b10)?als:
(DEST == 2'b11)?ars:
{WIDTH{1'bx}};
endmodule
**24. 冪乗演算子 (Power operator) [#z4c6aaf7]
-Verilog-2001では新たに冪乗演算子が追加された。(例として&texvc(m^n);)
result = m ** n;
**26. パラメータのサイズ及び型の固定 (Sized and typed parameter constants) [#r6dcc68b]
-Verilog-1995ではパラメータのサイズ及び型は最後に再定義された時に依存している。すなわち、defparam等で上位モジュールからパラメータの再定義が行われた場合、パラメータのサイズ及び型は、再定義された数値に依存する。これは言語仕様として柔軟性があるが、同時に不具合も生じるので、Verilog-2001ではパラメータの定義時にサイズ及び型、そして符号付きであるかどうかの指定を行い、以後の互換性の無い再定義を禁止している。
**27. 明示的なパラメータの再定義 (Explicit in-line parameter redefinition) [#c4fb69f0]
-Verilog-1995では上位モジュールから下位モジュールのパラメータを再定義する場合に、下位もジュールのパラメータの定義順に指定を行う。もしくはdefparam構文により、パラメータ名の指定を行った上で再定義を行う方法もある。しかし、これらの書き方は柔軟性に欠けているので、Verilog-2001では、明示的なパラメータの再定義が可能となった。
// 下位モジュールの例
module proc(...);
parameter WIDTH = 32;
parameter HEIGHT = 16;
...
~
// Verilog-1995 記述
proc proc1(...);
defparam proc1.WIDTH = 64; // 明示的ではあるが柔軟性に欠けている
defparam proc1.HEIGHT = 8;
~
// Verilog-1995 記述
proc #(64,8) proc1(...); // 順番は左から(WIDTH,HEIGHT)としなければならない。
~
// Verilog-2001 記述
proc #(.WIDTH(64),.HEIGHT(8)) proc1(...); // 素晴らしい!
**28. 固定されたローカルパラメータ (Fixed local parameters) [#ta448cca]
-27. のように上位モジュールからのパラメータの再定義を禁止するために、従来のparameterに加えてlocalparamが追加された。localparamで宣言されたパラメータは上位モジュールからの再定義を禁止することが可能となる。
*コメント [#mf2e7caf]
何か不明瞭な点や間違いがありましたら指摘よろしくお願いします
#comment
終了行:
[[論理回路設計]]
IEEE 1364-2001で定義されているVerilog-2001の一部分を解説。~
※注1. Icarus Verilogのiverilogコマンド及びVerilog-XLのverilogコマンドはVerilog-2001に正式対応していない模様なので、仮に予期せぬシミュレーション結果になった場合はNC-Verilogのncverilogコマンドでのシミュレーションを推奨する。~
※注2. 乗算演算子や除算演算子、冪乗演算子等は生成される回路の規模が予測できないので、定数同士の演算以外での使用を推奨しない。
*一覧 [#kcce38b8]
#contents
----
**01. ポートとデータタイプの複合宣言 (Combined port and data type declarations) [#lefa9fd1]
-Verilog-1995では入力及び出力ポートの宣言とポートのデータタイプの宣言を別々にする必要があったがVerilog-2001では同時に宣言が可能となった。
// Verilog-1995 記述
module pseudo(in,out);
input in;
output out;
wire in;
reg out;
...
~
// Verilog-2001 記述
module pseudo(in,out);
input wire in;
output reg out;
...
**02. ANSI Cスタイルのモジュール宣言C (ANSI C style module declarations) [#k93a1653]
-Verilog-1995では、入力及び出力ポートの宣言をモジュール宣言と本文の両方の記述する必要があったが、Verilog-2001ではANSI Cのような宣言が可能となった。
// Verilog-1995 記述
module pseudo(in,out);
input in;
output out;
wire in;
reg out;
...
~
// Verilog-2001 記述
module pseudo(input in,
output reg out);
...
**03. モジュールのポートパラメータリスト (Module port parameter lists) [#qb728c07]
-Verilog-1995ではパラメータの宣言は本文で行っていたが、Verilog-2001ではモジュール宣言に記述が可能となった。
// Verilog-1995 記述
module pseudo(...);
parameter WIDTH = 32, HEIGHT = 16;
...
~
// Verilog-2001 記述
module pseudo #(parameter WIDTH = 32, HEIGHT = 16)
(...);
...
**09. 定数関数 (Constant functions) [#gf3d0f39]
-Verilog-2001では定数関数を扱えるようになった。つまり、parameter等で関数の引数を与えることにより、その結果も定数となるので、ビット幅の選択に関数が使用できるようになった。
**10. センシティビティリストのカンマ区切り (Comma separated sensitivity lists) [#k5fcd5fe]
-Verilog-1995ではセンシティビティリストの複数指定時は、orで併記を行ったが、Verilog-2001ではカンマ区切りが可能となった。
// Verilog-1995 記述
always @(a or b or ci)
sum = a + b + ci;
always @(posedge clock or negedge reset)
if(!reset)
q <= 0;
else
q <= d;
~
// Verilog-2001 記述
always @(a, b, ci)
sum = a + b + ci;
always @(posedge clock, negedge reset)
if(!reset)
q <= 0;
else
q <= d;
**11. 組み合わせ回路のセンシティビティリスト (Combinational logic sensitivity lists) [#z1a458ef]
-Verilog-1995では、組み合わせ回路をalways文で記述する際に、センシティビティリストには、条件式及び代入文の右辺となるものを全て列挙しなければならなかったが、Verilog-2001ではアスタリスクによる指定が可能となった。
**15. 多次元配列 (Multidimensional arrays) [#n8ce8d27]
-Verilog-1995では多次元配列は使用できなかったが、Verilog-2001では使用可能となった。
サンプルコードは17を参照
**17. 配列のビットアクセス及び部分選択 (Array bit and part selects) [#vfd42ca4]
-Verilog-1995では配列のビットアクセスや部分選択が許されなかったが、Verilog-2001では可能となった。
// Verilog-2001 記述
reg [31:0] memcell[0:255][0:15];
wire [7:0] r_data = memcell[100][10][31:24];
**18. 符号付き宣言 (Signed reg, net and port declarations) [#f1e7112d]
-Verilog-1995では符号付き演算としては32bitのinteger型しか用意されていなく、他のビット幅やデータタイプに関しては符号無しとして計算された。Verilog-2001では符号付き宣言の修飾子として新たにsignedキーワードを設けることにより、符号付き演算を可能とした。
// Verilog-1995では符号無しで計算されるためマイナスの比較の結果が正しくない
module pseudo(din,dout);
input [15:00] din;
output dout;
assign dout = din>0?1'b1:1'b0;
endmodule
~
// Verilog-2001ではsigned修飾子により、符号付きを正しく計算できる
module pseudo(din,dout);
input signed [15:00] din;
output dout;
assign dout = din>0?1'b1:1'b0;
endmodule
**19. 符号付き整数の基数 (Signed based integer numbers) [#s2571590]
-Verilog-1995では符号付き整数定数のビット幅は32bitに制限されいた。なので32bit以外のビット幅指定の符号付き整数定数は利用出来なかった。18. の仕様に基づき、ビット幅指定の整数定数における基数の指定方法として新たにb,d,o,hの他にsb,so,sd,shの符号付き基数の指定が可能となった。
// Verilog-1995では結果が無効となる記述
integer i;
i = 6;
i / -64'd3; // 結果として64bit幅の-2を期待するが0となる
~
// Verilog-2001 記述
integer i;
i = 6;
i / -64'sd3; // -2
**20. 符号付き関数 (Signed functions) [#sf221179]
-18. の仕様に基づき、Verilog-2001では符号付きの戻り値の関数の定義が可能となった。
**22. 算術シフト演算 (Arithmetic shift operators) [#eedfed21]
-Verilog-1995では対応していなかった算術シフト演算を、Verilog-2001では新たに算術右シフト演算子>>>を定義した。なお言語仕様の対称性として、算術左シフト演算子<<<も用意されている。
module Shifter(DIN,AMOUNT,DEST,DOUT);
parameter WIDTH = 32;
input signed [WIDTH-1:0] DIN;
input [4:0] AMOUNT;
input [1:0] DEST;
output [WIDTH-1:0] DOUT;
wire [WIDTH-1:0] lls; // logical left shift
wire [WIDTH-1:0] lrs; // logical right shift
wire [WIDTH-1:0] als; // arithmetic left shift
wire [WIDTH-1:0] ars; // arithmetic right shift
assign lls = DIN << AMOUNT;
assign lrs = DIN >> AMOUNT;
assign als = DIN <<< AMOUNT;
assign ars = DIN >>> AMOUNT;
assign DOUT = (DEST == 2'b00)?lls:
(DEST == 2'b01)?lrs:
(DEST == 2'b10)?als:
(DEST == 2'b11)?ars:
{WIDTH{1'bx}};
endmodule
**24. 冪乗演算子 (Power operator) [#z4c6aaf7]
-Verilog-2001では新たに冪乗演算子が追加された。(例として&texvc(m^n);)
result = m ** n;
**26. パラメータのサイズ及び型の固定 (Sized and typed parameter constants) [#r6dcc68b]
-Verilog-1995ではパラメータのサイズ及び型は最後に再定義された時に依存している。すなわち、defparam等で上位モジュールからパラメータの再定義が行われた場合、パラメータのサイズ及び型は、再定義された数値に依存する。これは言語仕様として柔軟性があるが、同時に不具合も生じるので、Verilog-2001ではパラメータの定義時にサイズ及び型、そして符号付きであるかどうかの指定を行い、以後の互換性の無い再定義を禁止している。
**27. 明示的なパラメータの再定義 (Explicit in-line parameter redefinition) [#c4fb69f0]
-Verilog-1995では上位モジュールから下位モジュールのパラメータを再定義する場合に、下位もジュールのパラメータの定義順に指定を行う。もしくはdefparam構文により、パラメータ名の指定を行った上で再定義を行う方法もある。しかし、これらの書き方は柔軟性に欠けているので、Verilog-2001では、明示的なパラメータの再定義が可能となった。
// 下位モジュールの例
module proc(...);
parameter WIDTH = 32;
parameter HEIGHT = 16;
...
~
// Verilog-1995 記述
proc proc1(...);
defparam proc1.WIDTH = 64; // 明示的ではあるが柔軟性に欠けている
defparam proc1.HEIGHT = 8;
~
// Verilog-1995 記述
proc #(64,8) proc1(...); // 順番は左から(WIDTH,HEIGHT)としなければならない。
~
// Verilog-2001 記述
proc #(.WIDTH(64),.HEIGHT(8)) proc1(...); // 素晴らしい!
**28. 固定されたローカルパラメータ (Fixed local parameters) [#ta448cca]
-27. のように上位モジュールからのパラメータの再定義を禁止するために、従来のparameterに加えてlocalparamが追加された。localparamで宣言されたパラメータは上位モジュールからの再定義を禁止することが可能となる。
*コメント [#mf2e7caf]
何か不明瞭な点や間違いがありましたら指摘よろしくお願いします
#comment
ページ名: