【问题标题】:Chisel - memory initializationChisel - 内存初始化
【发布时间】:2019-12-10 15:23:19
【问题描述】:

在 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))
        }
      }

【问题讨论】:

    标签: memory chisel


    【解决方案1】:

    使用 for 循环的缺点是上面的代码会尝试在一个时钟周期内执行嵌套的 for 循环,这是不切实际的,因为通常最好的情况是每个时钟周期执行一次写入或使用突发模式机制。我建议将 i 和 j 替换为在时钟滴答声中递增的计数器,并保持 s_multiplier 状态直到你填满你的矩阵。

    is(s_multiplier){
      when(ready){state := s_ready}
      // Initialization of C memory to 0
      when(counti <= matrixSize -1){ //Initialize counti and countj to 0
        when(countj <= matrixSize - 1){
          memC.write(counti + countj, 0.asSInt((2 * cellSize).W))
          countj := countj + 1.U
        }
        counti <= counti + 1.U
        state := s_multiplier
      }. otherwise{state := S_go_to_some_other_state}
    

    【讨论】:

    • 我明白了。我是否必须将 conti 和 countj 创建为 counter 类型?
    • 您可以将它们声明为每个时钟周期递增的寄存器。我不确定你所说的计数器类型是什么意思。
    • 我说的是:chisel-lang.org/api/latest/chisel3/util/Counter.html 但我会用寄存器来做,谢谢!
    • 你的 MatrixSize -1 是 Int 类型,而 Counti 和 Counj 是 unsigned int 类型,所以只需要 (matrixsize-1).U 代替。
    • 只要您保持在 s_multiplier 状态,您就可以有效地运行一个循环,因为时钟会不断滴答作响,并且在每个时钟周期中,直到您达到所需的矩阵大小,您就会回到相同的状态并重复这个过程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多