[英]Verilog : Variable index is not supported in signal
我收到一条错误消息“信号中不支持索引”。 从我可以看到的错误是在非阻塞分配的左侧。 为什么下面的代码会出错,有没有办法解决它?
...
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]
。
在达到size-1
后, k
需要被夹紧或缠绕。 可以使用mod运算符( %
)来完成包装; 例如: k = (k+1)%size
。 %
可能无法最优地合成(检查你的合成器),所以if(k==SIZE-1) k = 0; else k=k+1;
则if语句是一个功能替代if(k==SIZE-1) k = 0; else k=k+1;
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
我在Xilinx论坛上发现了这个 :
“XST适用于索引的部分选择运算符”+:“如果它位于赋值的右侧(RHS)。当它在左侧(LHS)并且起始时它也可以正常工作index是一个常量。你的案例使用一个变量作为LHS的起始索引,而XST不喜欢它,尽管它是合法的。“
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.