Forwarding a possible solution:

---------- Forwarded message ---------

Hi Hossein,

I don't know if there is an update to this on you end, but here is how I
got around this issue when I tried running some SPEC benchmarks compiled
for RISC-V on DerivO3CPU.

I guess the problem is related to how Packet objects are created and sent
to the cache from the LSQ. I've debugged a bit and found that the
problematic AtomicOpFunctor pointer is valid up to the point where the LSQ
calls "req->buildPackets();" (@lsq_unit_impl.hh:771). Packets built by this
call won't have the AtomicOpFunctor in their Request objects and this is
the cause of the problem. I couldn't find an elegant way to handle this but
basically what I did was to modify Request class so that I was able to set
the AtomicOpFunctor in LSQ before the packet is sent to the cache. Here are
the modifications I've made.

+++ b/src/cpu/o3/lsq_unit_impl.hh
> @@ -771,10 +771,14 @@ LSQUnit<Impl>::writebackStores()
>          req->buildPackets();
>
>          DPRINTF(LSQUnit, "D-Cache: Writing back store idx:%i PC:%s "
> -                "to Addr:%#x, data:%#x [sn:%lli]\n",
> +                "to Addr:%#x, data:%#x [sn:%lli] amoOp:%d\n",
>                  storeWBIt.idx(), inst->pcState(),
>                  req->request()->getPaddr(), (int)*(inst->memData),
> -                inst->seqNum);
> +                inst->seqNum, req->_amo_op != NULL);
> +
> +
> +        if(req->_amo_op != NULL)
> +            req->request()->setAtomicOpFunctor(req->_amo_op);
>
>          // @todo: Remove this SC hack once the memory system handles it.
>          if (inst->isStoreConditional()) {
>
> +++ b/src/mem/request.hh
> @@ -679,6 +679,12 @@ class Request
>          return atomicOpFunctor;
>      }
>
> +    void
> +    setAtomicOpFunctor(AtomicOpFunctor* atm)
> +    {
> +        atomicOpFunctor = atm;
> +    }
> +
>      /** Accessor for flags. */
>      Flags
>      getFlags()
>

Ideally I'd like to respond to the thread you've posted on the mailing list
but I don't know if I am able to do it.

Thanks,
Ataberk

On Thu, Jun 13, 2019 at 12:28 PM Hossein Golestani <hosse...@umich.edu>
wrote:

> Hi,
>
> I'm using gem5 for simulation of cross-compiled RISC-V programs.
>
> I receive the following error when using the DerivO3CPU model:
> gem5.opt: build/RISCV/mem/request.hh:678: AtomicOpFunctor*
> Request::getAtomicOpFunctor(): Assertion `atomicOpFunctor != NULL' failed.
>
> I have used this command:
> $GEM5/build/RISCV/gem5.opt --outdir=$OUTDIR \
>     $GEM5/configs/example/se.py \
>     --cpu-type=DerivO3CPU \
>     --l1d_size=64kB \
>     --l1i_size=16kB \
>     --l2_size=1MB \
>     --caches \
>     --l2cache \
>     --cmd=$BINARY --options="$OPTIONS"
>
> If I fast-forward the beginning instructions of the program, I will
> receive the exact same error at some point later.
>
> Note that I have no issues with simulating this program with the
> TimingSimpleCPU model.
>
> I found this email (link
> <https://www.mail-archive.com/gem5-users@gem5.org/msg15572.html>) in the
> gem5 user emails archive, which says the O3 CPU model may have not been
> tested with RISC-V. However I'd really appreciate any help to get around
> this issue. I have started to work with gem5 for a few weeks, but I'm
> willing to modify its code if necessary.
>
> Thanks,
> Hossein
>
>
>
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to