2017-10-21 55 views
0

私が持っていたいVerilogファイルは、別のファイルのinclude "maths.v"であるいくつかの計算を行うタスクです。mathsfunction;を書く私が正しく理解していれば、その時点でタスクを実行する必要があり、他のファイルにinitial begin - endブロックは、以下のコードは、次のとおりです。verilog 2001の構文ではグローバル宣言が不正です。タスク

Maths.v

task mathsfunction; 
reg [0:31] x; 
reg [0:31] y; 
reg [0:31] z; 
begin 
    x = $urandom; 
    y = $urandom; 
    z = x + y 
end 
#200  
endtask 

私が最初にある1つのコンパイルエラーを取得していますtask mathsfunction;これはGlobal declarations are illegal in Verilog 2001 syntax.です。私がこれまでに学んだことから、ちょうどタスク(モジュールではない、私はそれがモジュールであることを望んでいない)であるVerilogファイルはうまくいくはずですか?なぜこれが機能しないのか分かりません。

すべてのヘルプは

+0

さらに詳しい情報を提供する必要があります。グローバル空間でタスクを宣言できます。あなたのメッセージは他のものと関連しています。 – Serge

+0

私はLRMを私の前には持っていませんが、Verilogのすべてのバージョンは、グローバルスペース(モジュール外)のシグナル、タスク、関数、またはパラメータの宣言をサポートしていないと思います。私はSystemVerilogがそうしていることを知っていますが、そうすることは悪い習慣と考えられます。共有タスク、関数などを定義することが推奨されるのは、それらをSystemVerilogパッケージに入れることです。 – Greg

答えて

0

あなたの最初の問題は、あなたがVerilog2K(「Verilogの」)とのSystemVerilogを混乱しているということです素晴らしいことです。 Verilogでは、タスク宣言はモジュール内にのみ存在するか、生成されます(グローバルには生成されません)。エラーメッセージが表示されます。次に、タスクに2つのステートメント(begin/end seqブロックとタイミングコントロール)が含まれていますが、これはVerilogでは無効です。 SVはこれを緩和します。ブロックの外側に#200を置くことは意味がないので、ブロック内でそれを移動してVerilogと互換性があるかもしれません。

あなたの次の問題は、あなたのタスクは何も入力または出力がないということです - xyzは内部ですが。それらをinputoutput、またはinoutにする必要があります。

最後に、間違ってカット/ペーストしました。このコードは2つ以上のセミコロンなしではコンパイルされません。

関連する問題