根据Verilog中的输入值选择一组参数

时间:2018-03-05 16:47:52

标签: verilog

我正在研究一个模块,它根据输入改变它的常数值来计算它的输出。

让我说明一下我在寻找什么,

设x为输入,y为输出,a,b,c,d,e为常数集。 模块执行类似以下操作的操作:

y=(a*x)+(b*x)+(c*x)+(d*x)+(e*x); //separate adder and multiplier modules are used and this code itself is huge so just providing the idea.

现在我使用以下方法根据输入为常量选择正确的值:(伪代码)

module top (x,clk,y);
input clk;
input [31:0] x;

output [31:0] y;

if (x>=32'h08000000 && x<32'h0A000000) begin

localparam a = 32'h058B90C0; 
localparam b = 32'h193C9F60; 
localparam c = 32'h29AC1740; 
localparam d = 32'hA48B9440; 
localparam e = 32'h0B6392E0; 

end else if  (x>=32'h0A000000 && x<32'h0C000000) begin

localparam a = 32'h028A50C1; 
localparam b = 32'hE98B489C; 
localparam c = 32'h17402948; 
localparam d = 32'h9440E45B; 
localparam e = 32'h392E00AF; 

end

y=(a*x)+(b*x)+(c*x)+(d*x)+(e*x); // Module that computes using any of the above mentioned constant sets

endmodule

我收到以下错误:

(1)“无法绑定参数”。 (2)“无法评估genvar条件表达式:((x)G(32'000010000 .... 00))&amp;&amp; so ......”

我的问题是:

我的用户将通过x给出输入,将选择右常数,我的模块将计算并提供输出。只需为模块提供正确的常量就足够了。我该怎么办?通过伪代码的想法对我有帮助。

1 个答案:

答案 0 :(得分:-1)

我不得不查看允许使用localparam的地方。您可以在开始后定义一个localparam:&lt;标签&gt;。
我试了一下,发现(至少在Vivado)它通过了并且有效。

always @( a )
  if (a>=1)
  begin : a_be_1
     localparam P1 = 3;
     c = P1;
  end
  else
  begin : a_sm_1
     localparam P1 = 5;
     c = P1;
  end