这似乎是一个相当愚蠢的问题,但从软件到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循环工作(并可合成)?
谢谢,
费萨尔.
你不想在那里使用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时停止计数并断言"完成"信号.