Verilog-2001のベクトル部分選択

4561 ワード

以下の転載先:http://www.cnblogs.com/jyaray/archive/2011/11/28/2266082.html
rt,ベクトル部分選択とは何ですか.
verilog-2001 LRMには次のような言葉があります.
a[8*i+:8],this is the so-called"Indexed vector part selects".
Verilog-1995では、ベクトルのいずれかの出力を選択してもよいし、ベクトルの連続数ビット出力を選択してもよいが、この場合、連続数ビットの始末値のindexは定数である必要がある.
vect[msb_expr : lsb_expr]; //  msb_expr lsb_expr        。

Verilog-2001ではindexとして変数を用いてpart selectを行うことができる.
[base_expr +: width_expr] //positive offset

[base_expr -: width_expr] //negative offset

ここでbase_exprは変数であり、width_exprは定数でなければなりません.+:表示はbase_expr向上width_exprビット、-:base_で表されるexprはwidthを下に減算するexprビット.
例:
reg [63:0] word;

reg [3:0] byte_num; //a value from 0 to 7

wire [7:0] byteN = word[byte_num*8 +: 8];

byte_numの値が4の場合、word[39:32]はbyteNに割り当てられます.
以下の転載先:Verilog-2001新機能(実例分析)
http://bbs.ednchina.com/BLOG_ARTICLE_190233.HTM
Indexed vector part selects
Verilog-1995では、ベクトルのいずれかの出力を選択してもよいし、ベクトルの連続数ビット出力を選択してもよいが、この場合、連続数ビットの始末値のindexは定数である必要がある.Verilog-2001ではindexとして変数を用いてpart selectを行うことができる.
[base_expr+:width_expr]//positive offset
[base_expr-:width_expr]//negative offset
ここでbase_exprは変数であり、width_exprは定数でなければなりません.+:表示はbase_expr向上width_exprビット、-:base_で表されるexprアップシフトwidth_exprビット.例:
reg [63:0] word;
reg [3:0] byte_num;//a value from 0 to 7
wire [7:0] byteN =word[byte_num*8 +: 8];
byte_numの値が4の場合、word[39:32]はbyteNに値を付与する.
たじゅうはいれつ
Verilog-1995は1次元配列のみを許可し、Verilog-2001は多次元配列を許可する.
//1-dimensional array of 8-bit reg variables
//(allowed in Verilog-1995 and Verilog-2001)
reg [7:0] array1 [0:255];
wire [7:0] out1 = array1[address];
//3-dimensional array of 8-bit wire nets
//(new for Verilog-2001)
wire [7:0]array3 [0:255][0:255][0:15];
wire [7:0] out3 =array3[addr1][addr2][addr3];
さらにVerilog-1995では1次元配列のうちの1つを取り出すことができず、例えば上のarray 1[7][5]を取り出すにはarray 1[7]をarrayreg<=array 1[7]などのreg変数に割り当て、arrayregからbit 5、すなわちarrayreg[5]を取り出す必要がある.Verilog-2001では、次のような多次元配列の1つまたは複数のビットを任意に取り出すことができます.
//select the high-order byte of one word in a
//2-dimensional array of 32-bit reg variables
reg [31:0] array2 [0:255][0:15];
wire [7:0] out2 =array2[100][7][31:24];
verilogレプリケーション演算子
{n{m}}
Replicate value m, n times
  • Repetition multipliers (must be constants) can be used:
  • {3{a}}//this is equivalent to {a, a, a}

  • Nested concatenations and replication operator are possible:
  • {b, {3{c, d}}}//this is equivalent to {b, c, d, c, d, c, d}


  • for loopの統合性について
    Verilog-2001的向量部分选择_第1张图片