More Related Content
More from Takefumi MIYOSHI (20)
Fpgax 20130830
- 3. FPGAとは
3
論理回路・データパスを自由に作り込める
クロックレベルの同期と並列性の活用
Field Programmable Gate Array
HDLがドレスを着たお姫さまだとすると,コンパイル時
にエラーをしっかり検出してくれるが故にコンパイルを通
すのが困難な反面,コンパイルさえ通れば合成した回路が
きちんと動作してくれるBluespecはパワフルなツンデレ
娘と筆者はイメージしています(図2).
Verilog HDLやVHDLを使った設計で,
― あぁ∼,数字って32ビットだった.うっかりキャスト
されていたよ…
― テスト・ベンチのステート・マシンを書くのが面倒だな.
― モジュールのインスタンシーエーションで入出力ピン
をつなぎ忘れていた
という思いをしたことはありませんか?
単純な記述の羅列や細かいミスへの注力が続くと,本来
力を入れるべき,アーキテクチャの設計まで億劫になって
しまいます.また,「コンパイル(論理合成)は通るのに,
シミュレーションやFPGA上で動作させると,何かおか
しい」という事態に頭を悩ませ,原因はうっかりミスだっ
たということも一度や二度ではないと思います.
記述の手間がもっと省けて,コンパイル時に強力にエ
ラー・チェックしてくれるHDL言語ないかなあ…という
要求に応えてくれるのがBluespec System Verilogです
(図1).VHDLがまじめなキャリア・ウーマン,Verilog ▲ 図2 Bluespec System Verilogは ツ
ンデレ娘
きっちりしていてキャリアも長いVHDL,あいま
新世代のESL合成ソリューション
Bluespec System Verilogのすすめ
本章では,高位設計言語であるBluespec System Verilogを紹介する.こ
の言語では,コンパイル時にしっかりエラー検出ができ,また,さまざまなライブ
ラリも提供している.FPGAやASICが大規模化し複雑な回路を設計する機会が
増えてきた今,知っておくべき技術だろう. (編集部) 三好 健文
出典: CQ出版 Interface 2011年2月号より
- 15. 沢山の高位合成言語/処理系
15
Vol. 29 No. 1 Feb. 2012 81
表 1 ベース言語別に分類した高位合成言語の例
ベースの言語 言語名
C BACH-C[5],Handel-C[6],DeepC Compiler[7],PICASSO[8],COBRA-ABS[9],
DEFACTO Compiler[10],Streams-C[11],GARP C Compiler[12],SA-C[13],
Impulse-C[14],SpecC[15],GorillaC[16]
C++ SystemC[17],OCAPI[18],HP-Machine[19]
Java Galadriel/Nenya[20],JHDL[21],Lime[22],MaxCompiler[23],Sea Cucumber[24],
JavaRock[25]
C# Kiwi[26]
Python PHDL[27],MyHDL[28]
Ruby RHDL[29]
ML CAPH[30]
Fortran DeepC Compiler[7],ROCCC[31],SRC-6[32]
Haskell Lava[33], Bluespec System Verilog[34](BSV)
Matlab MATCH[35],DEFACTO Compiler[10]
た言語および言語処理系では,高水準言語の機能を
用いて記述された部分とハードウェア化の対象とな
また,オブジェクト指向言語において,クラスのイ
ンスタンスの動的な生成を実現するのは困難である.
- 19. 第391回 PTT 2013. 6. 28
JavaRockの現状
JavaプログラムをそのままHW化する
追加構文,データ型は導入しない
記述に制限は加える(できないものはできない)
プログラムカウンタをステートマシンに置換
基本1文1状態 ← 基本ブロック内の並列化くらい
制御構造に対応するステートマシンの入れ子
メソッド呼び出し相当のHDLコード生成
Threadによる並列処理記述
いくつかの都合の良いアノテーション
19
- 23. Javaで書くと...
23
public class Firefly extends Thread{
public boolean flag = false;
private final static int PERIOD = 500;
private final static int SLEEP_WEIGHT = 256;
private void sleep(int v){ for(int k = 0; k < (v * SLEEP_WEIGHT); k++){ ; } }
public void run(){
while(true){
for(int i = 0; i < PERIOD; i++){
flag = true; sleep(i);
flag = false; sleep(PERIOD-i);
}
for(int i = 0; i < PERIOD; i++){
flag = true; sleep(PERIOD-i);
flag = false; sleep(i);
}
sleep(1);
sleep(1);
}
}
}
- 24. トップでインスタンス生成/実行
24
import net.wasamon.javarock.rt.*;
@javarockhdl
public class test{
private final Firefly obj0 = new Firefly();
private final echo obj1 = new echo();
private final MemoriedButton obj2 = new MemoriedButton();
public boolean flag;
public boolean btn_out;
@auto
public void main(){
obj0.start();
obj1.start();
obj2.start();
while(true){
flag = obj0.flag;
btn_out = obj2.flag;
}
}
}
- 28. BlokusDuoプレーヤ
28
SimplePlayer BlokusBoard
+ init
+ setTurnCode
+ setOpponentMove
+ getFirstMoveCode
+ getNextMove
+ init
+ get(x, y)
+ byte getSym()
+ isValid(x, y, c, id, rot)
+ move(x, y, c, id, rot)
board
プレーヤとしての思考ルーチン 盤面の管理/合法手の判定
GameAgent
プロトコル処理/手のやりとり
player
IO
- 29. すごーく単純な戦略の場合
29
private int getNextMove1(){
int code = 0;
while(true){
if(nextId < 0){ break; } // もうコマが残ってないからあきらめ
for(int i = 0; i < COLS; i++){ // 左の
for(int j = 0; j < ROWS; j++){ // 一番上から
for(int k = 0; k < 8; k++){ // コマを回転させつつ
if(board.isValid(COLS - i - 1, ROWS - j - 1, myColor, nextId, k) == true){ // 置ける?
// 置けるなら置いちゃう!!
board.move(COLS - i - 1, ROWS - j - 1, myColor, nextId, k); // 自分の盤を更新
code = encode(COLS - i -1, ROWS - j - 1, nextId, k); // 相手に通知するため
nextId = nextId - 1; // 次回は次のコマから
return code;
}
}
}
}
nextId = nextId - 1; // 今のコマは諦めて次のコマを試す.
}
return -1;
}