目的:
SystemVerilog で 追加された 合成可能な論理記述について記す概要:
追加された項目としては、主に以下の様なものがある。- .<ポート名> や .* による ポート宣言
- 数値記述
- bit幅の省略
- 可変長リテラル
- logic 変数
- 用途別 always 文
- 多次元配列
- enum
- typedef
- 構造体(struct)
-
その他
interface
package
$clog2(), $bits()
キャスティング
詳細:
- .<ポート名> や .* による ポート宣言 モジュール呼び出し時、ポート名とネット名が同じ場合は .<ポート名> で接続できる。
- 数値記述
- bit幅の省略
- 可変長リテラル
- logic 変数 reg , wire の代わりに logic で宣言可能。
- 用途別 always 文 always文 を always_ff, always_comb, always_latch で使い分けることができるようになった。
-
always_ff
always 文 で 順序回路(FF) を作る場合に使用する。
従来の always での 順序回路記述と同様。 - always_comb
always 文 で 組み合わせ回路 を作る場合に使用する。
以下の様に、センシビリティリストは不要。
always_combVerilog の always @(*) と同様。
if (a) dt = b ;
else dt = c ;
case 文, if文 等で、条件を網羅していない場合は、ラッチが生成される。 - always_latch
ラッチ生成用。詳細不明。 - 多次元配列
-
unpacked の 多次元配列
以下の記述は、Verilog でも 内部信号(メモリ等)には使用できたが、Systemverilog では ポートにも使用可能。
[7:0] data[0:3] ;SystemVerilog では 以下の様に記述することも可能。
[7:0] data[4] ;但し、unpacked の場合、data[0] ~ data[3] は 連続空間ではない為、以下の様に 32bit のデータを代入することはできない。wire [7:0] data [0:3] ;
wire [31:0] data2 ;
assign data = data2 ; <--- NG -
packed の 多次元配列
SystemVerilog では 以下の様に記述すると packed となる。
[3:0][7:0] data :この場合、data[3] ~ data[0] は 連続空間となり、以下の様に 32bit幅のデータを assign することが可能。
wire [31:0] data2 ;
assign data = data2 ; -
高次元配列
以下の様な 3次元以上の配列も可能。
[15:0][11:0][3:0][7:0] data : // 4次元配列の場合 - enum 列挙(enumeration)型。
- typedef データのタイプ名を新たに定義することができる。
- 構造体(struct) 構造体
- その他 その他、
- 共用体(union)
- interface
- package
- $clog2(), $bits()
- キャスティング
また。ポート名も .* で 省略できる。
例
.<ポート名>での 宣言 (ネット名を省略)
module1 i_module1 (
.rst,
.clk,
.sig1,
.sig2,
.sig3(signal_3)
) ;
sig3以外はネット名を省略。
.rst,
.clk,
.sig1,
.sig2,
.sig3(signal_3)
) ;
.* での 宣言 ( ポート名を省略 )
module1 i_module1 (
.*,
.sig3(signal_3)
) ;
sig3以外は * で省略。.*,
.sig3(signal_3)
) ;
どちらも、sig3 以外は ネット名 と ポート名が同じ 場合に使用できる。
但し、.* での接続は 回路記述では 推奨されないらしい。
'd30 の様に bit幅 を省略して記述できる。
例えば、bit幅を P_BW のようにパラメータとした場合に '1' を設定する場合、
* Verilog では bit幅を省略すると 32bit とみなされ、合成はできるが spyglass 等のチェックで Warning が発生する。
例えば、bit幅を P_BW のようにパラメータとした場合に '1' を設定する場合、
data <= {{(P_BW-1){1'b0}},1'b1}
の様にして bit幅を合わせて数値を記述/代入していたが、
data <= 'd1 ;
で良いとのこと。* Verilog では bit幅を省略すると 32bit とみなされ、合成はできるが spyglass 等のチェックで Warning が発生する。
'0 や '1 で all '0' や all '1' を 表す。
例えば、bit幅を P_BW とした場合に all '1' を設定する場合、
例えば、bit幅を P_BW とした場合に all '1' を設定する場合、
data <= '1 ;
で良い。
(全て logic 宣言で良い。assign文, always文 のどちらにも使用できる。)
但し、以下のwire の 様な 宣言と同時に代入を行うことはできない。
wire signal_1 = signal_2 ; <-- OK
logic signal_1 = signal_2 ; <-- NG
尚、icarus, vivado では コンパイル時にはエラーにならないが、シミュレーションでは代入されていない。logic signal_1 = signal_2 ; <-- NG
会社で使用している環境ではコンパイル時にエラーになった。
値を名前で定義できる。
例 : ステートマシンの ステート定義
enum logic [1:0] {STATE_0, STATE_1, STATE_3, STATE_4} state ;
この場合、記述した名前に左から順に0から値が振られる。( STATE_0=2'd0, STATE_1=2'd1, STATE_3=2'd2, STATE_4=2'd3 )
値を指定したい場合は、
enum logic [1:0] {STATE_0='d3, STATE_1='d2, STATE_3='d1, STATE_4='d0} state ;
の様に指定する。同様のことを verilog で行う場合、以下の様に parameter で 値を 名前 に定義する。
wire [1:0] state ;
parameter STATE_0 = 2'd0 ;
parameter STATE_1 = 2'd1 ;
parameter STATE_2 = 2'd2 ;
parameter STATE_3 = 2'd3 ;
尚、enum から logic 等 への 代入はできるが、logic から enum への 代入は できない。( 但し、icarus では 代入できる )parameter STATE_0 = 2'd0 ;
parameter STATE_1 = 2'd1 ;
parameter STATE_2 = 2'd2 ;
parameter STATE_3 = 2'd3 ;
例えば、
typedef enum logic [1:0] {ST_0,ST_1,ST_2,ST_3} t_stat ;
t_stat stat ;
t_stat next_stat ;
の様に使用できる。t_stat stat ;
t_stat next_stat ;
以下の様に、複数の信号を 1つの名前に纏めることができる。
struct {
logic we ;
logic [ 7:0] adr ;
logic [15:0] data ;
} bus_sig ;
struct にも packed と unpacked があり、指定しなければ unpacked となる。logic we ;
logic [ 7:0] adr ;
logic [15:0] data ;
} bus_sig ;
以下の様に packed と した場合、struct に 値を代入できる。
struct packed {
logic we ;
logic [ 7:0] adr ;
logic [15:0] data ;
} bus_sig ;
assign bus_sig = 'h1234567 ;
この場合、logic we ;
logic [ 7:0] adr ;
logic [15:0] data ;
} bus_sig ;
assign bus_sig = 'h1234567 ;
bus_sig.we = 'b1
bus_sib.adr = 'h23
bus_sib_data = 'h4567
が入る。
0 件のコメント:
コメントを投稿