我正在研究一个模块,它根据输入改变它的常数值来计算它的输出。
让我说明一下我在寻找什么,
设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给出输入,将选择右常数,我的模块将计算并提供输出。只需为模块提供正确的常量就足够了。我该怎么办?通过伪代码的想法对我有帮助。
答案 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