我想根据3位数字输入引脚值更改Verilog中的参数值。 以下是我的verilog代码中的示例。
ncvlog: *E,PANOTL: A parameter is not a legal lvalue [3.10(IEEE)].
3'b001 : C_IP = 0.6;
编译时我收到此错误:
{{1}}
我理解Verilog参数是针对常数的,因此在模拟过程中无法更改。然而,这个问题的最佳解决方法是什么?
答案 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
无法合成