|
マイクロアーキテクチャ設計入門
Synplify Proによる高位合成
|
ここではVerilog HDLによるRTLでの動作記述,静的オートマトン記述(SSMD)からのSynplify Proによる高位合成事例を紹介しています.
RTLはレジスタ転送レベル(register transfer level)の略で,論理装置の構成を議論出来る抽象度があります.RTLには動作記述と構造記述があります.世の中で「RTL記述」と言われているVerilog HDLの記述は構造記述です.動作記述は「これをしてからあれをする」といった手続き的な記述を意味します.
オートマトン記述は状態単位に行われるレジスタ間転送と次の状態遷移先を状態毎に列挙する記述を意味します.オートマトン記述の場合は状態遷移によって手続きが表現されます.Verilog HDLでもオートマトン記述は可能で,RTLでの動作記述になります.
Verilog HDLによるRTLでの動作記述と構造記述について詳しくはVerilog HDLによる動作記述と構造記述:City-1の最終年度をご覧下さい.
City-1(シティー・ワン)は1994年に開学した広島市立大学で筆者(高橋隆一)が13年間担当した情報工学実験の名称です.最初の3年生が誕生した1996年(平成8年)度からコンピュータというたったひとつの装置のために存在した情報工学科最後の3年生を育てる2008年(平成20年)度までの13年間実施しました.半期で,全く自由なFPGAコンピュータを一人一台設計し,製作までをする他に類を見ない情報工学実験でした.
|
ビデオCity-1で広島市立大学・情報科学部・情報工学科3年生を対象に筆者が実施したマイクロコンピュータ設計教育環境City-1の最初の3年間を紹介しています.
|
Synplifyは実施3年目の1998年度から使い続けました.上で紹介したビデオに登場する合成ツールはCadence社のSynergyです.他のビデオが高橋隆一のFPGAマイコンCPU設計教育City-1を紹介するDVDでご覧になれます.
NECでインテルに挑んだ経験のある筆者にとって,City-1はどうあっても実施したいマイクロコンピュータ設計教育でした.
以下は文献[1]のInternational Journal of Computer Science and Network Security(IJCSNS), Vol.16 No.10, pp.116-121 (2016)で紹介した静的オートマトン記述(SSMD)の記述例です:
この例ではVerilog HDLのバッククォート・デファイン"`define"でオートマトンの状態名を定義しています.他にparameter文を使うことも出来ます.
オートマトン記述は以下の拙著,文献[2]で紹介している古典的なハードウエア記述言語"DDL"の記述スタイルです.
この拙著では,無論,SSMDも紹介しています.
筆者がNECで開発していた高レベル自動設計システムについてはNEC主任時代の高橋隆一:オートマトン記述からの高位合成でご覧いただけます.SSMDはNECでの研究開発を継承した技術だったりします.
筆者が工夫したとは言ってもVerilog HDLによるRTLでの様態遷移による動作記述,SSMDはIEEE1364標準です.Verilog HDLは非常に広範な記述能力を持ったHDLで,オートマトン記述も仕様の一部だったのです.問題は合成ツールが賢い合成をしてくれるかでした.マイクロコンピュータ設計教育環境City-1で愛用していたSynplifyという合成ツールは期待に応えてくれ,筆者が広島市立大学で情熱を注いだCity-1を支えてくれました.
Synplify Proは,静的オートマトン記述(SSMD)を入力として,論理合成だけでなく,「異なる状態の演算は同時には行われないこと」などに注目した高位合成(high level synthesis)も行えます.高位合成(high level synthesis)は論理合成(logic synthesis)の上位に位置し,機能素子の接続関係を生成する高レベル自動設計技術です.
以下で事例を提示しているSynplifyのバージョンは次の通りです:
Synplify Pro F-2011.09-SP1
合成のオプションでは"FSM Compiler"と"Resource Sharing"を指定しています:
テクノロジーはマイクロコンピュータ設計教育環境City-1で2004年度(平成16年度)以降使ったのと同じ,20万ゲート規模のFPGA,"Xilinx XC2S200-5 PQ208"を指定しています.
|
NEC時代に書いた文献[3]”ハイレベルシンセシスの動向”で示したように,高位合成の戦略は以下の通りです:
- アーキテクチャ分割(architecture partitioning)
- スケジューリング(scheduling)
- データパスアロケーション(data-path allocation)
- コントロールアロケーション(control allocation)
アーキテクチャはユーザから見える論理的な構造です.機械語から見える構造だと言えます. 文献[2]「Verilog HDLによるシステム開発と設計」のWEBサイトでダウンロードできるRISC-1からRISC-3Bを生成する合成戦略がアーキテクチャ分割の事例です.
FETCH,DECODE,EXECの3状態からなる命令解釈実行サイクルを処理する1ユニット(モジュール)の記述RISC-1を入力として,プリフェッチユニット,デコードユニット,実行ユニットの3個のユニット(モジュール)からなる3段パイプラインコンピュータの記述RISC-3Bを生成する戦略がアーキテクチャ分割です.言うまでもなくパイプライン・インターロックにも配慮が必要です.筆者が,NECで最後に行っていた研究です.
スケジューリングでは個々のユニット毎に各タイムスロットでどんな処理を行うかが決定されます.具体的に,加算が何回行われようと同時に実行されることがないならひとつの加算器があれば良いわけです.同じ状態で同時に動作する2つの加算を置けば加算器は2個必要になります.スケジューリングではこのような同時性に注意して,個々のタイムスロットにレジスター間転送を適宜配分します.静的オートマトン記述(SSMD)の場合は,人手で,個々のレジスタ間転送をどの状態で行わせるか配分します.
|
以下はVerilog HDLによる静的オートマトン記述(static state machine description),略してSSMDによって"Q0","Q1","Q2"の3個の状態を記述している動作記述の例です.各状態は2ビットの状態レジスタ"STATE"によって,"00","01","10"という状態割り当てで実現されています."STATE"という名である必要はありません.SSMD本体は状態レジスタ,この例では"STATE"に対する"case"文で記述されています.各状態では次の状態を指定する状態遷移先と併せて,レジスタ間転送が列挙されています.状態遷移とレジスタ間転送を併せて記述するのがオートマトン記述です.はじめに書いたように文献[2]で紹介している古典的なハードウエア記述言語"DDL"の記述スタイルです.それがVerilog HDLでも行えるという話です.
以下に示す事例ではオートマトン記述によって3個の状態で動作を記述しています.
最初の例では状態"Q0"においてのみ"A=A+B"というレジスタ間転送,この例では加算が記述されています.右はSynplify Proによる合成結果です.
|
module Plus1(CLK1,RESET,START,A,B,C,D);
input CLK1, RESET, START;
output [7:0] A,B,C,D;
reg [7:0] A, B, C, D;
reg [1:0] STATE;
`define Q0 2'b00
`define Q1 2'b01
`define Q2 2'b10
always @(posedge CLK1 or posedge RESET)
begin : state_machine
if (RESET)
begin
A=8'h00; B=8'h01; C=8'h00; D=8'h01; STATE <= `Q0;
end
else
begin
case (STATE)
`Q0 : begin
if (START)
begin
A=A+B; STATE<=`Q1;
end
else STATE<=`Q0;
end
`Q1 : begin
if (A<8'h04)
begin
STATE<=`Q1;
end
else
begin
STATE<=`Q2;
end
end
`Q2 : begin
A=8'h00; STATE<=`Q0;
end
endcase
end
end
endmodule
|
|
次の例では静的オートマトン記述SSMDによって同じ"Q0","Q1","Q2"という3個の状態が記述されていますが,状態"Q0"だけでなく,状態"Q1"でも"A=A+B"という加算が行われる記述になっています.右はSynplify Proによる合成結果です.加算の記述は3箇所ありますが,状態"Q0"の"A=A+B"と状態"Q1"の"A=A+B"は同時には実行されません.状態"Q1"には"A=A+B"が2回書かれていますが,場合分けされており,同時には実行されません.Synplify Proは,3回書かれていても同時には実行されない加算であることを見抜いて,加算器3個という合成は行いません.
|
module Plus3(CLK1,RESET,START,A,B,C,D);
input CLK1, RESET, START;
output [7:0] A,B,C,D;
reg [7:0] A, B, C, D;
reg [1:0] STATE;
`define Q0 2'b00
`define Q1 2'b01
`define Q2 2'b10
always @(posedge CLK1 or posedge RESET)
begin : state_machine
if (RESET)
begin
A=8'h00; B=8'h01; C=8'h00; D=8'h01; STATE <= `Q0;
end
else
begin
case (STATE)
`Q0 : begin
if (START)
begin
A=A+B; STATE<=`Q1;
end
else STATE<=`Q0;
end
`Q1 : begin
if (A<8'h04)
begin
A=A+B; STATE<=`Q1;
end
else
begin
A=A+B; STATE<=`Q2;
end
end
`Q2 : begin
A=8'h00; STATE<=`Q0;
end
endcase
end
end
endmodule
|
|
以下の例では上述した3回の加算に加えて状態"Q0"で
"A=A+B"の他に"C=C+D"という加算も記述されています.右はSynplify Proによる合成結果です."Q0"での加算は同時に実行されるため2個の加算器が必要になっています.
|
module Plus4(CLK1,RESET,START,A,B,C,D);
input CLK1, RESET, START;
output [7:0] A,B,C,D;
reg [7:0] A, B, C, D;
reg [1:0] STATE;
`define Q0 2'b00
`define Q1 2'b01
`define Q2 2'b10
always @(posedge CLK1 or posedge RESET)
begin : state_machine
if (RESET)
begin
A=8'h00; B=8'h01; C=8'h00; D=8'h01; STATE <= `Q0;
end
else
begin
case (STATE)
`Q0 : begin
if (START)
begin
A=A+B; C=C+D; STATE<=`Q1;
end
else STATE<=`Q0;
end
`Q1 : begin
if (A<8'h04)
begin
A=A+B; STATE<=`Q1;
end
else
begin
A=A+B; STATE<=`Q2;
end
end
`Q2 : begin
A=8'h00; STATE<=`Q0;
end
endcase
end
end
endmodule
|
|
以下の例では状態"Q0"での
"A=A+B","C=C+D"に加えて,状態"Q1"でも"A=A+B","C=C+D"という記述が行われています.右はSynplify Proによる合成結果です."C=C+D"という加算の記述は2回増えていますが,同時には実行されないため余分な回路は合成されません.
|
module Plus6(CLK1,RESET,START,A,B,C,D);
input CLK1, RESET, START;
output [7:0] A,B,C,D;
reg [7:0] A, B, C, D;
reg [1:0] STATE;
`define Q0 2'b00
`define Q1 2'b01
`define Q2 2'b10
always @(posedge CLK1 or posedge RESET)
begin : state_machine
if (RESET)
begin
A=8'h00; B=8'h01; C=8'h00; D=8'h01; STATE <= `Q0;
end
else
begin
case (STATE)
`Q0 : begin
if (START)
begin
A=A+B; C=C+D; STATE<=`Q1;
end
else STATE<=`Q0;
end
`Q1 : begin
if (A<8'h04)
begin
A=A+B; C=C+D; STATE<=`Q1;
end
else
begin
A=A+B; C=C+D; STATE<=`Q2;
end
end
`Q2 : begin
A=8'h00; STATE<=`Q0;
end
endcase
end
end
endmodule
|
|
データパスアロケーションの高位合成戦略では,スケジューリングの結果を受けて,同時には実行されない処理に注目して必要最小限のデータパスがアロケートされます.上の例では加算だけに注目していますが,ビット毎のANDやOR,EXORなども併せて扱うなら,マルチファンクションの算術論理演算回路(ALU)がアロケートされます.アロケート(allocate)という英語には「割り当てる」という意味があります.
「同時には実行されないデータ転送であること」に注目すると,バスつまり共通のデータ転送路がアロケートされます.それぞれALUアロケーション,バスアロケーションと言われます.マルチファンクションの算術論理演算回路をアロケートしていることを強調する場合はマルチファンクションALUアロケーションと言われます.バスは実際にはマルチプレクサ/デマルチプレクサで実現されたりします.
|
データパスが合成されれば,いつ,どこに,どんな制御信号を送れば良いか定めることが出来ます.高位合成の最後のコントロールアロケーションでは,当該制御信号を発生する制御部が合成されます.
筆者がNECで開発していた高レベル自動設計システムは,コントロールアロケーションで水平型のマイクロプログラムを発生する順序回路も自動生成出来たことはNEC主任時代の高橋隆一:オートマトン記述からの高位合成で紹介しています.
高位合成が済むと,RTLでの構造(structure)が定まります.世の中で言うVerilog HDLによる「RTL記述」はRTLでの構造記述になっており,高位合成の結果を表現するひとつの手段になります.
半導体理工学研究センター(STARC)が推奨してきたRTLでのVerilog HDLによる記述スタイルも,この「RTL記述」でした.「RTL記述」はVerilog HDLによるRTLでの構造記述であり,各モジュールはどんな場合にどんなデータがセットされるかを箇条書きしたレジスタで終端するよう指導されていました.
STARCが推奨してきた記述スタイル,「RTL記述」はNECが1980年代既に実用化していたFDLという独自のハードウエア記述言語のVerilog HDL版と見ることがことができたりします.FDLはレジスタ毎にどんな場合にどんなデータがセットされるかをIF THEN ELSEで箇条書きするHDLでした.筆者がNECで開発していた高レベル自動設計システムは独自のオートマトン記述からFDLによるRTLでの構造記述を自動生成していました.
RTLでの構造記述を与えられて,その機能を実現する論理素子の接続関係を定めるのが論理合成(logic synthesis)です.具体的な論理素子の割り当てを行うことはテクノロジーマッピングと言われます.
|
Synplify Proはデータパスアロケーション,コントロールアロケーションに続いてテクノロジーマッピングまでを行い,FPGAのLUTへの割り当て結果をネットリストで出力します.上述した合成結果はテクノロジーマッピングまでを済ませた結果でした.以下に,加算を6回記述している最後のSSMD記述に対するSynplify Proの合成結果を例示します.
|
筆者が担当して成功を収めたマイクロコンピュータ設計教育環境City-1では実施初年度の1996年度から静的オートマトン記述(SSMD)を使い,実施3年目の1998年度からSynplifyを使いました.合成結果のネットリストはEDIF(イーディフ)で出力させ,Xilinx社の自動配置配線ツールに渡していました.
City-1が成功した背景にはVerilog HDLによるRTLでのユニークな動作記述,静的オートマトン記述(SSMD)を工夫したことに加えて,Synplifyの高位合成能力があったのです.静的オートマトン記述(SSMD)を考案した背景などについては以下の文献[4]でも紹介しています:
広島市立大学の情報科学部では2007年4月に組織改編があり,2008年(平成20年)度の3年生が,コンピュータというたったひとつの装置のためだけに存在していた情報工学科,英語名"department of computer engineering"最後の3年生になりました.
City-1を履修出来なくなった2010年度以降の4年生には,毎年,筆者を選んだ数名にですが,卒業研究で一人一台マイクロコンピュータを
設計してもらうことにしました.製作はしない代わりにSystemVerilogアサーションを使ってアサーションベース検証(ABV)の研究をしてもらっています.どうすればバグを見出し易いアサーションを書けるかという卒業研究です.
世界最高水準のマイクロコンピュータ設計教育環境City-1のその後に興味のある方はSystemVerilogアサーション(SVA)の書き方をご訪問下さい.
|
文献
- Ryuich TAKAHASHI and Yoshiyasu TAKEFUJI:
"Instructional Scaffolding for ASIP Design Education
with System Verilog Assertion
considering Situated Nature of Learning,"…IJCSNS
International Journal of Computer Science and
Network Security, Vol.16 No.10, pp.116-121 (2016)
- 高橋隆一:Verilog HDLによるシステム開発と設計,
共立出版(2008)
ISBN978-4-320-12222-2
- 高橋 隆一,吉村 猛:”ハイレベルシンセシスの動向”…IEICE
電子情報通信学会論文誌A,Vol.J74-A,No.2,pp.143-151 (1991)
- 高橋隆一:電子機器設計に活かすディジタル代数学,
科学情報出版 (2013)
ISBN978-4-904774-11-3
|