Verilog:信号中不支持变量索引

Verilog:信号中不支持变量索引,verilog,hardware,xilinx,hdl,Verilog,Hardware,Xilinx,Hdl,我收到一个错误,说“信号中不支持索引”。从我所看到的错误在非阻塞赋值的左侧。为什么下面的代码会给出一个错误,有没有解决方法 ... 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;

我收到一个错误,说“信号中不支持索引”。从我所看到的错误在非阻塞赋值的左侧。为什么下面的代码会给出一个错误,有没有解决方法

...
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);
...
。。。
参数宽度=32;
参数大小=3;
输入时钟,复位;
输入[width*size-1:0]A;
输入[width*size-1:0]B;
输出[width*size-1:0]结果;
reg符号[width*size-1:0]部分;
注册签名[width-1:0]温度;
reg有符号[width-1:0]电流A;
reg有符号[width-1:0]currentb;
线迹[width-1:0]temp1wire;
...
整数k=0;
始终@(posedge clk)
开始

电流A[width-1:0]
k
达到
尺寸-1
后需要夹紧或缠绕。 可以使用mod运算符(
%
)进行环绕;示例:
k=(k+1)%size
%
可能无法最佳合成(请检查合成器),因此if语句是一种功能替代方案
if(k==SIZE-1)k=0;否则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
/$clog是IEEE1364-2005§17.11,一些合成器支持它,其他的不支持
reg[$clog2(大小):0]k=0,下一个k;
总是开始
如果(k==SIZE-1)开始
下一个k=0;//环绕
//下一步_k=k;//夹紧
结束
否则开始
下一步k=k+1;
结束
结束
始终@(posedge clk)
开始
currenta[WIDTH-1:0]我在Xilinx论坛上发现:

“XST可以与索引部分选择运算符“+:”配合使用,如果它位于赋值的右侧(RHS)。当它位于左侧(LHS)且起始索引为常量时,XST也可以配合使用。您的案例使用变量作为LHS上的起始索引,XST不喜欢它,尽管它是合法的。”


posedge在什么情况下发生?提供详细信息。
width
在何处/如何定义?
posedge
是一个关键字。你的意思是
posedge clock
?我已经编辑了这个问题,宽度是wordlength,在这个例子中是32位,是的,它是一个“posedge clk”,我一定错过了它@g一旦
k
的值为3或更高,切片将超出范围。