I was hacking the source code of Rocket SoC, and found that Rocket uses virtual address when having access to L1D cache(from the source code of nonblocking cache code).
But, from the following code:

As far as I know, the interface between L1D cache and Accelerator(co-processor) is same as the interface between core and L1D cache.
L1D cache accepts virtual address because it is virtually indexed and physically tagged. So, accelerator also has to use virtual address.
If L1D cache accepts physical address, the indexing of TLB will use physical address, which is non-sesnse.
The core uses virtual address in the 'store' and the 'load' instruction. But, why the virtual address needs to be translated into physical address before the accelerator accesses L1D cache?
I was hacking the source code of Rocket SoC, and found that Rocket uses virtual address when having access to L1D cache(from the source code of nonblocking cache code).
But, from the following code:

As far as I know, the interface between L1D cache and Accelerator(co-processor) is same as the interface between core and L1D cache.
L1D cache accepts virtual address because it is virtually indexed and physically tagged. So, accelerator also has to use virtual address.
If L1D cache accepts physical address, the indexing of TLB will use physical address, which is non-sesnse.
The core uses virtual address in the 'store' and the 'load' instruction. But, why the virtual address needs to be translated into physical address before the accelerator accesses L1D cache?