2017-06-14 15 views
0

:私は警告を無視(または変更した場合はYosysの初期ブロックにRAM値を割り当てる方法は?私は、読み取り専用の推論されたRAMに値を代入する最初のブロックを使用しようとしています

$ yosys -q -p "synth_ice40 -blif rom.blif" rom.v 
Warning: Blocking assignment to memory in line rom.v:9 is handled like a non-blocking assignment. 
Warning: Blocking assignment to memory in line rom.v:10 is handled like a non-blocking assignment. 

module rom (
    input clk, 
    input [5:0] addr, 
    output reg [15:0] data); 

    reg [15:0] mem [0:63]; 

    initial begin 
     mem[0] = 1; 
     mem[1] = 2; 
    end 

    always @(posedge clk) 
     data <= mem[addr]; 

endmodule 

Yosysは、この警告メッセージを表示しますノンブロッキングへの最初の割り当て)、私は実験的にRAMがパワーアップ後いくつかのクロックサイクルまで正しい値を取得しないことがわかります。

このように初期ブロックを使用することはできませんか? yosys githubリポジトリの第50号の議論では、それが必要であることを示唆するサンプルモジュールmem2reg_with_two_always_blocksが提供されています。しかし、そのモジュールをコンパイルすると、同じ警告メッセージが表示されます。

答えて

2

私は、RAMが電源投入後数クロックサイクルまで正しい値を取得しないことを実験的に見出しています。

残念ながら、あなたはそれをどうやって言うのでしょうか。私はあなたがiCE40合成を使用していて、SRAMプログラミングでハードウェアで実行していると仮定しています。これは既知のiCE40ハードウェアの問題と一致するためです。

さらに詳しい情報は、hereおよびhereも参照してください。

回避策:SRAMプログラミングを使用しないでください。また、BRAMの初期化を完了するまでにいくつかのサイクルをリセットしてください。

ラティスツールを使用しているときに問題を再現することもできます。これはハードウェアのバグです。合成フローでは何もできません。

初期化されたメモリ(iCE40合成またはザイリンクス7シリーズ合成など)をサポートするフローを使用する場合、HDLコードは正常で、初期化されたメモリリソースを持つネットリストが生成されるはずです。


コメントの編集:最初のブロックの警告ブロックとブロック解除されていない割り当てを無視することができます。あなたのケースでは、割り当てがブロッキングまたはノンブロッキングと解釈されても差はありません。しかし、次のようなコードの問題引き起こす:(!または前)

initial begin 
    mem[0] = 1; 
    mem[1] = mem[0]; 
end 

私は初期化がで起こるという意図を表現したいのタイムステップの始まり0

これは何のいずれかでありますブロッキングまたはノンブロッキングの割り当てが使用されているかどうかにかかわらず、初期ブロックは行います。

+0

はい、コンテキストは、SPIスレーブプログラミングを使用するICE40です(myStormボード上の唯一のオプションです)。設定後に起動を遅らせるためにカウンタを使用して回避策を講じます。しかし、私はまだブロックされていない初期ブロックの中で非ブロックとしてブロック割り当てを扱うことに関する警告メッセージを理解していません。私は初期化がタイムステップ0の開始時に(または前に)起こるという意図を表現したいと思っています。 –

+0

@ R.Millerは編集を参照してください。 – CliffordVienna

関連する問題