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

电器工程 FPGA 视频文件 矩阵
2022-01-09 09:53:16

我有以下 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 循环,本质上是为矩阵的每一行计算一个点积。如果不是,那么并行化矩阵向量乘法的最简单(即好的语法)方法是什么?

2个回答

在“硬件”(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是一个变量,它就会丢失。

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

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