IP コアのレジスタを更新するための非常に単純な回路があります。
input clk;
input rst;
input start;
input [31:0] ruleCount;
reg lastStart;
output reg [31:0] ruleCountReg;
always@(posedge clk)
if (rst)
lastStart <= 0;
else
lastStart <= start;
always@(posedge clk)
if (rst) begin
ruleCountReg <= 0;
end
else if (start && !lastStart) begin
ruleCountReg <= ruleCount;
end
ここでの目標はruleCount
、最初のサイクルstart
がアサートされたときに登録することです (他のいくつかの伝統もこれに依存しています)。だから、私は に登録start
しlastStart
、条件を待ってから、適切に行動します。
Vivado 2015.4 とvSim XSim、および Kintex Ultrascale 060 を使用しています。エラボレート/合成の後、次の回路図が得られます。
私の機能/RTL シミュレーションは、私が期待したものと一致しています。しかし、ボード上でデザインが機能していなかったので、合成後のシミュレーションを試すことにしました。次のような
結果が得られました。 示されているように
start
、テストベンチによって発生し、Vivado によって挿入された IBUF からの出力は同じ値を生成します。 . ただし、理由は不明ですが、が High の場合 (t=35ns、t=45ns) lastStart
、2 つのクロック エッジのいずれかで値をキャプチャできません。start
また、start&&!lastStart
高いにも関わらずruleCountReg
更新されません。
比較のために、機能 RTL シミュレーションを次に示します
。Is this a bug in Vivado? Verilog は簡単で、回路の正しい回路図を生成しているように見えますが、正しくないネットリストを作成している可能性はありますか? 合成では、これらの信号に関連する警告は生成されません。
編集:シミュレーションの最初の 100ns の間、xSim がレジスタを更新していないように見えます。