1

このエラーが発生する理由を教えてください。私はまだ Verilog に非常に慣れていないので、明らかな欠陥があればご容赦ください。ありがとう!

module func(clk,d,out);
input [3:0] d;
input clk;

reg [3:0] q[1:0];
output  [3:0] out;
always @(posedge clk)
begin
q[0][3:0]=d[3:0];
q[1][3:0]=d[3:0];

end
assign out=q[0]^q[1];

endmodule

:ERROR:Xst:917 - 宣言されていないシグナル <>。FATAL_ERROR:Xst:Portability/export/Port_Main.h:127:1.13 - このアプリケーションは、回復できない例外的な状態を検出しました。プロセスは終了します。

御時間ありがとうございます!

4

2 に答える 2

1

reg [3:0] q[1:0];との順番を入れ替えてみてくださいoutput [3:0] out;

あなたのコードは私のシミュレーターでコンパイルされるので、これはあなたのシミュレーターのバグだと思います。ただし、一般的な推奨事項は、常にすべての内部値の前にinput/ output/を宣言することです。inout

ポート構文を IEEE Std 1364-2001 スタイルに変更することをお勧めします。元:

module func(
    input        clk,
    input  [3:0] d,
    output [3:0] out );

他の人が示唆しているように、ブロック内でブロッキング割り当て ( =) を非ブロッキング割り当て ( ) に切り替える必要があります。この修正はコンパイルの問題ではありませんが、コーディング スタイルが改善され、RTL の頭痛の種と一致しない単純な合成から解放されます。<=always

于 2013-05-28T16:33:03.240 に答える
0

答えよりも多くの質問:

どのツールを使用していますか? ツールはレジスタ配列の合成をサポートしていますか?

シーケンシャル ロジックにはノンブロッキング割り当てを使用する必要があります。

always @(posedge clk) begin
    q[0][3:0] <= d[3:0];
    q[1][3:0] <= d[3:0];
end

メモリは慣習的に、コロンの左側に 0 を、右側に最後の位置を付けて宣言されます。

reg [3:0] q [0:1];
于 2013-05-26T11:52:14.657 に答える