Chisel - 内存初始化
Chisel - memory initialization
在 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))
}
}
使用 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}
在 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))
}
}
使用 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}