Verilog For Loop for Array Multiplication

时间:2013-02-23 06:21:06

标签: verilog

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

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

for (k=0; k<200; k=k+1)
    result <= result + A[k] * B[k]; 

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

谢谢,

费萨尔。

1 个答案:

答案 0 :(得分: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

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