XilinxのISEは、HDLのパターンを見て、専用ハードウェアを推論する機能があります。例えば、レジスタ出力のRAMのパターンを見つけるとブロックRAMにしてくれたりします。
ISE自体は外部のプログラムを使って、FPGAの論理合成や配置配線を行うのですが、推論機構はXSTというプログラムで実装されているようです。それというのも「XSTユーザーガイド」(xst.pdf)というドキュメントに、パターンはこういうふうに書けという情報が載っているからです(2章)。
XSTユーザーガイドの10.1のp.247から「ブロックRAMリソースを使用したROMのHDLコーディング手法」がはじまっています。p.251を見ると、次のように書くとROMとしてブロックRAMを推論してくれるように書いてあります。
(この例の元はトラ技12月号のROMの記述を改造したものです。)
このモジュール単体だと、ブロックRAMを推論してくれるのですが、他のモジュールとまぜるとなぜかブロックRAMになってくれません。
xst.pdfを見ていると、強制的にブロックRAMを推論させる方法がありました(p.436)。1行目(moduleの前の行)に以下を書いてやります。
enはなくてもいいみたいでした。
xst.pdfですが、日本語版もあります。ISEを最新版にupdateすると、インストールしたディレクトリの中にいます。私の環境では次のディレクトリにいました。
c:¥Xilinx¥10.1¥ISE¥doc¥japanese¥books¥docs¥xst
(¥は全角になってます)
バージョンがかわったりすると、推論機能も変わったりするので注意が必要です。心配なときは、推論に頼らない記述にしたほうがいいみたいです。ただし、推論に頼らないときは、Xilinxべったりの記述になってしまうので、Alteraにもっていきたいときとかに困ってしまいます。へたをすると、同じXilinx同士でも移植できないことがあります(VirtexのDSP48とか)。悩ましいところですね。
参考、以前書いた「core generatorでROMを作る」
ISE自体は外部のプログラムを使って、FPGAの論理合成や配置配線を行うのですが、推論機構はXSTというプログラムで実装されているようです。それというのも「XSTユーザーガイド」(xst.pdf)というドキュメントに、パターンはこういうふうに書けという情報が載っているからです(2章)。
XSTユーザーガイドの10.1のp.247から「ブロックRAMリソースを使用したROMのHDLコーディング手法」がはじまっています。p.251を見ると、次のように書くとROMとしてブロックRAMを推論してくれるように書いてあります。
module rom( input clk, en, input [8:0] adr, output reg [11:0] out); always @(posedge clk) if(en) case (adr) 9'h00 : out <= 12'hA12; 9'h01 : out <= 12'hC08; 9'h02 : out <= 12'h006; 9'h03 : out <= 12'hCC7; 9'h04 : out <= 12'h002; 9'h05 : out <= 12'h066; 9'h06 : out <= 12'h069; 9'h07 : out <= 12'h800; 9'h08 : out <= 12'hC0D; 9'h09 : out <= 12'h028; 9'h0A : out <= 12'hC01; 9'h0B : out <= 12'h021; 9'h0C : out <= 12'h201; 9'h0D : out <= 12'h743; 9'h0E : out <= 12'hA0C; 9'h0F : out <= 12'h2E8; 9'h10 : out <= 12'hA0A; 9'h11 : out <= 12'h800; 9'h12 : out <= 12'h901; 9'h13 : out <= 12'h249; 9'h14 : out <= 12'h026; 9'h15 : out <= 12'h908; 9'h16 : out <= 12'h666; 9'h17 : out <= 12'hA1A; 9'h18 : out <= 12'h289; 9'h19 : out <= 12'hA1B; 9'h1A : out <= 12'h0C9; 9'h1B : out <= 12'hE07; 9'h1C : out <= 12'h029; 9'h1D : out <= 12'hA13; default : out <= 12'hfff; endcase endmodule
(この例の元はトラ技12月号のROMの記述を改造したものです。)
このモジュール単体だと、ブロックRAMを推論してくれるのですが、他のモジュールとまぜるとなぜかブロックRAMになってくれません。
xst.pdfを見ていると、強制的にブロックRAMを推論させる方法がありました(p.436)。1行目(moduleの前の行)に以下を書いてやります。
(* rom_style = "block" *)
enはなくてもいいみたいでした。
xst.pdfですが、日本語版もあります。ISEを最新版にupdateすると、インストールしたディレクトリの中にいます。私の環境では次のディレクトリにいました。
c:¥Xilinx¥10.1¥ISE¥doc¥japanese¥books¥docs¥xst
(¥は全角になってます)
バージョンがかわったりすると、推論機能も変わったりするので注意が必要です。心配なときは、推論に頼らない記述にしたほうがいいみたいです。ただし、推論に頼らないときは、Xilinxべったりの記述になってしまうので、Alteraにもっていきたいときとかに困ってしまいます。へたをすると、同じXilinx同士でも移植できないことがあります(VirtexのDSP48とか)。悩ましいところですね。
参考、以前書いた「core generatorでROMを作る」
※コメント投稿者のブログIDはブログ作成者のみに通知されます