なぜXSTは私のレジスタを離れて最適化され、どのように私はそれを止めるのですか?
質問
私は、32ビットカウンタをインクリメント$のsformatを使用してASCII文字列に数値を変換し、FTDI FT245RLを使用して、一度にホストマシン1バイトに文字列をプッシュする簡単なのverilogプログラムを持っています。
残念ながら、ザイリンクスXSTは列レジスタベクトルを離れて最適化を保持します。ノー成功を収めて様々な初期化とアクセスルーチンと周りいじくる試みました。私は最適化をオフに見えることはできません、と私はオンラインで見つけるのすべての例は、私の初期化ルーチンから非常に若干異なります。私が間違って何をしているのですか?
module counter(CK12, TXE_, WR, RD_, LED, USBD);
input CK12;
input TXE_;
output WR;
output RD_;
output [7:0] LED;
inout [7:0] USBD;
reg [31:0] count = 0;
reg [7:0] k;
reg wrf = 0;
reg rd = 1;
reg [7:0] lbyte = 8'b00000000;
reg td = 1;
parameter MEM_SIZE = 88;
parameter STR_SIZE = 11;
reg [MEM_SIZE - 1:0] str;
reg [7:0] strpos = 8'b00000000;
initial
begin
for (k = 0; k < MEM_SIZE; k = k + 1)
begin
str[k] = 0;
end
end
always @(posedge CK12)
begin
if (TXE_ == 0 && wrf == 1)
begin
count = count + 1;
wrf = 0;
end
else if (wrf == 0) // If we've already lowered the strobe, latch the data
begin
if(td)
begin
$sformat(str, "%0000000000d\n", count);
strpos = 0;
td = 0;
end
str = str << 8;
wrf = 1;
strpos = strpos + 1;
if(strpos == STR_SIZE)
td = 1;
end
end
assign RD_ = rd;
assign WR = wrf;
assign USBD = str[87:80];
assign LED = count[31:24];
endmodule
アプリケーションのローディング装置 ファイル「3s100e.nph」からRf_Deviceで 環境/opt/Xilinx/10.1/ISE。 警告:XSTで:1293 - FF /ラッチstr_0 ブロック0の一定値を有します 。このFF /ラッチは次のようになります 最適化中にトリミング プロセスます。
WARNING:XSTで:1896 - 原因他方へ FF /ラッチ、トリミング、FF /ラッチstr_1が ブロック0の一定値を有します 。このFF /ラッチは次のようになります 最適化中にトリミング 処理する。
WARNING:XSTで:1896 - 原因他方へ FF /ラッチ、トリミング、FF /ラッチがstr_2 ブロック0の一定値を有します 。このFF /ラッチは次のようになります 最適化中にトリミング プロセスます。
解決
$のsformatタスクが合成可能になることはほとんどありません - コンパイラは、この機能を実装するために生成する必要がありますどのようなハードウェアを検討!これは、コンパイラはそれを離れて最適化することができると考えて、あなたの「STR」は、更新されることは決してありませんレジスタを意味します。 ASCIIコードにBCDコードを変換するBCDカウンタ、そしておそらくルックアップテーブルを考えてみます。
私の知る限り「初期」のブロックが合成可能ではありません。プを初期化するには、リセット信号を使用します。思い出は、あなたが持っているような「for」ループ必要がありますが、これだけリセット後にトリガします。