●ハードウェア設計のためのBach C記述の制限
- 以下の構文は、合成対象の記述では使用できない
- ライブラリ関数
- ファイルI/O
- テストベンチ、検証のみでは使用できる
- 合成対象に上記の記述が含まれている場合は、除かなければならない
●Bachコンパイラの起動
- bachc -clk クロック周期 -mn 合成対象の関数名 ファイル名
- (例)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)
●テストベンチ生成のための記述方法
- 合成対象のトップ関数とテストベンチのトップ関数はparで実行される
- パラメータは型、パラメータ名が完全に一致しており、そのパラメータはchanまたはachanのみ
- 合成対象とテストベンチの間で共有変数があってはならない
- テストベンチ内でストリーム変数をスレッド間で共有してはならない
●テストベンチ生成
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によるシミュレーション
- bachcが生成したRTレベルVHDLはシミュレーション可能
- bachanコマンドを利用して必要なVHDLファイルをアナライズする
- bachan [-i] ファイルの名前
++ -i: インタプリタモードでvhdlanを実行
●ModelSimを使用する場合
- bachanコマンドのオプションに-msimを指定す
ることによりModelSim を利用可能
- bachan [-msim] ファイルの名前
- -msim : ModelSim用のアナライズを実行
●メモリマッピング用プラグマ
- 配列を宣言(グローバル、静的変数)
- メモリ自体を宣言
#pragma device ...
- メモリの動作の設定
#pragma configure_ram
- 配列をメモリへ割り付ける
#pragma associate ...
●メモリの記述方法の例
- 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にマッピング
- 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;
複数の配列を同じメモリにマッピングすることができる
メモリのサイズを越えて配列を割り付けることはできない
●メモリの使い方(注意点)
- ROMに割り付けた配列には、初期化以外に書き込んではいけない
- #pragma associate 変数with メモリ; は変数の有効範囲内に記述する
●配列アクセス調停回路用プラグマ(スレッド間)
- 複数スレッドからアクセスされる配列には、アクセス競合のための仲裁回路が生成される。
- 必ず排他的にしかアクセスされない配列について、仲裁回路の生成をしないように制御可能
例)
int a[10];
#pragma no_resolution a;
- メモリに割り当てた配列の場合、メモリ名を指定。
●配列アクセス調停回路用プラグマ(回路-テストベンチ間)
- 回路とテストベンチの両方からアクセスされる配列には、アクセス競合のための仲裁回路が生成される。
- 必ず排他的にしかアクセスされない配列について、仲裁回路の生成をしないように制御可能
例)
int a[10];
#pragma no_ext_resolution a;
- メモリに割り当てた配列の場合、メモリ名を指定
●配列実現用プラグマ
- 1つのスレッドからのみアクセスされるROM/RAMに割り当てられていない配列
は、スレッド内のローカルなレジスタ、組合せ回路で実現
- スレッドの外部のリソースとしてもハードウェア生成可能
例)
int a[10];
#pragma non_local a;
●float/doubleの合成
- bachcは、浮動小数点(float, double)をそのまま合成しない
- 小数点の位置を固定(整数部、小数部を表現する各ビット幅を固定)して表現する固定小数点化して合成する。
- 合成(bachc)では、整数部16ビット、小数部16ビットの固定小数点に自動で変換。
-float_bits x.y で変更可能
x: 全体のビット幅
y: 整数部のビット幅
- シミュレーション(bach2c)では、指定がなければfloat, doubleのまま計算。
- -float_bitsオプションで固定小数点化してシ`ミュレーション。
●並列構文の有効利用
- par文による並列記述により、面積、時間的なオーバヘッドが生じる
- スレッド毎に制御部が生成される(面積的なオーバヘッド)
- par文による同期が発生
- 局所的な並列性の記述は行わない