VHDL中的矩阵向​​量乘法函数是否已并行化?


9

我有以下VHDL函数,该函数将给定的mxn矩阵a乘以nx1向量b

function matrix_multiply_by_vector(a: integer_matrix; b: integer_vector; m: integer; n: integer)
return integer_vector is variable c : integer_vector(m-1 downto 0) := (others => 0);
begin
    for i in 0 to m-1 loop
        for j in 0 to n-1 loop
            c(i) := c(i) + (a(i,j) * b(j));
        end loop;
    end loop;
    return c;
end matrix_multiply_by_vector;

它运作良好,但实际上在硬件中实现了什么?具体来说,我想知道的是,它是否足够聪明,以至于它可以并行化内部for循环,本质上是为矩阵的每一行计算一个点积。如果没有,那么并行化矩阵向量乘法的最简单方法(即不错的语法)是什么?


1
如果不是,则必须具有某种内存,并串行加载所有值并“执行”它们的管道样式
Voltage Spike

Answers:


9

在“硬件”(VHDL或Verilog)中,所有循环都展开并并行执行。

因此,不仅您的内循环,而且您的外循环都展开了。

这也是为什么在编译时必须知道循环大小的原因。当循环长度未知时,综合工具将抱怨。


对于来自SW语言的初学者来说,这是一个众所周知的陷阱。他们尝试转换:

int a,b,c;
   c = 0;
   while (a--)
     c +=  b;

到VHDL / Verilog硬件。问题在于,它们在仿真中都可以正常工作。但是综合工具需要生成加法器: c = b+b+b+b...b;

为此,该工具需要知道要制造多少个加法器。如果a是恒定的罚款!(即使它是4.000.000。它将用尽所有资源,但是会尝试!)

但是如果a是变量,它将丢失。


在这种情况下,它只是乘法,所以a可能只是被乘数,因此是可变的……
哈里·斯文森

1

该代码将并行化两个循环,因为您尚未定义事件来控制处理的任何子集。循环仅生成所需的硬件来生成函数。您需要一个过程

进程具有一个敏感度列表,该列表告诉VHDL(或合成器)除非该列表中的节点之一发生更改,否则不会调用该过程。这可用于合成锁存器,并扩展到纯组合实现的范围之外。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.