2023年7月2日日曜日

verilog : SystemVerilog での記述

目的:

SystemVerilog で 追加された 合成可能な論理記述について記す

概要:

追加された項目としては、主に以下の様なものがある。
  1. .<ポート名> や .* による ポート宣言
  2. 数値記述
    1. bit幅の省略
    2. 可変長リテラル
  3. logic 変数
  4. 用途別 always 文
  5. 多次元配列
  6. enum
  7. typedef
  8. 構造体(struct)
  9. その他
  10. 共用体(union)
    interface
    package
    $clog2(), $bits()
    キャスティング

詳細:

  1. .<ポート名> や .* による ポート宣言
  2. モジュール呼び出し時、ポート名とネット名が同じ場合は .<ポート名> で接続できる。
    また。ポート名も .* で 省略できる。

    .<ポート名>での 宣言 (ネット名を省略)
    module1 i_module1 (
      .rst,
      .clk,
      .sig1,
      .sig2,
      .sig3(signal_3)
    ) ;
    sig3以外はネット名を省略。
    .* での 宣言 ( ポート名を省略 )
    module1 i_module1 (
      .*,
      .sig3(signal_3)
    ) ;
    sig3以外は * で省略。
    どちらも、sig3 以外は ネット名 と ポート名が同じ 場合に使用できる。
    但し、.* での接続は 回路記述では 推奨されないらしい。

  3. 数値記述
    1. bit幅の省略
    2. 'd30 の様に bit幅 を省略して記述できる。
      例えば、bit幅を P_BW のようにパラメータとした場合に '1' を設定する場合、
      data <= {{(P_BW-1){1'b0}},1'b1}
      の様にして bit幅を合わせて数値を記述/代入していたが、
      data <= 'd1 ;
      で良いとのこと。
      * Verilog では bit幅を省略すると 32bit とみなされ、合成はできるが spyglass 等のチェックで Warning が発生する。

    3. 可変長リテラル
    4. '0 や '1 で all '0' や all '1' を 表す。
      例えば、bit幅を P_BW とした場合に all '1' を設定する場合、
      data <= '1 ;
      で良い。

  4. logic 変数
  5. reg , wire の代わりに logic で宣言可能。
    (全て logic 宣言で良い。assign文, always文 のどちらにも使用できる。)
    但し、以下のwire の 様な 宣言と同時に代入を行うことはできない。
    wire  signal_1 = signal_2 ; <-- OK
    logic signal_1 = signal_2 ; <-- NG
    尚、icarus, vivado では コンパイル時にはエラーにならないが、シミュレーションでは代入されていない。
    会社で使用している環境ではコンパイル時にエラーになった。

  6. 用途別 always 文
  7. always文 を always_ff, always_comb,  always_latch で使い分けることができるようになった。
    1. always_ff
      always 文 で 順序回路(FF) を作る場合に使用する。
      従来の always での 順序回路記述と同様。
    2. always_comb
      always 文 で 組み合わせ回路 を作る場合に使用する。
      以下の様に、センシビリティリストは不要。
      always_comb
        if  (a)  dt = b ;
        else     dt = c ;
      Verilog の always @(*) と同様。
      case 文, if文 等で、条件を網羅していない場合は、ラッチが生成される。
    3. always_latch
      ラッチ生成用。詳細不明。

  8. 多次元配列
    1. 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
    2. packed の 多次元配列
      SystemVerilog では 以下の様に記述すると packed となる。
      [3:0][7:0] data :
      この場合、data[3] ~ data[0] は 連続空間となり、以下の様に 32bit幅のデータを assign することが可能。
      wire [31:0] data2 ;
      assign data = data2 ;
    3. 高次元配列
      以下の様な 3次元以上の配列も可能。
      [15:0][11:0][3:0][7:0] data : // 4次元配列の場合

  9. enum
  10. 列挙(enumeration)型。
    値を名前で定義できる。
    例 : ステートマシンの ステート定義
    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 では 代入できる )

  11. typedef
  12. データのタイプ名を新たに定義することができる。
    例えば、
    typedef enum logic [1:0] {ST_0,ST_1,ST_2,ST_3} t_stat ;
    t_stat stat ;
    t_stat next_stat ;
    の様に使用できる。

  13. 構造体(struct)
  14. 構造体
    以下の様に、複数の信号を 1つの名前に纏めることができる。
    struct {
      logic        we   ;
      logic [ 7:0] adr  ;
      logic [15:0] data ;
    } bus_sig ;
    struct にも packed と unpacked があり、指定しなければ unpacked となる。
    以下の様に packed と した場合、struct に 値を代入できる。
    struct packed {
      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
    が入る。

  15. その他
  16. その他、
    • 共用体(union)
    • interface
    • package
    • $clog2(), $bits()
    • キャスティング
    等があるが、詳細は未調査。

0 件のコメント:

コメントを投稿