如何在verilog中使用$ value $ plusargs?

时间:2017-04-03 11:13:34

标签: verilog

我想使用" $ value $ 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?

1 个答案:

答案 0 :(得分:2)

您无法将运行时变量分配给参数。只能在编译期间(默认值)和精化(覆盖值)分配参数。 $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