loops - Verilog 向量内积

标签 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^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

如您所见,我正在尝试通过循环将 a 复制到 a_cp,这是正确的方法吗?

如果是,我应该如何定义它i以及常量可以用作for循环中的步进器吗?

最佳答案

verilog 中的部分选择必须具有恒定的边界。所以这是不允许的:

a_cp[i] = a[i*15:i*15+15];

Verilog-2001 引入了一种新的索引部分选择语法,您可以在其中指定所选位组的起始位置和宽度。因此,您需要将上面的行替换为:

a_cp[i] = a[i*15+:16];

这需要一个 16 位宽度的 a 切片,从位 i*15 开始向右计数。您可以使用 -: 代替 +:,在这种情况下,您将向左数。

请注意:很容易键入 :+ 而不是 +:,并且 :+ 是有效语法,因此可能不是由您的编译器发现(但仍然可能是一个错误)。事实上,我在输入 EDA Playground example 时正是这么做的。 ,尽管在这种情况下我的拼写错误被编译器捕获了。

关于loops - Verilog 向量内积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42573947/

相关文章:

javascript - Jquery指定动态表头特定行上的结果循环

c++ - C++ "declaration and initialization"语句是表达式吗?

swift - 'self' 被 &&, || 的闭包错误捕获运算符(operator)

verilog - `timescale 是预处理器指令吗?

loops - Netlogo:如何迭代代理集并设置可变速度

c# - 如何存储 Switch 语句中的 Cases 列表?

java - 从另一个线程调用时变量为空

c - 如何编译和运行一个调用C函数的verilog程序?

verilog - icarus 的 SystemVerilog 支持(iverilog 编译器)

r - 循环遍历各个数据框并添加新列