2017-04-03 18 views
1

私は、以下譲るとして「$の値$ plusargs」を使用する

module top(); 
... 
reg data; 
real READ_FREQ 

initial begin 
if (!$value$plusargs("READ_FREQ=%0F", READ_FREQ)) 
READ_FREQ = 197; 
end 

parameter wclk = 300; 
parameter rclk = READ_FREQ; 

always #(rclk/2.0) i_rclk = ~i_rclk; 

... 
endmodule 

が欲しいが、私は上記のコードのコンパイル時に、私は私がどのように

irun: *E,VLGERR: An error occurred during parsing. Review the log file for errors with the code *E and fix those identified problems to proceed. Exiting with code (status 1). 

irun(64): 12.10-p001: (c) Copyright 1995-2012 Cadence Design Systems, Inc. 
file: ./top.v 
parameter  rclk  = READ_FREQ; 
             | 
ncvlog: *E,NOTPAR (./top.v,197|41): Illegal operand for constant expression [4(IEEE)]. 

ようなエラーをすることができます持っていますVerilogで$ value $ plusargsを使用しますか?

+2

「$ value $ plusarg」はエラーの原因ではありません。パラメータは定数式、すなわち定数値または他のパラメータに対する演算しか取ることができない。 変数であり、このエラーの原因となる実際の 'READ_FREQ'を渡しました。 しかし、あなたは '$ value $ plusarg'の使用についてhttp://www.project-veripage.com/plusarg.phpを確認することができます – Krouitch

+0

あなたのシミュレータは' $ value $ plusargs'をサポートする必要があります。 IEEE1364-2001に追加されたので、2005年以降のすべてのシミュレータがサポートします。上記の行を確認してください。 '本当のREAD_FREQ'には'; 'がありません。 – Greg

答えて

1

実行時変数をパラメータに割り当てることはできません。パラメータは、コンパイル時(デフォルト値)とエラボレーション時(値のオーバーライド時)にのみ割り当てることができます。 $value$plusargsは実行時に実行されますが、パラメータを割り当てることもできません。

期間番号i_rclk以外のrclkをどこに使用する必要があるかを実演していません。意図した効果を得るためにコードを次のように修正することができます。

real READ_FREQ; 

initial begin 
    if (!$value$plusargs("READ_FREQ=%0F", READ_FREQ)) begin 
    READ_FREQ = 197; 
    end 
    forever #(READ_FREQ/2.0) i_rclk = ~i_rclk; 
end 
関連する問題