2016-03-08 833 views
3

我收到一个错误,提示'索引在信号中不受支持'。从我所看到的错误位于非阻塞赋值的左侧。为什么下面的代码给出了一个错误,有没有办法解决它?Verilog:信号不支持变量索引

... 
parameter width = 32; 
parameter size = 3; 

input clk, reset; 
input [width*size-1:0] A; 
input [width*size-1:0] B; 
output [width*size-1:0] result; 

reg signed [width*size-1:0] partials; 
reg signed [width-1:0] temp; 
reg signed [width-1:0] currenta; 
reg signed [width-1:0] currentb; 
wire signed [width-1:0] temp1wire; 
... 
integer k = 0; 
always @ (posedge clk) 
begin 
    currenta[width-1:0] <= A[width*k +: width]; 
    k = k+1 
    currentb[width-1:0] <= B[width*k +: width]; 
    partials[width*k +: width] <= temp1wire; 
end 
Add Add1(clk, temp1wire, currenta, currentb); 
... 

此代码是一个连续块,做矢量相加,并保存在partials[width*k +: width]结果的一部分。

+1

在什么情况下会出现posedge?提供这些细节。 – vim

+2

在哪里/如何定义宽度? – dwikle

+0

'posedge'是一个关键字。你的意思是'posedge clock'吗? – Greg

回答

1

我发现this在赛灵思论坛:

“XST正常工作与索引部分选择运算符‘+:’如果是在(LHS),并且起始指标是一个常量,你的情况使用一个变量作为LHS的起始指标,而且它的右边(RHS) XST不喜欢,尽管它是合法的。“

1

k在到达size-1后需要夹紧或缠绕。可以使用mod运算符(%)完成包装。例如:k = (k+1)%size%可能不是最佳合成(检查你的合成器),因此if语句是一个功能替代if(k==SIZE-1) k = 0; else k=k+1;


建议:
人们普遍重新开始保持参数为大写字母,这样你可以很容易地识别参数形成信号名称。在顺序块中放置阻塞分配是合法的,但大多数设计规则建议将组合逻辑与顺序分配分开。我宁愿写类似下面的代码:

// $clog is IEEE1364-2005 § 17.11, some synthesizers support it, others don't 
reg [$clog2(SIZE):0] k=0, next_k; 
always @* begin 
    if (k==SIZE-1) begin 
    next_k = 0; // wrap around 
    // next_k = k; // clamp 
    end 
    else begin 
    next_k = k+1; 
    end 
end 
always @ (posedge clk) 
begin 
    currenta[WIDTH-1:0] <= A[WIDTH*k +: WIDTH]; 
    currentb[WIDTH-1:0] <= A[WIDTH*next_k +: WIDTH]; 
    partials[WIDTH*next_k +: WIDTH] <= temp1wire; 
    k <= next_k; 
end