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を作る」