KirIn 落書き帳

素人がプログラミング, FPGA, LSIをお勉強しているメモ書きです。間違いがあればご指導していただけたら幸いです。

『LSI/FPGAの回路アーキテクチャ設計法』読書メモ

デジタル回路等の書籍でアーキテクチャの検討方法について記載しているものはなかなかないと思います。 設計する際に意識すべき点や、ついつい蔑ろにしてしまう項目が書かれています。 アーキテクチャ設計する際に、忘れないようにメモを残しておこうと思います。

第1~4章

アーキテクチャ設計

  1. アーキテクチャは机上で書いて消してを繰り返す
  2. クリティカルでない部分まで完全に最適化された回路ではなく、動く&目標性能を満たす回路を目指す
  3. RTLを書く段階で、動く & 目標性能を満たすが当然の状態にする

一発でいいアーキテクチャは思いつかないので、数多くの案を出して修正した方が良い。 一番大きな問題から修正を試みる。

まず、ラフでいいのでたたき台アーキテクチャをつくること!!

たたき台アーキテクチャをもとに以下の性能評価を行います。

  1. 一定時間のうちにデータをどれだけ処理できるか
  2. データを入れてから結果が出るまでの時間
  3. 上記の速度の最大、最小、平均
  4. 必要メモリ量
  5. ゲート数
  6. 消費電力

見積もりの正確さよりも見積もり過程を重視すること

たたき台を評価した後の最適化

  1. メモリを減らす
  2. 複数の回路モジュールを同時・並列に動かす
  3. 演算処理や通信の速度(早くなくて良い所は低速化(回路規模縮小、省電力化)する)
  4. 低速で良い処理はプロセッサに
  5. 同時に使わないモジュールは共有、速度が足りないモジュールは増やす

自分の回路がLSI全体の中でどう使われるか考慮する

自分の担当する回路の内部構成だけでなく、外部とのデータのやり取り等も注力したいところです。

誰がたたき台アーキテクチャを作るのか

アルゴリズム作成者が作るほうが効率がいい(処理内容をよく理解していないと時間がかかる) ソースとドキュメントのセットをもらうべきです。 アルゴリズム作成者にたたき台は作ってもらえなくても、ブロック図を作ってください等言ってみるといいかも

ここまででたたき台アーキの速度とはレイテンシのことを指しています。

性能評価の基本手順

  1. 回路の各部を、どれだけのデータ量が流れるか
  2. 入出力バッファの量からワークエリアの計算
  3. ブロック内の処理を観察してレイテンシを計算
  4. 演算器やレジスタから回路規模飲みつもいr

メモリ選定

数百KB程度であればオンチップSRAMが標準的な選択(ある程度コストを掛けられる ASICでももう一桁上程度)

おおよそのクロックサイクルの見積もり

ここは経験がモノを言うので実践あるのみ。(P114参照)

演算処理の速度推定に使う基礎情報

演算部分の遅延から大まかな動作クロック周波数が出せる。(P117参照) 90nm スタンダードセルのワーストケース(配線遅延は除く) ただしFPGAはLUTとDSPで合成されるのでかなり異なる。

演算器の速度と回路規模

 

部品 遅延(ns) 回路規模(ゲート)
整数 加算器(8bit) 0.6 100
整数 加算器(32bit) 1.4 430
整数 乗算器(8bit) 2.2 680
整数 乗算器(32bit) 15.3 8600
整数 除算器(8bit) 3.3 1100
整数 除算器(32bit) 47.5 25000
整数 大小判定(8bit) 0.5 50
整数 大小判定(32bit) 1.1 180
テーブル(8bit x 16 エントリ) 0.4 100
テーブル(8bit x 256 エントリ) 1.2 850
NANDゲート 0.05 1
レジスタ 0.1 7
単精度 浮動小数点 加減算 17.0 4100
単精度 浮動小数点 乗算 14.6 8800
単精度 浮動小数点 除算 56.8 11200
単精度 浮動小数点 大小判定 4.0 600
倍精度 浮動小数点 加減算 31.1 11600
倍精度 浮動小数点 乗算 23.8 38300
倍精度 浮動小数点 除算 128.2 52000
整数→単精度 変換 6.1 1300
整数←単精度 変換 4.3 1200
倍精度→単精度 変換 7.1 4600
倍精度←単精度 変換 3.4 800

プリミティブ演算にかかるおよその感覚

演算の種類 1回あたりの所要クロック数
整数 加減算、乗算、定数除算、大小比較 0 (よほど多ビットでない限り組み合わせ回路で可)
整数 除算 0~ビット数分 (普通はビット数分のクロックをかける)
浮動小数点 加減算、乗算、比較 0
浮動小数点 除算 0~ビット数分(普通はビット数分のクロックをかける)
三角関数演算などの数値演算 数クロック〜数百クロック(利用アルゴリズム依存)
画像フィルタ(1画素分) データがあれば0
ECCやEDC, CRC 簡単な符号は0,RS符号などは数十〜数百クロック
共通鍵暗号 数十クロック
公開鍵暗号 数十万クロック

演算処理がどれくらいでできるかを見積もり

if文で分かれている場合一番重い処理を選択して遅延を推定しデータ転送時間も加えて速度見積もりを出します。

演算器やレジスタの数を数える

基本的には重い演算器のみでマージンとして数KGate見ておけばいい。

初期評価まとめ

以下を主にまとめる

  1. ブロック間データ転送クロック
  2. データ転送量
  3. 入出力バッファ容量
  4. 内部処理クロック数

第6章 データの流れに着目したメモリ配置の最適化

ダブルバッファのアレンジ

  1. 2つのバッファ
  2. 2ポートメモリ
  3. FIFO

第7章 並列化による処理速度と回路規模の最適化

時間方向(パイプライン処理)と空間方向(処理並列化)の並列化を考えます。 その際、レイテンシとスループットの違いを意識すること。

注意点

  1. 同じスループットでもレイテンシが長い -> 回路中のバッファやレジスタが多くなっている可能性があります。
  2. ブロック単位では、レイテンシが問題になる -> そのレイテンシに引っ張られてスループットにも影響を及ぼす。

第9章 各部品の内部構成の検討とRTL設計

リセットについて

非同期・同期の区別をしっかりする。

非同期はパワーオン時、同期はシステムによるリセットに使用します。

ここでリセットラインにかなりの負荷がかかってしまった場合、シフトレジスタ等にリセット信号を入れてドライブ負荷を分散して、複数クロックかけてリセットする場合もあります。

クロック間非同期回路設計における注意点

異なるクロック間でのデータの引き渡しに注意

受信側DFF複数ある場合、伝搬スキューが発生し、DFFごとに違う値をキャプチャーしてしまう可能性があります。

そこでシンクロナイザ(受信DFFで2,3段のシフトレジスター)を追加して、発振やメタステーブルが収めます。
シンクロナイザを追加することによって以下は同一クロックモジュールとして容易にタイミング制約を書けることができます。

もちろんセットアップ時間/ホールド時間違反も起きないように非同期間のタイミング調整がしっかり出来ているならばシンクロナイザは削除します。

スキューの発生はシンクロナイザでも収まらない可能性があります。

  • PLLなどでタイミング調整
  • 2Port SRAMを介してクロックの載せ替えが可能(クロック入力2つのSRAM) ただし制御信号は別途載せ替えが必要