補足 - RTL記述で使えるSystemVerilog構文
[←] [↑] [→]
SystemVerilogはVerilogを拡張したもので、シミュレーションに使う構文が充実しているが、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-ch3の8ビットポート 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()); |
もちろん実際にはIDLE、ST1に0,1,...と数値が割り当てられるのだが、それを意識せずに済む。そもそも、ステートマシンの値は論理合成ツールが勝手に割り当て直すので、RTL記述に数値を書いても意味がない。
[←] [↑] [→]