繁体   English   中英

Verilog:信号不支持变量索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM