Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 向量内积_Loops_Initialization_Verilog_Constants - Fatal编程技术网

Loops 向量内积

Loops 向量内积,loops,initialization,verilog,constants,Loops,Initialization,Verilog,Constants,我正在尝试实现一个可合成的verilog模块,它生成2个向量/数组的向量积,每个数组包含8个16位无符号整数。设计编译器报告错误,即符号i必须是常量或参数。我不知道怎么修理它。这是我的密码 module VecMul16bit (a, b, c, clk, rst); // Two vector inner product, each has 8 elements // Each element is 16 bits // So the Output should be at least 2^3

我正在尝试实现一个可合成的verilog模块,它生成2个向量/数组的向量积,每个数组包含8个16位无符号整数。设计编译器报告错误,即
符号i必须是常量或参数
。我不知道怎么修理它。这是我的密码

module VecMul16bit (a, b, c, clk, rst);
// Two vector inner product, each has 8 elements
// Each element is 16 bits
// So the Output should be at least 2^32*2^3 = 2^35 in order to
// prevent overflow 
// Output is 35 bits
input clk;
input rst;
input [127:0] a,b;
output [35:0] c;
reg [15:0] a_cp [0:7];
reg [15:0] b_cp [0:7];
reg [35:0] c_reg;   
reg k,c_done;

integer i;
always @ (a)
begin
    for (i=0; i<=7; i=i+1) begin
        a_cp[i] = a[i*15:i*15+15];
    end
end

always @ (b)
begin 
    for (i=0; i<=7; i=i+1) begin
        b_cp[i] = b[i*15:i*15+15];
    end

end 

assign c = c_reg;

always @(posedge clk or posedge rst)
begin
    if (rst) begin
        c_reg <= 0;
        k <= 0;
        c_done <= 0;
    end else begin
        c_reg   <= c_done ? c_reg  : (c_reg + a_cp[k]*b_cp[k]);
        k           <= c_done ?         k : k + 1;
        c_done      <= c_done ?         1 : (k == 7);
    end
end

endmodule
模块向量16位(a、b、c、clk、rst);
//两个向量内积,每个有8个元素
//每个元素是16位
//因此,输出应至少为2^32*2^3=2^35,以便
//防止溢出
//输出为35位
输入时钟;
输入rst;
输入[127:0]a,b;
输出[35:0]c;
reg[15:0]a_cp[0:7];
reg[15:0]b_cp[0:7];
reg[35:0]c_reg;
注册k,c_完成;
整数i;
始终@(a)
开始
对于(i=0;i而言,verilog中的零件选择必须具有常量边界。因此,这是不允许的:

a_cp[i] = a[i*15:i*15+15];
Verilog-2001引入了一种新的索引部分选择语法,您可以在其中指定所选位组的起始位置和宽度。因此,您需要将上述行替换为:

a_cp[i] = a[i*15+:16];
这需要一个16位宽度的
a
切片,从位
i*15开始向右计数。您可以使用
-:
而不是
+:
,在这种情况下,您可以向左计数


小心:键入
:+
而不是
+:
非常容易,
:+
是有效的语法,因此编译器可能不会发现它(但仍然可能是一个bug).事实上,我在键入时确实做到了这一点,尽管在本例中,编译器发现了我的输入错误。

索引可能应该按
I*16
移动,否则切片之间会有重叠。我建议在
+:
前后添加空格,使其突出:
a[I*15+:16];