在Verilog中更改参数值

时间:2016-07-12 18:29:58

标签: verilog

我想根据3位数字输入引脚值更改Verilog中的参数值。 以下是我的verilog代码中的示例。

ncvlog: *E,PANOTL: A parameter is not a legal lvalue [3.10(IEEE)].
      3'b001 : C_IP = 0.6;

编译时我收到此错误:

{{1}}

我理解Verilog参数是针对常数的,因此在模拟过程中无法更改。然而,这个问题的最佳解决方法是什么?

1 个答案:

答案 0 :(得分:3)

参数必须是常量,没有办法绕过它。参数可以是其他参数的函数。在模块实例中,可以通过#()在编译/详细时间将参数更改为另一个常量,或defpram(注意defpram计划用于折旧)。如果在编译/详细说明期间更改了派生的参数,则参数将更新为其新值。从另一个参数派生的参数示例:

// nested conditional statement
parameter real C_I P = PARAM_DACIP==3'b000 ? 0.8 :
                       PARAM_DACIP==3'b001 ? 0.6 :
                       PARAM_DACIP==3'b010 ? 0.4 :
                       PARAM_DACIP==3'b011 ? 0.2 :
                       PARAM_DACIP==3'b100 ? 0.0 :
                       PARAM_DACIP==3'b101 ? -0.2 :
                       PARAM_DACIP==3'b110 ? -0.4 : -0.6;

// simple expression
parameter real C_IP = 0.2*(3'b100-PARAM_DACIP);

// pure static function (i.e. output only determined from input)
// Note: not all simulators/synthesizers support this
function real calc_C_IP( input [2:0] DACIP);
begin
  case (DACIP)
    3'b000 : calc_C_IP = 0.8;
    3'b001 : calc_C_IP = 0.6;
    3'b010 : calc_C_IP = 0.4;
    3'b011 : calc_C_IP = 0.2;
    3'b100 : calc_C_IP = 0.0;
    3'b101 : calc_C_IP = -0.2;
    3'b110 : calc_C_IP = -0.4;
    3'b111 : calc_C_IP = -0.6;
  endcase
end 
endfunction
parameter real C_IP = calc_C_IP(PARAM_DACIP);

如果reg_DACIP必须是注册,则C_IP不能是参数。您可以将其设为常规real

仅供参考:real无法合成