凿子同步

标签 chisel

这是对我的状态机中的状态之一的描述。我想做的是在 for 循环之后进入下一个状态。

is(s_multiplier){
      when(ready){state := s_ready}
      // Initialization of C memory to 0
      for(i <- 0 to matrixSize - 1){
        for(j <- 0 to matrixSize - 1){
          memC.write(i + j, 0.asSInt((2 * cellSize).W))
        }
      }
      // Objective 1 : Multiplication for the 128X128
      // Objective 2 : Multiplication for the n.m and m.p size parameters given
      for(i <- 0 to matrixSize - 1){
        for(j <- 0 to matrixSize - 1){
          sum := 0.asSInt(cellSize.W)
          for(k <- 0 to matrixSize - 1){
            sum = sum + memA.read(i * matrixSize + k, true.B) * memB.read(k * matrixSize + j, true.B) 
          }
          memC.write(i * matrixSize + j, sum)
        }
      }
      ready := true.B
    }

我刚刚创建了一个 bool 变量ready,在循环后将其设置为true。但由于一切都应该并行执行,我不认为我的代码是正确的:/

最佳答案

编写软件算法和使用凿子构建执行等效计算所需的硬件之间存在根本区别。

在讨论矩阵乘法之前,请考虑(作为一个更简单的示例)您的内存初始化操作循环。您完成此操作的方式是有意义的,但对于硬件来说,每次执行循环的内部主体时,初始化该内存单元所需的硬件都会添加到硬件图中。这意味着您已经创建了必要的连线来同时初始化 16384 个内存位置。那很多电线。不仅如此,它还需要具有 16384 个写入端口的内存(您可能找不到)。您的硬件将在一个时钟周期内初始化所有这些内存,这很好,但需要投入大量的门来完成此操作。

通常会在多个时钟周期内初始化内存,从而减少所需的硬件数量。

类似地,在矩阵乘法部分中,您将生成在 1 个时钟周期内计算矩阵乘法所需的所有硬件。这对于性能来说非常好,但是这种方法所需的乘法数量是 2,097,152 个硬件乘法器加上更多数量的加法器。内循环中的每个*+操作都会生成硬件。两个 32 位数字相乘所需的门数大约为 1024 个门。

解决这个问题的方法是找到一种将问题分解为多个阶段的方法。也许这将是一个可以将一行乘以一列并求和的模块。然后,您需要使用寄存器来处理矩阵,跟踪行和列,以便计算结果矩阵中每个点的值。为了减少硬件元件的数量,您可以在多个时钟周期上执行计算,并将计算进度的状态信息(行和列的索引)保存在寄存器或内存中。

有很多方法可以尝试和优化此功能,Chisel 是一种用于实验和测试策略的出色语言。

  • 也许您希望内存非常宽,以容纳一次获取多个单元格值。
  • 也许您会通过使用多个单元格计算器进一步展开循环,以便一次计算多个单元格值。
  • 巧妙的迭代策略可以优化读取和写入的内存访问。

重点是,编写硬件并不一定比编写软件更难(Chisel 可以帮助实现这一点),但方法却有很大不同。

我建议您花更多时间参加 Chisel 训练营。 2.3_control_flow 页面中有关排序的部分与上面的讨论非常相似。您可以编写一个单周期排序器,但执行此操作所需的硬件规模会快速增长,实际上,有必要将问题分解为多个周期并将计算分散到多个周期中。

祝你好运。

关于凿子同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59023104/

相关文章:

chisel - chisel3的printf在模拟发出的verilog时是否生成终端输出?

scala - Chisel:从测试仪访问模块参数

scala - 如何在 Chisel 中将 Seq 与 Cat 一起使用?

Chisel 中的矩阵运算

chisel - 如何避免 Chisel 测试仪中的多重设计细节

hardware - For 循环未在凿子中展开

scala - 什么是 Chisel 中的克隆

chisel - 在 Chisel 中将 Bundle Register 初始化为全 1 的最佳方法是什么?

Chisel编译成功但无法正确生成verilog

scala - Chisel switch 语句似乎无法按照官方教程中概述的方式工作