Bach-Cファイルを合成

●ハードウェア設計のためのBach C記述の制限

  1. 以下の構文は、合成対象の記述では使用できない
    1. ライブラリ関数
    2. ファイルI/O
  2. テストベンチ、検証のみでは使用できる
  3. 合成対象に上記の記述が含まれている場合は、除かなければならない

●Bachコンパイラの起動

  1. bachc -clk クロック周期 -mn 合成対象の関数名 ファイル名
  2. (例)sample.cの関数circ()以下を30MHzで合成する場合
    % bachc -clk 33 -mn circ sample.c

●bachcにより生成されるVHDLファイル

% bachc -mn circ sample.c 
sample.vhd トップ階層(RTL)
samplepe1_rtl.vhd 合成用記述(RTL)
…
samplepen_rtl.vhd 合成用記述(RTL)
sample_package.vhd ローカル配列用記述
sample_res.vhd 共有リソース記述(RTL)

●テストベンチ生成のための記述方法

  1. 合成対象のトップ関数とテストベンチのトップ関数はparで実行される
  2. パラメータは型、パラメータ名が完全に一致しており、そのパラメータはchanまたはachanのみ
  3. 合成対象とテストベンチの間で共有変数があってはならない
  4. テストベンチ内でストリーム変数をスレッド間で共有してはならない

●テストベンチ生成

sample.c:
void main()
{
 chan #12 a, b;
 par {
 circ(a, b) //合成対象関数
 bench(a, b)  //テストベンチ関数
 }
}
テストベンチの作成コマンド
% bachc -mn circ -gh bench sample.c
sample_harness.vhd テストベンチ用記述

●VHDLによるシミュレーション

  1. bachcが生成したRTレベルVHDLはシミュレーション可能
  2. bachanコマンドを利用して必要なVHDLファイルをアナライズする
  3. bachan [-i] ファイルの名前
    ++ -i: インタプリタモードでvhdlanを実行

●ModelSimを使用する場合

  1. bachanコマンドのオプションに-msimを指定す ることによりModelSim を利用可能
  2. bachan [-msim] ファイルの名前
    1. -msim : ModelSim用のアナライズを実行

●メモリマッピング用プラグマ

  1. 配列を宣言(グローバル、静的変数)
  2. メモリ自体を宣言
    #pragma device ...
  3. メモリの動作の設定
    #pragma configure_ram
  4. 配列をメモリへ割り付ける
    #pragma associate ...

●メモリの記述方法の例

  1. RAM
    static int #8 a[256]; //8bit幅int型の配列a[256]を宣言
    #pragma device RAM int #8 mram[256]; //配列と同じ型の8bit幅int型のRAM myram[256]を宣言
    #pragma configure_ram mram (speed=20, extern); //myramの動作を設定
    #pragma associate a with mram; //配列a[256]をmyramにマッピング
  1. ROM
    static int #16 b[1024];
    #pragma device ROM int #16 mrom[1024];
    #pragma configure_rom mrom (speed=20);
    #pragma associate b with mrom;

●メモリの使い方

static int #8 a[256], b[256], c[512];
#pragma device RAM int #8 bigram[1024];
#pragma configure_ram bigram (speed=20); 
#pragma associate a, b, c with bigram;
複数の配列を同じメモリにマッピングすることができる
メモリのサイズを越えて配列を割り付けることはできない

●メモリの使い方(注意点)

  1. ROMに割り付けた配列には、初期化以外に書き込んではいけない
  2. #pragma associate 変数with メモリ; は変数の有効範囲内に記述する

●配列アクセス調停回路用プラグマ(スレッド間)

  1. 複数スレッドからアクセスされる配列には、アクセス競合のための仲裁回路が生成される。
  2. 必ず排他的にしかアクセスされない配列について、仲裁回路の生成をしないように制御可能
    例)
    int a[10];
    #pragma no_resolution a;
  3. メモリに割り当てた配列の場合、メモリ名を指定。

●配列アクセス調停回路用プラグマ(回路-テストベンチ間)

  1. 回路とテストベンチの両方からアクセスされる配列には、アクセス競合のための仲裁回路が生成される。
  2. 必ず排他的にしかアクセスされない配列について、仲裁回路の生成をしないように制御可能
    例)
    int a[10];
    #pragma no_ext_resolution a;
  3. メモリに割り当てた配列の場合、メモリ名を指定

●配列実現用プラグマ

  1. 1つのスレッドからのみアクセスされるROM/RAMに割り当てられていない配列 は、スレッド内のローカルなレジスタ、組合せ回路で実現
  2. スレッドの外部のリソースとしてもハードウェア生成可能
    例)
    int a[10];
    #pragma non_local a;

●float/doubleの合成

  1. bachcは、浮動小数点(float, double)をそのまま合成しない
  2. 小数点の位置を固定(整数部、小数部を表現する各ビット幅を固定)して表現する固定小数点化して合成する。
  3. 合成(bachc)では、整数部16ビット、小数部16ビットの固定小数点に自動で変換。
    -float_bits x.y で変更可能
    x: 全体のビット幅
    y: 整数部のビット幅
  4. シミュレーション(bach2c)では、指定がなければfloat, doubleのまま計算。
  5. -float_bitsオプションで固定小数点化してシ`ミュレーション。

●並列構文の有効利用

  1. par文による並列記述により、面積、時間的なオーバヘッドが生じる
    1. スレッド毎に制御部が生成される(面積的なオーバヘッド)
    2. par文による同期が発生
  2. 局所的な並列性の記述は行わない

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-29 (木) 00:03:48