Verilog For Loop for Array Multiplication

Fai*_*ool 1 verilog

这似乎是一个相当愚蠢的问题,但从软件到HDL的过渡有时候最初会令人沮丧!

我的问题:我有一个数组乘法我试图在Verilog中完成.这是两个阵列(逐点)的乘法,每个阵列长度为200.以下代码在testbench中运行良好:

for (k=0; k<200; k=k+1)
    result <= result + A[k] * B[k]; 
Run Code Online (Sandbox Code Playgroud)

但它甚至没有接近Verilog模块的工作.我认为原因是因为操作应该在很多个时钟周期内进行.因为它涉及写出200次乘法和199次加法,如果我手工做(!),我想知道是否有一个技巧使for循环工作(并可合成)?

谢谢,

费萨尔.

Tim*_*Tim 5

你不想在那里使用for循环,你想使用一块时钟逻辑.For循环仅用于描述不对自身进行反馈的并行结构,它们很少有用,也不适用于在软件程序中使用它们的相同类型的东西.

要做你想要实现的目标,你应该有一个这样的块:

always @(posedge clk or posedge reset)
    if (reset) begin
        result <= 0;
        k <= 0;
        result_done <= 0;
    end else begin
        result      <= result_done ? result : (result + A[k] * B[k]);
        k           <= result_done ?      k : k + 1;
        result_done <= result_done ?      1 : (k == 200); 
    end
end
Run Code Online (Sandbox Code Playgroud)

这会将复位结果归零,将A [k]*B [k]加到200个时钟之和,然后在k == 200时停止计数并断言"完成"信号.