補足 - RTL記述で使えるSystemVerilog構文

[←] [] [→]


SystemVerilogVerilogを拡張したもので、シミュレーションに使う構文が充実しているが、RTL記述でも使うとよい構文がある。

Verilog

SystemVerilog

IEEE1346

IEEE1800

拡張子.v

拡張子.sv

(1) packed配列

Verilogではunpacked配列しかなかったが、SystemVerilogではpacked配列がある。違いは、packed配列は1個のベクタである点で、例えばベクタをバイトスワップするなどバイト単位で扱いたいとき便利。

unpacked配列

packed配列

wire[7:0] a[0:3]; // 4個の8ビットベクタ

assign a = ... とは書けない。

for(i=0;i<=3;i++) a[i] = ...

1個ずつ代入しなければならない。

a[0][7:4]とは書けない。

wire[0:3][7:0] a; // 1個の32ビットベクタ

assign a = d[31:0]と書けて

a[0]d[31:24]a[1:2]d[23:8]と同じ。

部分ビットを抜き出すこともできる。

a[0][7:4] d[31:28]と同じ。

◇◇

(2) 配列のポート宣言

SystemVerilogではポートを配列で書ける。

ポートを1個ずつ書く

ポートを配列で書く

input[7:0] a0,a1,a2,a3

input[7:0] a[0:3]; // ch0-ch38ビットポート

input[0:3][7:0] a; // packed配列も可

◇◇◇

(3) 配列の定数

配列の定数を書くときは、連結を表す括弧{...}の前にアポストロフィをつける。

送信文字列を1個ずつ書く

送信文字列を配列で書く

case(index[1:0])

2'd0: tx_dat <= 8'h0d;

2'd1: tx_dat <= 8'h0a;

2'd2: tx_dat <= ">";

2'd3: tx_dat <= " ";

endcase

localparam logic[7:0] PROMPT[0:3] = '{8'h0d,8'h0a,">"," "}

tx_dat <= PROMPT[index[1:0]];

◇◇◇◇

(4) enum

Verilogではステートマシンのステートはparameterで明示的に値を割り当てるが、enum型を使えば文字列のまま扱える

ステートをparameterで割り当てる

ステートをenum型で割り当てる

reg[2:0] state_r;

localparam IDLE=3'd0, ST1=3'd1,...

// 表示は数値になる

$display("state=%0d",state_r);

enum reg[2:0] {IDLE,ST1,...} state_r;

 

// state_rの値を文字列で表示できる

$display("state=%0s",state_r.name());

もちろん実際にはIDLEST10,1,...と数値が割り当てられるのだが、それを意識せずに済む。そもそも、ステートマシンの値は論理合成ツールが勝手に割り当て直すので、RTL記述に数値を書いても意味がない。


[←] [] [→]