2017-04-03 47 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',它是一個變量並導致此錯誤。 但是,您可以通過http://www.project-veripage.com/plusarg.php查看'$ value $ plusarg'的使用情況 – Krouitch

+0

您的模擬器應該支持'$ value $ plusargs';它在IEEE1364-2001中增加了,所以2005年以後的所有模擬器都應該支持它。檢查上面的行。 '真正的READ_FREQ'缺少一個';' – Greg

回答

1

您不能將運行時變量分配給參數。參數只能在編譯(默認值)和精化(覆蓋值)期間分配。 $value$plusargs在運行時執行,它也不能分配參數。

您尚未證明您需要使用rclk以外的其他期間值i_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