我收到错误消息'信号'不支持索引。从我可以看到的错误是在非阻塞分配的左侧。为什么下面的代码会出错并且有办法解决它?
...
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]
。
答案 0 :(得分: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
答案 1 :(得分:1)
我在Xilinx论坛上找到了this:
&#34; XST适用于索引的部分选择运算符&#34; +:&#34;如果它在作业的右侧(RHS)。当它在左侧(LHS)并且起始索引是常数时它也可以正常工作。你的案例使用一个变量作为LHS的起始索引,而XST并不喜欢它,尽管它是合法的。&#34;