*[[Bach-C→ISE]] [#fed3d180] ●遅延モデルの指定 +遅延モデルは.mdlファイルに記述する +デフォルトの遅延モデルを用いて合成する場合は、 % bachc -mn process -model default.mdl test.c で合成することができる ●メモリマッピング用プラグマ +配列を宣言(グローバル、静的変数) +メモリ自体を宣言 #pragma device ... +メモリの動作の設定 #pragma configure_ram +配列をメモリへ割り付ける #pragma associate ... ●FPGA内のブロックRAMを使用する +メモリモデルファイルを生成し、メモリのピン名を指定(ファイル名は拡張子.rmdlのファイル) メモリモデルファイルの内容の例 NAME = "myram" CLK_NAME = "CLK" CLK_POL = RISE ADR_NAME = "ADDR" DI_NAME = "DIN" DO_NAME = "DOUT" WE_NAME = "WE" ※これはシングルポートのブロックRAMにあわせた記述例である。他のメモリの場合にはそれにあわせた記述をしなければならない ●メモリの記述方法の例 +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にマッピング ●メモリモデルファイルの指定 +明示的にメモリモデルファイルを指定 #pragma configure_ram mem1 (model=memmodel); こうすると、RAMのmem1のメモリモデルをmemmodel.rmdlに指定することができる +bachcコマンドでメモリモデルファイルを指定 % bachc -mn process -ram_model memmodel.rmdl test.c こうすると、#pragma で指定してないメモリのメモリモデルは全部memmodel.rmdlに指定することができる +ROM static int #16 b[1024]; #pragma device ROM int #16 mrom[1024]; #pragma configure_rom mrom (speed=20); #pragma associate b with mrom; ●ISEで合成するときの手順 +ISEの起動 +新規プロジェクト Project name → 任意のプロジェクト Project location → 任意の場所 Top-level source type → HDL +Device Propaties ターゲットデバイスを考えて選択 +Create a new Source 新しくファイルを作る必要がなければ次へ +Add Exsisting Sources bachcコマンドでできたvhdファイルを全部選択(テストベンチ以外) 上記とは別にbachstd.vhdを/home/vdec/sharp/bach-3.5/lib/bachstd.vhdから持ってくる +Finish +BLOCK RAMを用いる場合 ++inst_memmodel_1 - memmodel等の"?"になっている部分を選択し、右クリックからnew source ++ファイル名はメモリモデル名と同じにするとよい ++IP(Core Generator & Architecture Wizard)を選択し、次へ ++Memories & Storage Elements → RAMS & ROMS → Single Port Block Memory ++Finish ++Memory Size のWrite Widthは、RAMの型に合わせる。 char型なら8、int型なら16を指定 ++Memory Size のWrite Depthは、RAMの大きさに合わせる。 #pragma device RAM int t_mem0[1024];と指定したならば、1024を入れる。 +トップモジュールを指定し、Synthesize、Implement Designを行う。 ●メモリの使い方 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文による同期が発生 +局所的な並列性の記述は行わない