Skip to content

simx: srai instruction yields incorrect results #319

@cassuto

Description

@cassuto

Environment Setup

vortex: 31e4765

Bug Description

We noticed that the srai instruction in simx is incorrectly decoded as srli, leading to wrong execution results:

Below is our regression test. Please place it in the tests/regression/ directory.
Then execute: ./ci/blackbox.sh --cores=2 --app=arith --driver=simx
We obtain:

verify result
*** error: [0] expected=ffffffffffffc705, actual=1c705
*** error: [1] expected=fffffffffffffeb7, actual=1feb7
*** error: [2] expected=ffffffffffff2d7c, actual=12d7c
*** error: [3] expected=ffffffffffffada8, actual=1ada8
*** error: [4] expected=ffffffffffffc8ee, actual=1c8ee
*** error: [5] expected=ffffffffffff3fb5, actual=13fb5
*** error: [6] expected=ffffffffffff9078, actual=19078
*** error: [7] expected=ffffffffffff0df1, actual=10df1
*** error: [8] expected=ffffffffffffb5a8, actual=1b5a8
*** error: [9] expected=ffffffffffff2328, actual=12328
*** error: [10] expected=ffffffffffff1782, actual=11782
*** error: [11] expected=fffffffffffff102, actual=1f102
*** error: [12] expected=fffffffffffff2b9, actual=1f2b9
*** error: [13] expected=ffffffffffff71b0, actual=171b0
*** error: [14] expected=ffffffffffff3e0d, actual=13e0d
*** error: [15] expected=ffffffffffffae4f, actual=1ae4f
*** error: [16] expected=fffffffffffff902, actual=1f902
*** error: [17] expected=ffffffffffff53d2, actual=153d2
*** error: [18] expected=ffffffffffffc86a, actual=1c86a
*** error: [19] expected=ffffffffffff8870, actual=18870
*** error: [20] expected=ffffffffffff4abd, actual=14abd
*** error: [21] expected=fffffffffffffa94, actual=1fa94
*** error: [22] expected=ffffffffffff1787, actual=11787
*** error: [23] expected=ffffffffffff80ee, actual=180ee
*** error: [24] expected=ffffffffffff6e7c, actual=16e7c
*** error: [25] expected=ffffffffffffd535, actual=1d535
*** error: [26] expected=ffffffffffffba7a, actual=1ba7a
*** error: [27] expected=ffffffffffff0dd0, actual=10dd0
*** error: [28] expected=ffffffffffff35bb, actual=135bb
*** error: [29] expected=ffffffffffff1f26, actual=11f26
*** error: [30] expected=ffffffffffffcb48, actual=1cb48
*** error: [31] expected=ffffffffffff78da, actual=178da
*** error: [32] expected=ffffffffffff7a7d, actual=17a7d
*** error: [33] expected=ffffffffffffeaca, actual=1eaca
*** error: [34] expected=ffffffffffffce28, actual=1ce28
*** error: [35] expected=ffffffffffffd441, actual=1d441
*** error: [36] expected=ffffffffffff3b5f, actual=13b5f
*** error: [37] expected=fffffffffffff41c, actual=1f41c
*** error: [38] expected=ffffffffffffd75c, actual=1d75c
*** error: [39] expected=ffffffffffff2017, actual=12017
*** error: [40] expected=ffffffffffff1920, actual=11920
*** error: [41] expected=ffffffffffffcbd7, actual=1cbd7
*** error: [42] expected=ffffffffffffbb85, actual=1bb85
*** error: [43] expected=ffffffffffff80ce, actual=180ce
*** error: [44] expected=ffffffffffff5927, actual=15927
*** error: [45] expected=ffffffffffff6508, actual=16508
*** error: [46] expected=ffffffffffff6d6c, actual=16d6c
*** error: [47] expected=ffffffffffffe8ba, actual=1e8ba
*** error: [48] expected=ffffffffffffaa90, actual=1aa90
*** error: [49] expected=ffffffffffff2ad2, actual=12ad2
*** error: [50] expected=ffffffffffff46be, actual=146be
*** error: [51] expected=ffffffffffff919e, actual=1919e
*** error: [52] expected=ffffffffffffcdea, actual=1cdea
*** error: [53] expected=ffffffffffffd505, actual=1d505
*** error: [54] expected=fffffffffffffac5, actual=1fac5
*** error: [55] expected=ffffffffffffeb1f, actual=1eb1f
*** error: [56] expected=ffffffffffffea69, actual=1ea69
*** error: [57] expected=ffffffffffffe781, actual=1e781
*** error: [58] expected=ffffffffffff909d, actual=1909d
*** error: [59] expected=ffffffffffff972e, actual=1972e
*** error: [60] expected=ffffffffffff0846, actual=10846
*** error: [61] expected=ffffffffffff0e33, actual=10e33
*** error: [62] expected=ffffffffffffda1a, actual=1da1a
*** error: [63] expected=ffffffffffff5d9c, actual=15d9c
cleanup
PERF: core0: instrs=5133, cycles=21110, IPC=0.243155
PERF: core1: instrs=5133, cycles=21109, IPC=0.243166
PERF: instrs=10266, cycles=21110, IPC=0.486310
Found 64 errors!
FAILED!
make: *** [../common.mk:102: run-simx] Error 1
make: Leaving directory '/home/ain/vortex-poc/vortex/build/tests/regression/arith'

Further cross-validation with rtlsim:
./ci/blackbox.sh --cores=2 --app=arith
We obtain:

verify result
cleanup
PERF: core0: instrs=5134, cycles=19652, IPC=0.261246
PERF: core1: instrs=5134, cycles=19575, IPC=0.262273
PERF: instrs=10268, cycles=19652, IPC=0.522491
PASSED!

Patch

We found that the root cause is that when the immediate value of srai is greater than 32, it occupies the lower bits of funct7. The following decoding logic in decode.cpp, which uses ==, is incorrect:

  case 5: { // RV32I: SRA/SRL
    instr->setOpType((funct7 == 0x20) ? AluType::SRA : AluType::SRL);
    break;
  }

The patch is as follows:
#320

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions