STARC RTL 設計スタイルガイド

STARCは、2016年解散された(株)半導体理工学研究センター(Semiconductor Technology Academic Research Center:STARC)。
http://www.starc.jp

STARC RTL設計スタイルガイドはSTARCが作成した。

RTLは、Registar Transfer Level(登録転送水準)という論理回路記述。

HDLは、金物記述言語(Hardware Description Language)。

IEEE/IEC 1364-2005がVerilog HDL.
IEEE/IEC 62530:2011 SystemVerilog - Unified Hardware Design, Specification, and Verification Language
http://ieeexplore.ieee.org/document/6469140/

IEEE 1076-2008 VHDL Language Reference Manual/IEC 61691-1-1:2011 Behavioural languages - Part 1-1: VHDL Language Reference Manual
http://ieeexplore.ieee.org/document/4772740/

VHDLは、VHSIC(very high speed integrated circuits) HDL

STARC RTL 設計スタイルガイドには、
Verilog HDL 編とVHDL編がある。

Verilog HDL編は初版、第二版、2011年版と改定があり、2011年版はSystem Verilogを包含している。

hi_verilog_hdl.jpg

Verilog HDL版、VHDL版のどちらも電子書籍になっている。Verilog HDL版が3,758円 VHDL版が3218円購入できる。書籍の古本が絶版当時に高値がついたままになっていることがあるため注意が必要。

http://www.hdlab.co.jp/web/a050consulting/b030styleguide/

規則分類

必須.png

必須だから絶対守らなければならないということではない。必須でも特別な理由で守らない方が品質が高かったり、保守が容易だったり、可読性が高かったりすることがある。よいことがあれば、逸脱の手続きを取るとよい。

逸脱の手続きはMISRA Cを参考にするとよい。
MISRA C まとめ #include
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

豆知識

C言語におけるMISRA CとHDLにおけるスタイルガイドの違いは、時間を扱っているかどうかである。計算機システムにおいて、刻時図(timing chart)を描く必要性はスタイルガイドを理解しているとよく分かる。

Verilog HDL

Verilog HDLは、論理回路を設計する記述。

Verilog HDL 特徴1 begin end(like Pascal)

Pascalと同じようにbeginで始まりendで終わる塊(block)を構成できる。

wire [3:0] A,B,C,D;
wire [1:0] S;
wire [3:0] Y;
function [3:0] FUNC_MUX ;
  input [3:0] A,B,C,D;
  input [1:0] S;
  begin
    case (S)
      2'h0 : FUNC_MUX = A;
      2'h1 : FUNC_MUX = B;
      2'h2 : FUNC_MUX = C;
      2'h3 : FUNC_MUX = D;
      default : FUNC_MUX = 4'bx;
    endcase
  end
endfunction
assign Y = FUNC_MUX(.B(B),.C(C),.D(D),.S(S),.A(A));

p.2-118

Verilog HDL 特徴2 Preprocessor (like C language)

C言語と同じようにプリプロセッサがあり、文字列の置き換えが可能である。

「3 章 RTL 設計手法
3.2. 機能ライブラリの使用
3.2.2. グローバル・パラメータは別ファイルに定義
3.2.2.5. テキスト・マクロの入れ子はさせない」p.3-13

`define KILO 1024
`define METER 1
`define KILOMETER 1000

Verilog HDL 特徴3 simulation direction

模擬試験(simulation)の指示を書くことができる。
遅延の評価、同時実行の可能性など、記述だけでは確かめるのが難しい問題を試験する。

「4 章 検証のテクニック
4.1. テストベンチ記述
4.1.3 入力信号のタイミングに注意
4.1.3.1 入力信号への代入のタイミングはクロックの立ち上がりエッジからずらす」

starc4_1_3.png

p4-5

SWESTでの取り組み

SWESTまとめ
https://qiita.com/kaizen_nagoya/items/62e56ae151554d6200c0
SWEST10
https://swest.toppers.jp/SWEST10/program.html
で、
「スタイルガイドを用いたVerilog教育の成果と課題」
「Verilogスタイルガイドこんなコードもコンパイルエラーにならない」
というポスタ展示と議論形式のセミナを開催した。
参加者の方にガイドで、大事なものから3つから10程度順番にあげてもらった。

集計して見ると、必須以外のもので大事なものがあることがわかった。

. STARC RTL設計スタイルガイド を「こう使おう」 Verilog-HDL版
https://www.slideshare.net/kaizenjapan/starc-verilog-hdl2013d-16795634
https://researchmap.jp/?action=cv_download_main&upload_id=14097

starc1_4_3.png

How to use STARC RTL Design Style Guide Verilog-HDL 2011 version
https://www.slideshare.net/kaizenjapan/how-to-use-starc-rtl-design-style-guide-veriloghdl-2011-version

結果を学会で発表し、2011年版の改訂に反映してもらえた。
Verilog HDL編第二版

1章 基本設計制約
1.4. クロック
1.4.3. ゲーティッドクロックの使用は注意
① 同一クロックライン上での反転、ゲーティッドクロックの使用、エッジの異なるFF の使用は避ける,推奨2
② FF の出力ピンを他のFF のクロックピンに入力しない,推奨1
③ ゲーティッドクロックは、消費電力を抑えるためにはよい方法,参考
④ クロック信号は、FF のクロック入力端子以外(D 入力等)には供給しない,推奨1
⑤ クロック信号は、ブラックボックスや双方向端子、リセットラインに接続しない,推奨3
⑥ 反転エッジのFF を使用しない,推奨1

Verilog HDL編 2011年版

1章 基本設計制約
1.4. クロック
1.4.3. ゲーティッドクロックと正しいクロックライン
① 同じクロックラインで正負両エッジクロックを使用しない,推奨2
② 反転エッジFF を使用しない,推奨1
③ FF の出力ピンを他のFF のクロックピンに入力しない,必須
④ ゲーティッドクロックはOR 型、AND 型以外は用いない,必須
⑤ クロックラインにNAND, NOR, XOR, XNOR, ラッチ, トライステートバッファは用いない,必須
⑥ クロックラインにグリッチを発生させない,推奨1
⑦ クロック選択信号を生成しているFF は、クロック選択後のクロックを入力しない,必須
⑧ ゲーティッドクロックを生成しているFFは、ゲーティッドされた後のクロックを入力しない,必須

STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
https://www.slideshare.net/kaizenjapan/ss-17533146

Verilog HDLスタイルガイドの利用方法, Trials on training engineers for Verilog HDL using the HDL style guide, 長谷川誠,渡会勝彦,米永裕司,渡部 謹二,小川 清, 情報処理学会研究報告計算機アーキテクチャ(ARC) 2007(1(2008-ARC-176)), 7-10, 2008-01-15,一般社団法人情報処理学会
https://ci.nii.ac.jp/naid/110006625503

HDLコードの記述ルール・チェックを体験する
http://www.kumikomi.net/archives/2009/06/hdl.php?page=3

Starc RTL設計スタイルガイドの検査道具spyglassの使い方
https://www.slideshare.net/kaizenjapan/starc-rtlspyglass

System Verilog

2011年版からSystem Verilog対応になった。「2章RTL 記述テクニック」の追加項目を紹介。
(「4章検証のテクニック」にも追加項目あります。)

2.12. データタイプの拡張(SystemVerilog 編)

2.12.1. reg とwire をlogic におきかえる
① reg, wireの代わりにlogicを使用する、推奨2
② 複数のドライバをもつ信号は、wireで宣言する、必須
③ 2 値のデータイプ(bit, byte, shortint, int, longint)は使用しない、必須
2.12.2. パック型配列を活用する
① パック型配列は配列の全要素をベクタとして取り扱うことができる、参考
② 多次元配列の部分選択が可能である、参考
2.12.3. 構造体と共用体を活用する
① CPUからアクセス可能なレジスタは構造体と共用体で記述する、推奨2
② 回路記述ではパック型の構造体、共用体を使用する、必須
2.12.4. ステートマシンの記述に列挙型を使う
① 列挙型を使用した場合でも、組み合わせ回路ではすべての条件を記述する、必須
 ・if 文の場合は、else 項を記述する
 ・case 文の場合は、default 項を記述する
② 不定値を定義する際は、列挙名の最後に定義する、推奨1
③ ユーザ定義型を使用して、タイプ宣言と変数宣言を分ける、参考

2.13. 新しいalways 文(SystemVerilog 編)

2.13.1. always_comb による組み合わせ回路の記述
① 組み合わせ回路はalways_combで記述する、推奨1
2.13.2. always_ff による順序回路の記述
① 順序回路はalways_ffで記述する、推奨1
2.13.3. always_latch によるラッチ回路の記述
① ラッチ回路はalways_latchで記述する、推奨1

2.14. if 文とcase 文の拡張(SystemVerilog 編)

2.14.1. priority とunique の使用方法に注意する
① 優先順位のある組み合わせ回路は、priority ifで記述する、推奨2
② 並列処理可能な組み合わせ回路は、unique caseで記述する、推奨2
③ priority case、およびunique ifの記述は行なわない、必須
④ always_comb、又はalways_ffとセットで使用する、推奨2

2.15. モジュール、ファンクション宣言と接続(Verilog-2001, SystemVerilog編)

2.15.1. ANSI C スタイルのモジュール宣言を使用する
① ANSI Cスタイルのモジュール宣言を使用する、推奨2
② 方向とデータタイプを省略しない、必須
2.15.2. コンポーネント接続には、ポート名接続を使用する
① コンポーネント接続はポート順接続ではなく、ポート名接続を使用する、必須
② コンポーネントのポート幅と接続するネットのビット幅を合わせる、必須
③ ポート名とネット名が同一の場合は、.nameポート接続を使用する、推奨2
④ 回路記述に、.*ポート接続を使用しない、必須

2.16. インターフェース(SystemVerilog 編)

2.16.1. バスをインターフェースで記述する
① バスをインターフェースで記述する、推奨1
② 繰り返し使用するモジュール間の信号をインターフェースで記述する、推奨1
③ クロック、非同期リセットをバスインターフェースを介して接続する、推奨2
2.16.2. インターフェース内でmodport を定義する
① インターフェース内でmodportを定義する、必須
② 呼び出し側でmodportを指定する、必須
③ インターフェースで定義するポート名は短い名前を使用する、推奨2

1.7. FPGA

第二版

1.7.1. ASICとFPGAの両方を使用する場合の注意点
① 1 つのFPGA 内でゲーティッドクロックを使用しない, 推奨1
② FPGA とASIC で異なる部分はCORE の記述から除外する, 参考
③ FPGA, ASIC で異なる記述は`ifdef で切り替える, 参考

2011年版

1.7.1. ASIC とFPGA の両方を使用する場合の注意点
① FPGA 固有のクロックライン生成方法に従う、参考
② FPGA とASIC で異なる部分はCORE の記述から除外する、参考
③ FPGA, ASIC で異なる記述は`ifdef で切り替える、参考

FPGAでVerilog HDLの教育を始めた2006年頃、熊本大学の末吉敏則教授からSTARC RTL設計スタイルガイドを適用するよう助言されたのが取り組みの始まり。

中部FPGAカンファレンス2010
「STARC RTL設計スタイルガイドを「こう使おう」Verilog-HDL版」
      名古屋市工業研究所 小川 清
http://www.fpga.or.jp/5city2010/ChubuSC2010.html

Verilog HDLスタイルガイドを利用したFPGAプログラミング研修, 服部智幸, 渡部謹二, 小川清 ,電気関係学会東海支部連合大会講演論文集(CD−ROM) 2008

HAZOPの併用

スタイルガイドには、英語版と日本語版がある。

日本人が書いているが、日本語版より英語版の方が分かりやすい。
下記の資料を見ると、英語版とHAZOPの相性が良いことが分かる。

2016年7月
MISRA-C++と CERT C++ による安全・安心システムへの貢献 -STARC RTL 設計スタイルガイドと HAZOP を使って, 小川清, 日本学術 会議安全工学シンポジウム
Misra cpp, cert cpp 2016 and RTL design style guide with HAZOP
https://www.slideshare.net/kaizenjapan/misra-cpp-cert-cpp-2016-with-rtl-design-style-guide

スライド49.jpg p.49

ちょけねこ たんじょうびのおくりもの 
https://qiita.com/kaizen_nagoya/items/fc9675686c229f7a155e

効率的なHAZOPの進め方
https://qiita.com/kaizen_nagoya/items/2b8eae196945b7976446

参考文献 

Verilog on Qiita

同期回路と設計上の注意点
https://qiita.com/junjihashimoto@github/items/7ca080592d745707cf2e

同期回路とVerilog
https://qiita.com/junjihashimoto@github/items/38acb9513e26f93e5179

同期回路とFPGA
https://qiita.com/junjihashimoto@github/items/3b6a3cf45c8099ae66cd

verilogでsigned演算するときに気をつけること
https://qiita.com/tasq0/items/18497956360820bcbbc5

Verilog入門
https://qiita.com/thtitech/items/8cc898dda7a10780f495

Verilogでプロセッサを作ろう
https://qiita.com/thtitech/items/78d6ac9ef48d242d873d

Verilogでシリアル通信入力
https://qiita.com/cyebu1103/items/b72eed2e0f50b843ae21

Verilogで外部テキストファイル読み込み
https://qiita.com/cyebu1103/items/b054cdcf9e014f332edd

FPGAでハードウェアアクセラレータを作る:②シグモイド関数
https://qiita.com/cyebu1103/items/bcd30683f9a9c7050701

Verilogでコード整形
https://qiita.com/kkumt93/items/70766645c07c298d19c3

OSXでのVerilogHDL環境構築&4bitカウンターを作って波形を見る
https://qiita.com/Hiroki11x/items/ec8ce716d3117360313f

【Mac】macでVerilogHDLを動かす
https://qiita.com/nomunomu/items/7bd151cbb9cce3fbd219

$ brew install icarus-verilog

iverilog と verilisp を使う
https://qiita.com/ryos36/items/95c049d96575f5e8aa6d

ニューラルネットワークをFPGA実機で動かした
https://qiita.com/kotauchisunsun/items/ab1804aeab7d9d222c72

FPGA上で動くニューラルネットワーク・ジェネレータを作った
https://qiita.com/kotauchisunsun/items/f19e400f47bd06445361

FPGAで競技プログラミングの問題を解く
https://qiita.com/kusano_k/items/29b1cc40ff55c7760afb

[Verilog超絶初心者]$monitorの罠
https://qiita.com/zan/items/b8fdf9532a4790a8d170

FPGAで動作するBrainf**k CPUの詳細
https://qiita.com/moizumi99/items/4f22df393112577cbdaa

素人が作る超基本CPU@Verilog w/Vivado
https://qiita.com/arutema47/items/40dc748e349c30d7194a

ズンドコVerilog
https://qiita.com/ozwk/items/42486e02caf4ac720d7e

15年ぶりの Verilog
https://qiita.com/minosys/items/7d9fcc4f31eafacec825

VerilogのテストベンチをRubyで書けるようにした(Verilator + SWIG風味)
https://qiita.com/sin00b/items/551dc0436676ee8eacdf

Verilog HDLでのノンブロッキング代入とブロッキング代入の動作の違い (授業用)
https://qiita.com/rikitoro@github/items/7a2ee703182c3abd9f83

Verilog HDLによる順序回路の設計(授業用)
https://qiita.com/rikitoro@github/items/b518a1cce062419506a6

Verilog HDLによる組合せ論理回路の設計(授業用)
https://qiita.com/rikitoro@github/items/ab3a734b4e19df0ad19f

Verilog HDLによる論理回路のモジュール設計(授業用)
https://qiita.com/rikitoro@github/items/a2a9c9eadfda878cce69

Verilog HDLでの回路記述で用いる数値表現と演算子 (授業用)
https://qiita.com/rikitoro@github/items/9e93b3b9d9c7dd2bd156

ソフトウェアの人がVerilogでジュリア集合を表示するまでに難儀したこと
https://qiita.com/k-daigo@github/items/6f2f92b245bb365d6c61

VerilogのテストにPython製フレームワーク「cocotb」を使う。
https://qiita.com/tethys_seesaa/items/99504dede7657f1619ce

OSSになったVerilogシミュレーター「CVC」
https://qiita.com/tethys_seesaa/items/e520a144243fae8d5b19

venv をつかって Polyphony を複数バージョンインストールする
https://qiita.com/ryos36/items/7e7fce9078a79f782380

System Verilog on Qiita

Verilogシミュレーター「OSS CVC」のDPI機能を試す。
https://qiita.com/tethys_seesaa/items/5745acad451ef53dbac9

[SystemVerilog]動的二次元配列の初期化とかparameterとか。
https://qiita.com/tethys_seesaa/items/f4486490bce69e04f96e

DDR3 SDRAMモデルをつないでみる。
https://qiita.com/tethys_seesaa/items/9e7ec116e46ad3676c8c

[SystemVerilog]Sublime Textでパースする。
https://qiita.com/tethys_seesaa/items/1c397b878c8377718d80

[SystemVerilog]Sublime Text用のUVMスニペットを書いてみた。
https://qiita.com/tethys_seesaa/items/2cfd1e70190bfd1c482d

[SystemVerilog]svlibでCPUオペコードっぽいものを定義しようと試みた。
https://qiita.com/tethys_seesaa/items/21bd8825e0ce158b67af

[SystemVerilog]svlibがバージョンアップしてた。
https://qiita.com/tethys_seesaa/items/c0ebee313e61aed17a3f

[Systemverilog]foreverなタスクをkillして殺す。
https://qiita.com/tethys_seesaa/items/1c69b62bf5d534315f90

[SystemVerilog]UVMことはじめ
https://qiita.com/tethys_seesaa/items/67438fa56501c42169c2

[SystemVerilog]packageを作る。
https://qiita.com/tethys_seesaa/items/51c7a1b9739cbed485fc

[SystemVerilog]uvm_driverを作成する。
https://qiita.com/tethys_seesaa/items/2620f8b635bc351f6fbb

[SystemVerilog]interfaceを入れてuvm_driverに似た何かを作る。
https://qiita.com/tethys_seesaa/items/3f41d4780bdbf4a6f6b3

[SystemVerilog]既存のモジュールを無理矢理UVMのフローに載せてみる。
https://qiita.com/tethys_seesaa/items/8bc05346a2d487895834

[SystemVerilog]UVMことはじめ
https://qiita.com/tethys_seesaa/items/67438fa56501c42169c2

[SystemVerilog]Sublime Text 3で簡単なSyntaxチェック
https://qiita.com/tethys_seesaa/items/1676b19e7f276e94f826

[SystemVerilog]svlibの紹介
https://qiita.com/tethys_seesaa/items/f4d10976677cdc8a63c0

書籍・電子書籍

STARC RTL設計スタイルガイド verilog HDL編 2011年版(System Verilog含む)
http://www.hdlab.co.jp/web/a050consulting/b030styleguide/

Verilog HDL デザイン・テンプレート, 植木うてな
http://p.booklog.jp/book/20242

文書履歴

ver 1.00 初稿 20180320
ver 1.01 英語版の方が日本語版よりわかりやすく、HAZOPと相性が良いことを追記 20180323
ver 1.02 タグに「HDL」追記。slideshareのHAZOPスライド1枚追加。20180323
ver 1.03 FPGAの項目を追記。20180324
ver 1.04 Verilog HDL参考文献追記 20180324
ver 1.05 System Verilog参考文献追記 20180324
ver 1.06 System Verilog関連規則追記 20180324

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.